From 201b4dfcfe1b645f34d65f5a87e7d5a095411431 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Tue, 2 May 2023 10:33:47 -0700 Subject: [PATCH 001/169] feat: halstead printer --- slither/printers/all_printers.py | 1 + slither/printers/summary/halstead.py | 166 +++++++++++++++++++++++++++ slither/utils/myprettytable.py | 39 +++++++ 3 files changed, 206 insertions(+) create mode 100644 slither/printers/summary/halstead.py diff --git a/slither/printers/all_printers.py b/slither/printers/all_printers.py index 6dc8dddbdd..1202794039 100644 --- a/slither/printers/all_printers.py +++ b/slither/printers/all_printers.py @@ -8,6 +8,7 @@ from .summary.slithir import PrinterSlithIR from .summary.slithir_ssa import PrinterSlithIRSSA from .summary.human_summary import PrinterHumanSummary +from .summary.halstead import Halstead from .functions.cfg import CFG from .summary.function_ids import FunctionIds from .summary.variable_order import VariableOrder diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py new file mode 100644 index 0000000000..b50575ab63 --- /dev/null +++ b/slither/printers/summary/halstead.py @@ -0,0 +1,166 @@ +""" + Halstead complexity metrics + https://en.wikipedia.org/wiki/Halstead_complexity_measures + + 12 metrics based on the number of unique operators and operands: + + Core metrics: + n1 = the number of distinct operators + n2 = the number of distinct operands + N1 = the total number of operators + N2 = the total number of operands + + Extended metrics: + n = n1 + n2 # Program vocabulary + N = N1 + N2 # Program length + S = n1 * log2(n1) + n2 * log2(n2) # Estimated program length + V = N * log2(n) # Volume + D = (n1 / 2) * (N2 / n2) # Difficulty + E = D * V # Effort + T = E / 18 seconds # Time required to program + B = (E^(2/3)) / 3000 # Number of delivered bugs + + +""" +import math +from collections import OrderedDict +from slither.printers.abstract_printer import AbstractPrinter +from slither.slithir.variables.temporary import TemporaryVariable +from slither.utils.myprettytable import make_pretty_table + + +def compute_halstead(contracts: list) -> tuple: + """Used to compute the Halstead complexity metrics for a list of contracts. + Args: + contracts: list of contracts. + Returns: + Halstead metrics as a tuple of two OrderedDicts (core_metrics, extended_metrics) + which each contain one key per contract. The value of each key is a dict of metrics. + + In addition to one key per contract, there is a key for "ALL CONTRACTS" that contains + the metrics for ALL CONTRACTS combined. (Not the sums of the individual contracts!) + + core_metrics: + {"contract1 name": { + "n1_unique_operators": n1, + "n2_unique_operands": n1, + "N1_total_operators": N1, + "N2_total_operands": N2, + }} + + extended_metrics: + {"contract1 name": { + "n_vocabulary": n1 + n2, + "N_prog_length": N1 + N2, + "S_est_length": S, + "V_volume": V, + "D_difficulty": D, + "E_effort": E, + "T_time": T, + "B_bugs": B, + }} + + """ + core = OrderedDict() + extended = OrderedDict() + all_operators = [] + all_operands = [] + for contract in contracts: + operators = [] + operands = [] + for func in contract.functions: + for node in func.nodes: + for operation in node.irs: + # use operation.expression.type to get the unique operator type + operator_type = operation.expression.type + operators.append(operator_type) + all_operators.append(operator_type) + + # use operation.used to get the operands of the operation ignoring the temporary variables + new_operands = [ + op for op in operation.used if not isinstance(op, TemporaryVariable) + ] + operands.extend(new_operands) + all_operands.extend(new_operands) + (core[contract.name], extended[contract.name]) = _calculate_metrics(operators, operands) + core["ALL CONTRACTS"] = OrderedDict() + extended["ALL CONTRACTS"] = OrderedDict() + (core["ALL CONTRACTS"], extended["ALL CONTRACTS"]) = _calculate_metrics( + all_operators, all_operands + ) + return (core, extended) + + +# pylint: disable=too-many-locals +def _calculate_metrics(operators, operands): + """Used to compute the Halstead complexity metrics for a list of operators and operands. + Args: + operators: list of operators. + operands: list of operands. + Returns: + Halstead metrics as a tuple of two OrderedDicts (core_metrics, extended_metrics) + which each contain one key per contract. The value of each key is a dict of metrics. + NOTE: The metric values are ints and floats that have been converted to formatted strings + """ + n1 = len(set(operators)) + n2 = len(set(operands)) + N1 = len(operators) + N2 = len(operands) + n = n1 + n2 + N = N1 + N2 + S = 0 if (n1 == 0 or n2 == 0) else n1 * math.log2(n1) + n2 * math.log2(n2) + V = N * math.log2(n) if n > 0 else 0 + D = (n1 / 2) * (N2 / n2) if n2 > 0 else 0 + E = D * V + T = E / 18 + B = (E ** (2 / 3)) / 3000 + core_metrics = { + "n1_unique_operators": n1, + "n2_unique_operands": n2, + "N1_total_operators": N1, + "N2_total_operands": N2, + } + extended_metrics = { + "n_vocabulary": str(n1 + n2), + "N_prog_length": str(N1 + N2), + "S_est_length": f"{S:.0f}", + "V_volume": f"{V:.0f}", + "D_difficulty": f"{D:.0f}", + "E_effort": f"{E:.0f}", + "T_time": f"{T:.0f}", + "B_bugs": f"{B:.3f}", + } + return (core_metrics, extended_metrics) + + +class Halstead(AbstractPrinter): + ARGUMENT = "halstead" + HELP = "Computes the Halstead complexity metrics for each contract" + + WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#halstead" + + def output(self, _filename): + if len(self.contracts) == 0: + return self.generate_output("No contract found") + + core, extended = compute_halstead(self.contracts) + + # Core metrics: operations and operands + txt = "\n\nHalstead complexity core metrics:\n" + keys = list(core[self.contracts[0].name].keys()) + table1 = make_pretty_table(["Contract", *keys], core, False) + txt += str(table1) + "\n" + + # Extended metrics: volume, difficulty, effort, time, bugs + # TODO: should we break this into 2 tables? currently 119 chars wide + txt += "\nHalstead complexity extended metrics:\n" + keys = list(extended[self.contracts[0].name].keys()) + table2 = make_pretty_table(["Contract", *keys], extended, False) + txt += str(table2) + "\n" + + res = self.generate_output(txt) + res.add_pretty_table(table1, "Halstead core metrics") + res.add_pretty_table(table2, "Halstead extended metrics") + self.info(txt) + + return res diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index af10a6ff25..efdb965048 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -22,3 +22,42 @@ def to_json(self) -> Dict: def __str__(self) -> str: return str(self.to_pretty_table()) + + +# **Dict to MyPrettyTable utility functions** + + +# Converts a dict to a MyPrettyTable. Dict keys are the row headers. +# @param headers str[] of column names +# @param body dict of row headers with a dict of the values +# @param totals bool optional add Totals row +def make_pretty_table(headers: list, body: dict, totals: bool = False) -> MyPrettyTable: + table = MyPrettyTable(headers) + for row in body: + table_row = [row] + [body[row][key] for key in headers[1:]] + table.add_row(table_row) + if totals: + table.add_row(["Total"] + [sum([body[row][key] for row in body]) for key in headers[1:]]) + return table + + +# takes a dict of dicts and returns a dict of dicts with the keys transposed +# example: +# in: +# { +# "dep": {"loc": 0, "sloc": 0, "cloc": 0}, +# "test": {"loc": 0, "sloc": 0, "cloc": 0}, +# "src": {"loc": 0, "sloc": 0, "cloc": 0}, +# } +# out: +# { +# 'loc': {'dep': 0, 'test': 0, 'src': 0}, +# 'sloc': {'dep': 0, 'test': 0, 'src': 0}, +# 'cloc': {'dep': 0, 'test': 0, 'src': 0}, +# } +def transpose(table): + any_key = list(table.keys())[0] + return { + inner_key: {outer_key: table[outer_key][inner_key] for outer_key in table} + for inner_key in table[any_key] + } From 7eb270adeffffe08a3eb496ff62a298e7b5ccf8d Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 4 May 2023 12:53:54 -0700 Subject: [PATCH 002/169] feat: halstead printer --- slither/printers/summary/halstead.py | 103 ++++++++++++++++----------- slither/utils/upgradeability.py | 57 +++++++++++++++ 2 files changed, 120 insertions(+), 40 deletions(-) diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py index b50575ab63..12e422fb08 100644 --- a/slither/printers/summary/halstead.py +++ b/slither/printers/summary/halstead.py @@ -10,11 +10,13 @@ N1 = the total number of operators N2 = the total number of operands - Extended metrics: + Extended metrics1: n = n1 + n2 # Program vocabulary N = N1 + N2 # Program length S = n1 * log2(n1) + n2 * log2(n2) # Estimated program length V = N * log2(n) # Volume + + Extended metrics2: D = (n1 / 2) * (N2 / n2) # Difficulty E = D * V # Effort T = E / 18 seconds # Time required to program @@ -27,6 +29,7 @@ from slither.printers.abstract_printer import AbstractPrinter from slither.slithir.variables.temporary import TemporaryVariable from slither.utils.myprettytable import make_pretty_table +from slither.utils.upgradeability import encode_ir_for_halstead def compute_halstead(contracts: list) -> tuple: @@ -42,18 +45,21 @@ def compute_halstead(contracts: list) -> tuple: core_metrics: {"contract1 name": { - "n1_unique_operators": n1, - "n2_unique_operands": n1, "N1_total_operators": N1, + "n1_unique_operators": n1, "N2_total_operands": N2, + "n2_unique_operands": n1, }} - extended_metrics: + extended_metrics1: {"contract1 name": { "n_vocabulary": n1 + n2, "N_prog_length": N1 + N2, "S_est_length": S, "V_volume": V, + }} + extended_metrics2: + {"contract1 name": { "D_difficulty": D, "E_effort": E, "T_time": T, @@ -62,7 +68,8 @@ def compute_halstead(contracts: list) -> tuple: """ core = OrderedDict() - extended = OrderedDict() + extended1 = OrderedDict() + extended2 = OrderedDict() all_operators = [] all_operands = [] for contract in contracts: @@ -72,9 +79,9 @@ def compute_halstead(contracts: list) -> tuple: for node in func.nodes: for operation in node.irs: # use operation.expression.type to get the unique operator type - operator_type = operation.expression.type - operators.append(operator_type) - all_operators.append(operator_type) + encoded_operator = encode_ir_for_halstead(operation) + operators.append(encoded_operator) + all_operators.append(encoded_operator) # use operation.used to get the operands of the operation ignoring the temporary variables new_operands = [ @@ -82,13 +89,21 @@ def compute_halstead(contracts: list) -> tuple: ] operands.extend(new_operands) all_operands.extend(new_operands) - (core[contract.name], extended[contract.name]) = _calculate_metrics(operators, operands) - core["ALL CONTRACTS"] = OrderedDict() - extended["ALL CONTRACTS"] = OrderedDict() - (core["ALL CONTRACTS"], extended["ALL CONTRACTS"]) = _calculate_metrics( - all_operators, all_operands - ) - return (core, extended) + ( + core[contract.name], + extended1[contract.name], + extended2[contract.name], + ) = _calculate_metrics(operators, operands) + if len(contracts) > 1: + core["ALL CONTRACTS"] = OrderedDict() + extended1["ALL CONTRACTS"] = OrderedDict() + extended2["ALL CONTRACTS"] = OrderedDict() + ( + core["ALL CONTRACTS"], + extended1["ALL CONTRACTS"], + extended2["ALL CONTRACTS"], + ) = _calculate_metrics(all_operators, all_operands) + return (core, extended1, extended2) # pylint: disable=too-many-locals @@ -115,22 +130,24 @@ def _calculate_metrics(operators, operands): T = E / 18 B = (E ** (2 / 3)) / 3000 core_metrics = { - "n1_unique_operators": n1, - "n2_unique_operands": n2, - "N1_total_operators": N1, - "N2_total_operands": N2, + "Total Operators": N1, + "Unique Operators": n1, + "Total Operands": N2, + "Unique Operands": n2, } - extended_metrics = { - "n_vocabulary": str(n1 + n2), - "N_prog_length": str(N1 + N2), - "S_est_length": f"{S:.0f}", - "V_volume": f"{V:.0f}", - "D_difficulty": f"{D:.0f}", - "E_effort": f"{E:.0f}", - "T_time": f"{T:.0f}", - "B_bugs": f"{B:.3f}", + extended_metrics1 = { + "Vocabulary": str(n1 + n2), + "Program Length": str(N1 + N2), + "Estimated Length": f"{S:.0f}", + "Volume": f"{V:.0f}", } - return (core_metrics, extended_metrics) + extended_metrics2 = { + "Difficulty": f"{D:.0f}", + "Effort": f"{E:.0f}", + "Time": f"{T:.0f}", + "Estimated Bugs": f"{B:.3f}", + } + return (core_metrics, extended_metrics1, extended_metrics2) class Halstead(AbstractPrinter): @@ -143,24 +160,30 @@ def output(self, _filename): if len(self.contracts) == 0: return self.generate_output("No contract found") - core, extended = compute_halstead(self.contracts) + core, extended1, extended2 = compute_halstead(self.contracts) # Core metrics: operations and operands txt = "\n\nHalstead complexity core metrics:\n" keys = list(core[self.contracts[0].name].keys()) - table1 = make_pretty_table(["Contract", *keys], core, False) - txt += str(table1) + "\n" + table_core = make_pretty_table(["Contract", *keys], core, False) + txt += str(table_core) + "\n" + + # Extended metrics1: vocabulary, program length, estimated length, volume + txt += "\nHalstead complexity extended metrics1:\n" + keys = list(extended1[self.contracts[0].name].keys()) + table_extended1 = make_pretty_table(["Contract", *keys], extended1, False) + txt += str(table_extended1) + "\n" - # Extended metrics: volume, difficulty, effort, time, bugs - # TODO: should we break this into 2 tables? currently 119 chars wide - txt += "\nHalstead complexity extended metrics:\n" - keys = list(extended[self.contracts[0].name].keys()) - table2 = make_pretty_table(["Contract", *keys], extended, False) - txt += str(table2) + "\n" + # Extended metrics2: difficulty, effort, time, bugs + txt += "\nHalstead complexity extended metrics2:\n" + keys = list(extended2[self.contracts[0].name].keys()) + table_extended2 = make_pretty_table(["Contract", *keys], extended2, False) + txt += str(table_extended2) + "\n" res = self.generate_output(txt) - res.add_pretty_table(table1, "Halstead core metrics") - res.add_pretty_table(table2, "Halstead extended metrics") + res.add_pretty_table(table_core, "Halstead core metrics") + res.add_pretty_table(table_extended1, "Halstead extended metrics1") + res.add_pretty_table(table_extended2, "Halstead extended metrics2") self.info(txt) return res diff --git a/slither/utils/upgradeability.py b/slither/utils/upgradeability.py index 7b4e8493a7..910ba6f087 100644 --- a/slither/utils/upgradeability.py +++ b/slither/utils/upgradeability.py @@ -325,6 +325,63 @@ def encode_ir_for_compare(ir: Operation) -> str: return "" +# pylint: disable=too-many-branches +def encode_ir_for_halstead(ir: Operation) -> str: + # operations + if isinstance(ir, Assignment): + return "assignment" + if isinstance(ir, Index): + return "index" + if isinstance(ir, Member): + return "member" # .format(ntype(ir._type)) + if isinstance(ir, Length): + return "length" + if isinstance(ir, Binary): + return f"binary({str(ir.type)})" + if isinstance(ir, Unary): + return f"unary({str(ir.type)})" + if isinstance(ir, Condition): + return f"condition({encode_var_for_compare(ir.value)})" + if isinstance(ir, NewStructure): + return "new_structure" + if isinstance(ir, NewContract): + return "new_contract" + if isinstance(ir, NewArray): + return f"new_array({ntype(ir.array_type)})" + if isinstance(ir, NewElementaryType): + return f"new_elementary({ntype(ir.type)})" + if isinstance(ir, Delete): + return "delete" + if isinstance(ir, SolidityCall): + return f"solidity_call({ir.function.full_name})" + if isinstance(ir, InternalCall): + return f"internal_call({ntype(ir.type_call)})" + if isinstance(ir, EventCall): # is this useful? + return "event" + if isinstance(ir, LibraryCall): + return "library_call" + if isinstance(ir, InternalDynamicCall): + return "internal_dynamic_call" + if isinstance(ir, HighLevelCall): # TODO: improve + return "high_level_call" + if isinstance(ir, LowLevelCall): # TODO: improve + return "low_level_call" + if isinstance(ir, TypeConversion): + return f"type_conversion({ntype(ir.type)})" + if isinstance(ir, Return): # this can be improved using values + return "return" # .format(ntype(ir.type)) + if isinstance(ir, Transfer): + return "transfer" + if isinstance(ir, Send): + return "send" + if isinstance(ir, Unpack): # TODO: improve + return "unpack" + if isinstance(ir, InitArray): # TODO: improve + return "init_array" + # default + raise NotImplementedError(f"encode_ir_for_halstead: {ir}") + + # pylint: disable=too-many-branches def encode_var_for_compare(var: Variable) -> str: From 34a343e36c5005ac4f7cc2dfc0a5f4d66ff96121 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 5 May 2023 13:42:04 -0700 Subject: [PATCH 003/169] feat: ck printer --- slither/printers/all_printers.py | 1 + slither/printers/summary/ck.py | 266 +++++++++++++++++++++++++++++++ slither/utils/myprettytable.py | 80 +++++++++- 3 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 slither/printers/summary/ck.py diff --git a/slither/printers/all_printers.py b/slither/printers/all_printers.py index 6dc8dddbdd..4e66351f85 100644 --- a/slither/printers/all_printers.py +++ b/slither/printers/all_printers.py @@ -8,6 +8,7 @@ from .summary.slithir import PrinterSlithIR from .summary.slithir_ssa import PrinterSlithIRSSA from .summary.human_summary import PrinterHumanSummary +from .summary.ck import CKMetrics from .functions.cfg import CFG from .summary.function_ids import FunctionIds from .summary.variable_order import VariableOrder diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py new file mode 100644 index 0000000000..d896015b24 --- /dev/null +++ b/slither/printers/summary/ck.py @@ -0,0 +1,266 @@ +""" + + # TODO: Add in other CK metrics (NOC, DIT) + # TODO: Don't display all the general function metrics, but add those to complexity-dashboard + CK Metrics are a suite of six software metrics proposed by Chidamber and Kemerer in 1994. + These metrics are used to measure the complexity of a class. + https://en.wikipedia.org/wiki/Programming_complexity + + - Response For a Class (RFC) is a metric that measures the number of unique method calls within a class. + - Number of Children (NOC) is a metric that measures the number of children a class has. + - Depth of Inheritance Tree (DIT) is a metric that measures the number of parent classes a class has. + + Not implemented: + - Lack of Cohesion of Methods (LCOM) is a metric that measures the lack of cohesion in methods. + - Weighted Methods per Class (WMC) is a metric that measures the complexity of a class. + - Coupling Between Object Classes (CBO) is a metric that measures the number of classes a class is coupled to. + +""" +from typing import Tuple +from slither.printers.abstract_printer import AbstractPrinter +from slither.utils.myprettytable import make_pretty_table +from slither.slithir.operations.high_level_call import HighLevelCall +from slither.utils.colors import bold + + +def compute_dit(contract, depth=0): + """ + Recursively compute the depth of inheritance tree (DIT) of a contract + Args: + contract: Contract - the contract to compute the DIT for + depth: int - the depth of the contract in the inheritance tree + Returns: + the depth of the contract in the inheritance tree + """ + if not contract.inheritance: + return depth + max_dit = depth + for inherited_contract in contract.inheritance: + dit = compute_dit(inherited_contract, depth + 1) + max_dit = max(max_dit, dit) + return max_dit + + +# pylint: disable=too-many-locals +def compute_metrics(contracts): + """ + Compute CK metrics of a contract + Args: + contracts(list): list of contracts + Returns: + a tuple of (metrics1, metrics2, metrics3, metrics4, metrics5) + # Visbility + metrics1["contract name"] = { + "State variables":int, + "Constants":int, + "Immutables":int, + } + metrics2["contract name"] = { + "Public": int, + "External":int, + "Internal":int, + "Private":int, + } + # Mutability + metrics3["contract name"] = { + "Mutating":int, + "View":int, + "Pure":int, + } + # External facing, mutating: total / no auth / no modifiers + metrics4["contract name"] = { + "External mutating":int, + "No auth or onlyOwner":int, + "No modifiers":int, + } + metrics5["contract name"] = { + "Ext calls":int, + "Response For a Class":int, + "NOC":int, + "DIT":int, + } + + RFC is counted as follows: + +1 for each public or external fn + +1 for each public getter + +1 for each UNIQUE external call + + """ + metrics1 = {} + metrics2 = {} + metrics3 = {} + metrics4 = {} + metrics5 = {} + dependents = { + inherited.name: { + contract.name for contract in contracts if inherited.name in contract.inheritance + } + for inherited in contracts + } + + for c in contracts: + (state_variables, constants, immutables, public_getters) = count_variables(c) + rfc = public_getters # add 1 for each public getter + metrics1[c.name] = { + "State variables": state_variables, + "Constants": constants, + "Immutables": immutables, + } + metrics2[c.name] = { + "Public": 0, + "External": 0, + "Internal": 0, + "Private": 0, + } + metrics3[c.name] = { + "Mutating": 0, + "View": 0, + "Pure": 0, + } + metrics4[c.name] = { + "External mutating": 0, + "No auth or onlyOwner": 0, + "No modifiers": 0, + } + metrics5[c.name] = { + "Ext calls": 0, + "RFC": 0, + "NOC": len(dependents[c.name]), + "DIT": compute_dit(c), + } + for func in c.functions: + if func.name == "constructor": + continue + pure = func.pure + view = not pure and func.view + mutating = not pure and not view + external = func.visibility == "external" + public = func.visibility == "public" + internal = func.visibility == "internal" + private = func.visibility == "private" + external_public_mutating = external or public and mutating + external_no_auth = external_public_mutating and no_auth(func) + external_no_modifiers = external_public_mutating and len(func.modifiers) == 0 + if external or public: + rfc += 1 + + high_level_calls = [ + ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) + ] + + # convert irs to string with target function and contract name + external_calls = [] + for h in high_level_calls: + if hasattr(h.destination, "name"): + external_calls.append(f"{h.function_name}{h.destination.name}") + else: + external_calls.append(f"{h.function_name}{h.destination.type.type.name}") + + rfc += len(set(external_calls)) + + metrics2[c.name]["Public"] += 1 if public else 0 + metrics2[c.name]["External"] += 1 if external else 0 + metrics2[c.name]["Internal"] += 1 if internal else 0 + metrics2[c.name]["Private"] += 1 if private else 0 + + metrics3[c.name]["Mutating"] += 1 if mutating else 0 + metrics3[c.name]["View"] += 1 if view else 0 + metrics3[c.name]["Pure"] += 1 if pure else 0 + + metrics4[c.name]["External mutating"] += 1 if external_public_mutating else 0 + metrics4[c.name]["No auth or onlyOwner"] += 1 if external_no_auth else 0 + metrics4[c.name]["No modifiers"] += 1 if external_no_modifiers else 0 + + metrics5[c.name]["Ext calls"] += len(external_calls) + metrics5[c.name]["RFC"] = rfc + + return metrics1, metrics2, metrics3, metrics4, metrics5 + + +def count_variables(contract) -> Tuple[int, int, int, int]: + """Count the number of variables in a contract + Args: + contract(core.declarations.contract.Contract): contract to count variables + Returns: + Tuple of (state_variable_count, constant_count, immutable_count, public_getter) + """ + state_variable_count = 0 + constant_count = 0 + immutable_count = 0 + public_getter = 0 + for var in contract.variables: + if var.is_constant: + constant_count += 1 + elif var.is_immutable: + immutable_count += 1 + else: + state_variable_count += 1 + if var.visibility == "Public": + public_getter += 1 + return (state_variable_count, constant_count, immutable_count, public_getter) + + +def no_auth(func) -> bool: + """ + Check if a function has no auth or only_owner modifiers + Args: + func(core.declarations.function.Function): function to check + Returns: + bool + """ + for modifier in func.modifiers: + if "auth" in modifier.name or "only_owner" in modifier.name: + return False + return True + + +class CKMetrics(AbstractPrinter): + ARGUMENT = "ck" + HELP = "Computes the CK complexity metrics for each contract" + + WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#ck" + + def output(self, _filename): + if len(self.contracts) == 0: + return self.generate_output("No contract found") + metrics1, metrics2, metrics3, metrics4, metrics5 = compute_metrics(self.contracts) + txt = bold("\nCK complexity metrics\n") + # metrics2: variable counts + txt += bold("\nVariables\n") + keys = list(metrics1[self.contracts[0].name].keys()) + table0 = make_pretty_table(["Contract", *keys], metrics1, True) + txt += str(table0) + "\n" + + # metrics3: function visibility + txt += bold("\nFunction visibility\n") + keys = list(metrics2[self.contracts[0].name].keys()) + table1 = make_pretty_table(["Contract", *keys], metrics2, True) + txt += str(table1) + "\n" + + # metrics4: function mutability counts + txt += bold("\nFunction mutatability\n") + keys = list(metrics3[self.contracts[0].name].keys()) + table2 = make_pretty_table(["Contract", *keys], metrics3, True) + txt += str(table2) + "\n" + + # metrics5: external facing mutating functions + txt += bold("\nExternal/Public functions with modifiers\n") + keys = list(metrics4[self.contracts[0].name].keys()) + table3 = make_pretty_table(["Contract", *keys], metrics4, True) + txt += str(table3) + "\n" + + # metrics5: ext calls and rfc + txt += bold("\nExt calls and RFC\n") + keys = list(metrics5[self.contracts[0].name].keys()) + table4 = make_pretty_table(["Contract", *keys], metrics5, False) + txt += str(table4) + "\n" + + res = self.generate_output(txt) + res.add_pretty_table(table0, "CK complexity core metrics 1/5") + res.add_pretty_table(table1, "CK complexity core metrics 2/5") + res.add_pretty_table(table2, "CK complexity core metrics 3/5") + res.add_pretty_table(table3, "CK complexity core metrics 4/5") + res.add_pretty_table(table4, "CK complexity core metrics 5/5") + self.info(txt) + + return res diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index af10a6ff25..379d6699de 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -4,9 +4,17 @@ class MyPrettyTable: - def __init__(self, field_names: List[str]): + def __init__(self, field_names: List[str], pretty_align: bool = True): # TODO: True by default? self._field_names = field_names self._rows: List = [] + self._options: Dict = {} + if pretty_align: + self._options["set_alignment"] = [] + self._options["set_alignment"] += [(field_names[0], "l")] + for field_name in field_names[1:]: + self._options["set_alignment"] += [(field_name, "r")] + else: + self._options["set_alignment"] = [] def add_row(self, row: List[Union[str, List[str]]]) -> None: self._rows.append(row) @@ -15,6 +23,9 @@ def to_pretty_table(self) -> PrettyTable: table = PrettyTable(self._field_names) for row in self._rows: table.add_row(row) + if len(self._options["set_alignment"]): + for column_header, value in self._options["set_alignment"]: + table.align[column_header] = value return table def to_json(self) -> Dict: @@ -22,3 +33,70 @@ def to_json(self) -> Dict: def __str__(self) -> str: return str(self.to_pretty_table()) + + +# **Dict to MyPrettyTable utility functions** + + +def make_pretty_table( + headers: list, body: dict, totals: bool = False, total_header="TOTAL" +) -> MyPrettyTable: + """ + Converts a dict to a MyPrettyTable. Dict keys are the row headers. + Args: + headers: str[] of column names + body: dict of row headers with a dict of the values + totals: bool optional add Totals row + total_header: str optional if totals is set to True this will override the default "TOTAL" header + Returns: + MyPrettyTable + """ + table = MyPrettyTable(headers) + for row in body: + table_row = [row] + [body[row][key] for key in headers[1:]] + table.add_row(table_row) + if totals: + table.add_row( + [total_header] + [sum([body[row][key] for row in body]) for key in headers[1:]] + ) + return table + + +def make_pretty_table_simple( + data: dict, first_column_header, second_column_header="" +) -> MyPrettyTable: + """ + Converts a dict to a MyPrettyTable. Dict keys are the row headers. + Args: + data: dict of row headers with a dict of the values + column_header: str of column name for 1st column + Returns: + MyPrettyTable + """ + + table = MyPrettyTable([first_column_header, second_column_header]) + for k, v in data.items(): + table.add_row([k] + [v]) + return table + + +# takes a dict of dicts and returns a dict of dicts with the keys transposed +# example: +# in: +# { +# "dep": {"loc": 0, "sloc": 0, "cloc": 0}, +# "test": {"loc": 0, "sloc": 0, "cloc": 0}, +# "src": {"loc": 0, "sloc": 0, "cloc": 0}, +# } +# out: +# { +# 'loc': {'dep': 0, 'test': 0, 'src': 0}, +# 'sloc': {'dep': 0, 'test': 0, 'src': 0}, +# 'cloc': {'dep': 0, 'test': 0, 'src': 0}, +# } +def transpose(table): + any_key = list(table.keys())[0] + return { + inner_key: {outer_key: table[outer_key][inner_key] for outer_key in table} + for inner_key in table[any_key] + } From 16b57263f47b1628d8bf4a4ca08ae9d674be9375 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Tue, 2 May 2023 09:54:51 -0700 Subject: [PATCH 004/169] feat: martin printer --- slither/printers/all_printers.py | 1 + slither/printers/summary/martin.py | 114 +++++++++++++++++++++++++++++ slither/utils/myprettytable.py | 39 ++++++++++ 3 files changed, 154 insertions(+) create mode 100644 slither/printers/summary/martin.py diff --git a/slither/printers/all_printers.py b/slither/printers/all_printers.py index 6dc8dddbdd..c836b98d28 100644 --- a/slither/printers/all_printers.py +++ b/slither/printers/all_printers.py @@ -20,3 +20,4 @@ from .summary.when_not_paused import PrinterWhenNotPaused from .summary.declaration import Declaration from .functions.dominator import Dominator +from .summary.martin import Martin diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py new file mode 100644 index 0000000000..1bb59c4ffe --- /dev/null +++ b/slither/printers/summary/martin.py @@ -0,0 +1,114 @@ +""" + Robert "Uncle Bob" Martin - Agile software metrics + https://en.wikipedia.org/wiki/Software_package_metrics + + Efferent Coupling (Ce): Number of contracts that the contract depends on + Afferent Coupling (Ca): Number of contracts that depend on a contract + Instability (I): Ratio of efferent coupling to total coupling (Ce / (Ce + Ca)) + Abstractness (A): Number of abstract contracts / total number of contracts + Distance from the Main Sequence (D): abs(A + I - 1) + +""" +from slither.printers.abstract_printer import AbstractPrinter +from slither.slithir.operations.high_level_call import HighLevelCall +from slither.utils.myprettytable import make_pretty_table + + +def count_abstracts(contracts): + """ + Count the number of abstract contracts + Args: + contracts(list): list of contracts + Returns: + a tuple of (abstract_contract_count, total_contract_count) + """ + abstract_contract_count = 0 + for c in contracts: + if not c.is_fully_implemented: + abstract_contract_count += 1 + return (abstract_contract_count, len(contracts)) + + +def compute_coupling(contracts: list, abstractness: float) -> dict: + """ + Used to compute the coupling between contracts external calls made to internal contracts + Args: + contracts: list of contracts + Returns: + dict of contract names with dicts of the coupling metrics: + { + "contract_name1": { + "Dependents": 0, + "Dependencies": 3 + "Instability": 1.0, + "Abstractness": 0.0, + "Distance from main sequence": 1.0, + }, + "contract_name2": { + "Dependents": 1, + "Dependencies": 0 + "Instability": 0.0, + "Abstractness": 1.0, + "Distance from main sequence": 0.0, + } + """ + dependencies = {} + for contract in contracts: + for func in contract.functions: + high_level_calls = [ + ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) + ] + # convert irs to string with target function and contract name + external_calls = [h.destination.type.type.name for h in high_level_calls] + dependencies[contract.name] = set(external_calls) + dependents = {} + for contract, deps in dependencies.items(): + for dep in deps: + if dep not in dependents: + dependents[dep] = set() + dependents[dep].add(contract) + + coupling_dict = {} + for contract in contracts: + ce = len(dependencies.get(contract.name, [])) + ca = len(dependents.get(contract.name, [])) + i = 0.0 + d = 0.0 + if ce + ca > 0: + i = float(ce / (ce + ca)) + d = float(abs(i - abstractness)) + coupling_dict[contract.name] = { + "Dependents": ca, + "Dependencies": ce, + "Instability": f"{i:.2f}", + "Distance from main sequence": f"{d:.2f}", + } + return coupling_dict + + +class Martin(AbstractPrinter): + ARGUMENT = "martin" + HELP = "Martin agile software metrics (Ca, Ce, I, A, D)" + + WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#martin" + + def output(self, _filename): + (abstract_contract_count, total_contract_count) = count_abstracts(self.contracts) + abstractness = float(abstract_contract_count / total_contract_count) + coupling_dict = compute_coupling(self.contracts, abstractness) + + table = make_pretty_table( + ["Contract", *list(coupling_dict[self.contracts[0].name].keys())], coupling_dict + ) + txt = "Martin agile software metrics\n" + txt += "Efferent Coupling (Ce) - Number of contracts that a contract depends on\n" + txt += "Afferent Coupling (Ca) - Number of contracts that depend on the contract\n" + txt += "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" + txt += "Abstractness (A) - Number of abstract contracts / total number of contracts\n" + txt += "Distance from the Main Sequence (D) - abs(A + I - 1)\n" + txt += "\n" + txt += f"Abstractness (overall): {round(abstractness, 2)}\n" + str(table) + self.info(txt) + res = self.generate_output(txt) + res.add_pretty_table(table, "Code Lines") + return res diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index af10a6ff25..efdb965048 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -22,3 +22,42 @@ def to_json(self) -> Dict: def __str__(self) -> str: return str(self.to_pretty_table()) + + +# **Dict to MyPrettyTable utility functions** + + +# Converts a dict to a MyPrettyTable. Dict keys are the row headers. +# @param headers str[] of column names +# @param body dict of row headers with a dict of the values +# @param totals bool optional add Totals row +def make_pretty_table(headers: list, body: dict, totals: bool = False) -> MyPrettyTable: + table = MyPrettyTable(headers) + for row in body: + table_row = [row] + [body[row][key] for key in headers[1:]] + table.add_row(table_row) + if totals: + table.add_row(["Total"] + [sum([body[row][key] for row in body]) for key in headers[1:]]) + return table + + +# takes a dict of dicts and returns a dict of dicts with the keys transposed +# example: +# in: +# { +# "dep": {"loc": 0, "sloc": 0, "cloc": 0}, +# "test": {"loc": 0, "sloc": 0, "cloc": 0}, +# "src": {"loc": 0, "sloc": 0, "cloc": 0}, +# } +# out: +# { +# 'loc': {'dep': 0, 'test': 0, 'src': 0}, +# 'sloc': {'dep': 0, 'test': 0, 'src': 0}, +# 'cloc': {'dep': 0, 'test': 0, 'src': 0}, +# } +def transpose(table): + any_key = list(table.keys())[0] + return { + inner_key: {outer_key: table[outer_key][inner_key] for outer_key in table} + for inner_key in table[any_key] + } From d682232b46df040fb799df56f3b51e5804d3af9d Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 11 May 2023 11:01:12 -0700 Subject: [PATCH 005/169] chore: add to scripts/ci_test_printers.sh --- scripts/ci_test_printers.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/ci_test_printers.sh b/scripts/ci_test_printers.sh index 61994b337d..7ed2b62026 100755 --- a/scripts/ci_test_printers.sh +++ b/scripts/ci_test_printers.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash -### Test printer +### Test printer cd tests/e2e/solc_parsing/test_data/compile/ || exit # Do not test the evm printer,as it needs a refactoring -ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,human-summary,inheritance,inheritance-graph,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" +ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" # Only test 0.5.17 to limit test time for file in *0.5.17-compact.zip; do From 314364eeb218d48c9fff6032dd2dd633fd4312f8 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 15 Jun 2023 14:13:25 -0700 Subject: [PATCH 006/169] chore: remove comments --- slither/printers/summary/ck.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py index d896015b24..6f604790f0 100644 --- a/slither/printers/summary/ck.py +++ b/slither/printers/summary/ck.py @@ -1,7 +1,4 @@ """ - - # TODO: Add in other CK metrics (NOC, DIT) - # TODO: Don't display all the general function metrics, but add those to complexity-dashboard CK Metrics are a suite of six software metrics proposed by Chidamber and Kemerer in 1994. These metrics are used to measure the complexity of a class. https://en.wikipedia.org/wiki/Programming_complexity From 975da91d333182b7a10d1be29993368073c1edb3 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 15 Jun 2023 14:20:18 -0700 Subject: [PATCH 007/169] chore: add type --- slither/printers/summary/martin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py index 1bb59c4ffe..b289a21f99 100644 --- a/slither/printers/summary/martin.py +++ b/slither/printers/summary/martin.py @@ -12,9 +12,9 @@ from slither.printers.abstract_printer import AbstractPrinter from slither.slithir.operations.high_level_call import HighLevelCall from slither.utils.myprettytable import make_pretty_table +from typing import Tuple - -def count_abstracts(contracts): +def count_abstracts(contracts) -> Tuple[int, int]: """ Count the number of abstract contracts Args: From 6f280c18b98c6ccee39f09a3f0b9381e0816ce5b Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 15 Jun 2023 14:36:19 -0700 Subject: [PATCH 008/169] chore: pylint --- slither/printers/summary/martin.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py index b289a21f99..693ec15759 100644 --- a/slither/printers/summary/martin.py +++ b/slither/printers/summary/martin.py @@ -9,10 +9,11 @@ Distance from the Main Sequence (D): abs(A + I - 1) """ -from slither.printers.abstract_printer import AbstractPrinter +from typing import Tuple from slither.slithir.operations.high_level_call import HighLevelCall from slither.utils.myprettytable import make_pretty_table -from typing import Tuple +from slither.printers.abstract_printer import AbstractPrinter + def count_abstracts(contracts) -> Tuple[int, int]: """ From 14c9761da2bb2c85ac08d12327ead1d4f77b2414 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 15 Jun 2023 15:26:29 -0700 Subject: [PATCH 009/169] feat: add CBO --- slither/printers/all_printers.py | 1 + slither/printers/summary/ck.py | 77 +++++++++++++++++++------------- slither/utils/myprettytable.py | 22 --------- 3 files changed, 46 insertions(+), 54 deletions(-) diff --git a/slither/printers/all_printers.py b/slither/printers/all_printers.py index 4e66351f85..7ac92327ef 100644 --- a/slither/printers/all_printers.py +++ b/slither/printers/all_printers.py @@ -21,3 +21,4 @@ from .summary.when_not_paused import PrinterWhenNotPaused from .summary.declaration import Declaration from .functions.dominator import Dominator +from .summary.martin import Martin diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py index 6f604790f0..77a8c420cf 100644 --- a/slither/printers/summary/ck.py +++ b/slither/printers/summary/ck.py @@ -6,18 +6,19 @@ - Response For a Class (RFC) is a metric that measures the number of unique method calls within a class. - Number of Children (NOC) is a metric that measures the number of children a class has. - Depth of Inheritance Tree (DIT) is a metric that measures the number of parent classes a class has. + - Coupling Between Object Classes (CBO) is a metric that measures the number of classes a class is coupled to. Not implemented: - Lack of Cohesion of Methods (LCOM) is a metric that measures the lack of cohesion in methods. - Weighted Methods per Class (WMC) is a metric that measures the complexity of a class. - - Coupling Between Object Classes (CBO) is a metric that measures the number of classes a class is coupled to. """ from typing import Tuple -from slither.printers.abstract_printer import AbstractPrinter +from slither.utils.colors import bold from slither.utils.myprettytable import make_pretty_table from slither.slithir.operations.high_level_call import HighLevelCall -from slither.utils.colors import bold +from slither.printers.abstract_printer import AbstractPrinter +from slither.printers.summary.martin import compute_coupling def compute_dit(contract, depth=0): @@ -95,37 +96,41 @@ def compute_metrics(contracts): for inherited in contracts } - for c in contracts: - (state_variables, constants, immutables, public_getters) = count_variables(c) + # We pass 0 for the 2nd arg (abstractness) because we only care about the coupling metrics (Ca and Ce) + coupling = compute_coupling(contracts, 0) + + for contract in contracts: + (state_variables, constants, immutables, public_getters) = count_variables(contract) rfc = public_getters # add 1 for each public getter - metrics1[c.name] = { + metrics1[contract.name] = { "State variables": state_variables, "Constants": constants, "Immutables": immutables, } - metrics2[c.name] = { + metrics2[contract.name] = { "Public": 0, "External": 0, "Internal": 0, "Private": 0, } - metrics3[c.name] = { + metrics3[contract.name] = { "Mutating": 0, "View": 0, "Pure": 0, } - metrics4[c.name] = { + metrics4[contract.name] = { "External mutating": 0, "No auth or onlyOwner": 0, "No modifiers": 0, } - metrics5[c.name] = { + metrics5[contract.name] = { "Ext calls": 0, "RFC": 0, - "NOC": len(dependents[c.name]), - "DIT": compute_dit(c), + "NOC": len(dependents[contract.name]), + "DIT": compute_dit(contract), + "CBO": coupling[contract.name]["Dependents"] + coupling[contract.name]["Dependencies"], } - for func in c.functions: + for func in contract.functions: if func.name == "constructor": continue pure = func.pure @@ -147,29 +152,33 @@ def compute_metrics(contracts): # convert irs to string with target function and contract name external_calls = [] - for h in high_level_calls: - if hasattr(h.destination, "name"): - external_calls.append(f"{h.function_name}{h.destination.name}") + for high_level_call in high_level_calls: + if hasattr(high_level_call.destination, "name"): + external_calls.append( + f"{high_level_call.function_name}{high_level_call.destination.name}" + ) else: - external_calls.append(f"{h.function_name}{h.destination.type.type.name}") + external_calls.append( + f"{high_level_call.function_name}{high_level_call.destination.type.type.name}" + ) rfc += len(set(external_calls)) - metrics2[c.name]["Public"] += 1 if public else 0 - metrics2[c.name]["External"] += 1 if external else 0 - metrics2[c.name]["Internal"] += 1 if internal else 0 - metrics2[c.name]["Private"] += 1 if private else 0 + metrics2[contract.name]["Public"] += 1 if public else 0 + metrics2[contract.name]["External"] += 1 if external else 0 + metrics2[contract.name]["Internal"] += 1 if internal else 0 + metrics2[contract.name]["Private"] += 1 if private else 0 - metrics3[c.name]["Mutating"] += 1 if mutating else 0 - metrics3[c.name]["View"] += 1 if view else 0 - metrics3[c.name]["Pure"] += 1 if pure else 0 + metrics3[contract.name]["Mutating"] += 1 if mutating else 0 + metrics3[contract.name]["View"] += 1 if view else 0 + metrics3[contract.name]["Pure"] += 1 if pure else 0 - metrics4[c.name]["External mutating"] += 1 if external_public_mutating else 0 - metrics4[c.name]["No auth or onlyOwner"] += 1 if external_no_auth else 0 - metrics4[c.name]["No modifiers"] += 1 if external_no_modifiers else 0 + metrics4[contract.name]["External mutating"] += 1 if external_public_mutating else 0 + metrics4[contract.name]["No auth or onlyOwner"] += 1 if external_no_auth else 0 + metrics4[contract.name]["No modifiers"] += 1 if external_no_modifiers else 0 - metrics5[c.name]["Ext calls"] += len(external_calls) - metrics5[c.name]["RFC"] = rfc + metrics5[contract.name]["Ext calls"] += len(external_calls) + metrics5[contract.name]["RFC"] = rfc return metrics1, metrics2, metrics3, metrics4, metrics5 @@ -213,7 +222,7 @@ def no_auth(func) -> bool: class CKMetrics(AbstractPrinter): ARGUMENT = "ck" - HELP = "Computes the CK complexity metrics for each contract" + HELP = "Chidamber and Kemerer (CK) complexity metrics and related function attributes" WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#ck" @@ -246,8 +255,12 @@ def output(self, _filename): table3 = make_pretty_table(["Contract", *keys], metrics4, True) txt += str(table3) + "\n" - # metrics5: ext calls and rfc - txt += bold("\nExt calls and RFC\n") + # metrics5: ext calls and ck metrics + txt += bold("\nExternal calls and CK Metrics:\n") + txt += bold("Response For a Class (RFC)\n") + txt += bold("Number of Children (NOC)\n") + txt += bold("Depth of Inheritance Tree (DIT)\n") + txt += bold("Coupling Between Object Classes (CBO)\n") keys = list(metrics5[self.contracts[0].name].keys()) table4 = make_pretty_table(["Contract", *keys], metrics5, False) txt += str(table4) + "\n" diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index 6edb67def2..8c5d1af332 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -78,25 +78,3 @@ def make_pretty_table_simple( for k, v in data.items(): table.add_row([k] + [v]) return table - - -# takes a dict of dicts and returns a dict of dicts with the keys transposed -# example: -# in: -# { -# "dep": {"loc": 0, "sloc": 0, "cloc": 0}, -# "test": {"loc": 0, "sloc": 0, "cloc": 0}, -# "src": {"loc": 0, "sloc": 0, "cloc": 0}, -# } -# out: -# { -# 'loc': {'dep': 0, 'test': 0, 'src': 0}, -# 'sloc': {'dep': 0, 'test': 0, 'src': 0}, -# 'cloc': {'dep': 0, 'test': 0, 'src': 0}, -# } -def transpose(table): - any_key = list(table.keys())[0] - return { - inner_key: {outer_key: table[outer_key][inner_key] for outer_key in table} - for inner_key in table[any_key] - } From fa22c3460eab1f0e25f77d3767e1ddc193b0df31 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 15 Jun 2023 15:57:21 -0700 Subject: [PATCH 010/169] chore: update label --- slither/printers/summary/ck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py index 77a8c420cf..a9f80b3544 100644 --- a/slither/printers/summary/ck.py +++ b/slither/printers/summary/ck.py @@ -244,7 +244,7 @@ def output(self, _filename): txt += str(table1) + "\n" # metrics4: function mutability counts - txt += bold("\nFunction mutatability\n") + txt += bold("\nState mutability\n") keys = list(metrics3[self.contracts[0].name].keys()) table2 = make_pretty_table(["Contract", *keys], metrics3, True) txt += str(table2) + "\n" From 3791467fb9a9460b4af6aa2b8324726511ba2ce2 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 16 Jun 2023 11:04:36 -0700 Subject: [PATCH 011/169] docs: fix docstring --- slither/utils/myprettytable.py | 44 ++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index 57e1308840..dd3672f848 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -32,6 +32,14 @@ def __str__(self) -> str: # @param body dict of row headers with a dict of the values # @param totals bool optional add Totals row def make_pretty_table(headers: list, body: dict, totals: bool = False) -> MyPrettyTable: + """ + Converts a dict to a MyPrettyTable. Dict keys are the row headers. + Args: + data: dict of row headers with a dict of the values + column_header: str of column name for 1st column + Returns: + MyPrettyTable + """ table = MyPrettyTable(headers) for row in body: table_row = [row] + [body[row][key] for key in headers[1:]] @@ -40,22 +48,28 @@ def make_pretty_table(headers: list, body: dict, totals: bool = False) -> MyPret table.add_row(["Total"] + [sum([body[row][key] for row in body]) for key in headers[1:]]) return table - -# takes a dict of dicts and returns a dict of dicts with the keys transposed -# example: -# in: -# { -# "dep": {"loc": 0, "sloc": 0, "cloc": 0}, -# "test": {"loc": 0, "sloc": 0, "cloc": 0}, -# "src": {"loc": 0, "sloc": 0, "cloc": 0}, -# } -# out: -# { -# 'loc': {'dep': 0, 'test': 0, 'src': 0}, -# 'sloc': {'dep': 0, 'test': 0, 'src': 0}, -# 'cloc': {'dep': 0, 'test': 0, 'src': 0}, -# } def transpose(table): + """ + Converts a dict of dicts to a dict of dicts with the keys transposed + Args: + table: dict of dicts + Returns: + dict of dicts + + Example: + in: + { + "dep": {"loc": 0, "sloc": 0, "cloc": 0}, + "test": {"loc": 0, "sloc": 0, "cloc": 0}, + "src": {"loc": 0, "sloc": 0, "cloc": 0}, + } + out: + { + 'loc': {'dep': 0, 'test': 0, 'src': 0}, + 'sloc': {'dep': 0, 'test': 0, 'src': 0}, + 'cloc': {'dep': 0, 'test': 0, 'src': 0}, + } + """ any_key = list(table.keys())[0] return { inner_key: {outer_key: table[outer_key][inner_key] for outer_key in table} From c3a674acdc874cd97aeb20fcd464b34ccf873626 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 16 Jun 2023 11:13:47 -0700 Subject: [PATCH 012/169] chore: black --- slither/utils/myprettytable.py | 1 + 1 file changed, 1 insertion(+) diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index dd3672f848..fec84ef0bb 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -48,6 +48,7 @@ def make_pretty_table(headers: list, body: dict, totals: bool = False) -> MyPret table.add_row(["Total"] + [sum([body[row][key] for row in body]) for key in headers[1:]]) return table + def transpose(table): """ Converts a dict of dicts to a dict of dicts with the keys transposed From c919cdae037ca4e7d6091235d1bdf3ee5097b804 Mon Sep 17 00:00:00 2001 From: Tigran Avagyan Date: Thu, 22 Jun 2023 16:55:37 +0400 Subject: [PATCH 013/169] added reachability field for node which indicates whether the node is reachable from the ENTRY_POINT --- slither/core/cfg/node.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/slither/core/cfg/node.py b/slither/core/cfg/node.py index 2a48bd2358..475e2f1389 100644 --- a/slither/core/cfg/node.py +++ b/slither/core/cfg/node.py @@ -193,6 +193,8 @@ def __init__( self.file_scope: "FileScope" = file_scope self._function: Optional["Function"] = None + self._is_reachable: bool = False + ################################################################################### ################################################################################### # region General's properties @@ -234,6 +236,13 @@ def set_function(self, function: "Function") -> None: def function(self) -> "Function": return self._function + @property + def is_reachable(self) -> bool: + return self._is_reachable + + def set_is_reachable(self, new_is_reachable: bool) -> None: + self._is_reachable = new_is_reachable + # endregion ################################################################################### ################################################################################### From 7b9024f96b12d885248b83b8faeb0edf9d326056 Mon Sep 17 00:00:00 2001 From: Tigran Avagyan Date: Thu, 22 Jun 2023 16:56:25 +0400 Subject: [PATCH 014/169] the reachability is updated as the last step of cfg parsing --- slither/solc_parsing/declarations/function.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/slither/solc_parsing/declarations/function.py b/slither/solc_parsing/declarations/function.py index 35ca51aebe..1ecfd3bf62 100644 --- a/slither/solc_parsing/declarations/function.py +++ b/slither/solc_parsing/declarations/function.py @@ -1100,6 +1100,13 @@ def _parse_unchecked_block(self, block: Dict, node: NodeSolc, scope): node = self._parse_statement(statement, node, new_scope) return node + def _update_reachability(self, node: Node): + if node.is_reachable: + return + node.set_is_reachable(True) + for son in node.sons: + self._update_reachability(son) + def _parse_cfg(self, cfg: Dict) -> None: assert cfg[self.get_key()] == "Block" @@ -1120,6 +1127,8 @@ def _parse_cfg(self, cfg: Dict) -> None: self._remove_incorrect_edges() self._remove_alone_endif() + self._update_reachability(self._function.entry_point) + # endregion ################################################################################### ################################################################################### From 49a31173ee0e08fbdf740fd571d1344ed87e61d8 Mon Sep 17 00:00:00 2001 From: Tigran Avagyan Date: Thu, 22 Jun 2023 16:58:55 +0400 Subject: [PATCH 015/169] now we intersect only reachable fathers' dominators --- slither/core/dominators/utils.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/slither/core/dominators/utils.py b/slither/core/dominators/utils.py index 4dd55749d9..463eac4b7b 100644 --- a/slither/core/dominators/utils.py +++ b/slither/core/dominators/utils.py @@ -9,11 +9,17 @@ def intersection_predecessor(node: "Node") -> Set["Node"]: if not node.fathers: return set() - ret = node.fathers[0].dominators - for pred in node.fathers[1:]: - ret = ret.intersection(pred.dominators) - return ret + if not any(father.is_reachable for father in node.fathers): + return set() + ret = set() + for pred in node.fathers: + ret = ret.union(pred.dominators) + + for pred in node.fathers: + if pred.is_reachable: + ret = ret.intersection(pred.dominators) + return ret def _compute_dominators(nodes: List["Node"]) -> None: changed = True @@ -84,6 +90,8 @@ def compute_dominance_frontier(nodes: List["Node"]) -> None: for node in nodes: if len(node.fathers) >= 2: for father in node.fathers: + if not father.is_reachable: + continue runner = father # Corner case: if there is a if without else # we need to add update the conditional node From d75d8d8d8e411515944989ea09c235386d66d30d Mon Sep 17 00:00:00 2001 From: Tigran Avagyan Date: Thu, 22 Jun 2023 17:03:48 +0400 Subject: [PATCH 016/169] changed by black --- slither/core/dominators/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/slither/core/dominators/utils.py b/slither/core/dominators/utils.py index 463eac4b7b..77ff22611f 100644 --- a/slither/core/dominators/utils.py +++ b/slither/core/dominators/utils.py @@ -21,6 +21,7 @@ def intersection_predecessor(node: "Node") -> Set["Node"]: ret = ret.intersection(pred.dominators) return ret + def _compute_dominators(nodes: List["Node"]) -> None: changed = True From 0e86f3d3045fd3669e19824ff950b160438c26c1 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 23 Jun 2023 11:23:22 -0500 Subject: [PATCH 017/169] 0.9.4 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 70d4f71fd4..798d439369 100644 --- a/setup.py +++ b/setup.py @@ -8,15 +8,15 @@ description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.9.3", + version="0.9.4", packages=find_packages(), python_requires=">=3.8", install_requires=[ "packaging", "prettytable>=3.3.0", "pycryptodome>=3.4.6", - # "crytic-compile>=0.3.1,<0.4.0", - "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", + "crytic-compile>=0.3.2,<0.4.0", + # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", "web3>=6.0.0", "eth-abi>=4.0.0", "eth-typing>=3.0.0", From 6e156718d3d9594b738d10565daf3cfb83277a4f Mon Sep 17 00:00:00 2001 From: "t.avagyan" Date: Mon, 26 Jun 2023 09:17:17 +0400 Subject: [PATCH 018/169] fixed dfs --- slither/solc_parsing/declarations/function.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slither/solc_parsing/declarations/function.py b/slither/solc_parsing/declarations/function.py index 1ecfd3bf62..3df121e8ff 100644 --- a/slither/solc_parsing/declarations/function.py +++ b/slither/solc_parsing/declarations/function.py @@ -315,6 +315,8 @@ def analyze_content(self) -> None: self._remove_alone_endif() + self._update_reachability(self._function.entry_point) + # endregion ################################################################################### ################################################################################### @@ -1127,8 +1129,6 @@ def _parse_cfg(self, cfg: Dict) -> None: self._remove_incorrect_edges() self._remove_alone_endif() - self._update_reachability(self._function.entry_point) - # endregion ################################################################################### ################################################################################### From cee0c6bd73c004208a86ed1880edc3757bb0227d Mon Sep 17 00:00:00 2001 From: Tigran Avagyan Date: Mon, 26 Jun 2023 09:30:43 +0400 Subject: [PATCH 019/169] added nullcheck for functions not having entry point (non implemented functions) --- slither/solc_parsing/declarations/function.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slither/solc_parsing/declarations/function.py b/slither/solc_parsing/declarations/function.py index 3df121e8ff..b3821388bf 100644 --- a/slither/solc_parsing/declarations/function.py +++ b/slither/solc_parsing/declarations/function.py @@ -315,7 +315,8 @@ def analyze_content(self) -> None: self._remove_alone_endif() - self._update_reachability(self._function.entry_point) + if self._function.entry_point: + self._update_reachability(self._function.entry_point) # endregion ################################################################################### From 6cb36a2efdf820ca143f9c371b274659271a9889 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 26 Jun 2023 13:23:53 -0500 Subject: [PATCH 020/169] use published release of solc-select --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 798d439369..9695a8fc01 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ "coverage[toml]", "filelock", "pytest-insta", - "solc-select@git+https://github.com/crytic/solc-select.git@query-artifact-path#egg=solc-select", + "solc-select>=1.0.4", ], "doc": [ "pdoc", From 1f40e9269b0c3dc23d45ad2ee8e86237d266c4f9 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 27 Jun 2023 08:20:54 -0500 Subject: [PATCH 021/169] 0.9.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9695a8fc01..e7019b1aac 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.9.4", + version="0.9.5", packages=find_packages(), python_requires=">=3.8", install_requires=[ From f3be9efad61672ba5e97189f73b055f7734d455a Mon Sep 17 00:00:00 2001 From: sam bacha Date: Thu, 6 Jul 2023 07:51:56 -0700 Subject: [PATCH 022/169] docs(readme): add new docs link (#2010) * docs(readme): add new docs link Fix the status badges and include a link to the documentation page that is now generated * docs(citation): create CITATION.cff This creates a `CITATION.cff` file. The information is taken from arXiv's bibtex for the whitepaper: ```bibtex @inproceedings{Feist_2019, doi = {10.1109/wetseb.2019.00008}, url = {https://doi.org/10.1109%2Fwetseb.2019.00008}, year = 2019, month = {may}, publisher = {{IEEE} }, author = {Josselin Feist and Gustavo Grieco and Alex Groce}, title = {Slither: A Static Analysis Framework for Smart Contracts}, booktitle = {2019 {IEEE}/{ACM} 2nd International Workshop on Emerging Trends in Software Engineering for Blockchain ({WETSEB})} } ``` --- CITATION.cff | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 60 +++++++++++++++++++++++++++++++----------------- 2 files changed, 103 insertions(+), 21 deletions(-) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000..605bd60e5f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,64 @@ +cff-version: 1.2.0 +title: Slither Analyzer +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: Josselin + family-names: Feist + - given-names: Gustavo + family-names: Grieco + - given-names: Alex + family-names: Groce +identifiers: + - type: doi + value: 10.48550/arXiv.1908.09878 + description: arXiv.1908.09878 + - type: url + value: 'https://arxiv.org/abs/1908.09878' + description: arxiv + - type: doi + value: 10.1109/wetseb.2019.00008 +repository-code: 'https://github.com/crytic/slither' +url: 'https://www.trailofbits.com/' +repository-artifact: 'https://github.com/crytic/slither/releases' +abstract: >- + Slither is a static analysis framework designed to provide + rich information about Ethereum smart contracts. + + It works by converting Solidity smart contracts into an + intermediate representation called SlithIR. + + SlithIR uses Static Single Assignment (SSA) form and a + reduced instruction set to ease implementation of analyses + while preserving semantic information that would be lost + in transforming Solidity to bytecode. + + Slither allows for the application of commonly used + program analysis techniques like dataflow and taint + tracking. + + + Our framework has four main use cases: + + (1) automated detection of vulnerabilities, + + (2) automated detection of code optimization + opportunities, + + (3) improvement of the user's understanding of the + contracts, and + + (4) assistance with code review. +keywords: + - Ethereum + - Static Analysis + - Smart contracts + - EVM + - bug detection + - Software Engineering +license: AGPL-3.0-only +commit: 3d4f934d3228f072b7df2c5e7252c64df4601bc8 +version: 0.9.5 +date-released: '2023-06-28' diff --git a/README.md b/README.md index cb815561e8..18c1c62268 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,40 @@ -# Slither, the Solidity source analyzer +Slither Static Analysis Framework Logo -Logo +# [Slither, the Solidity source analyzer](https://crytic.github.io/slither/slither.html) [![Build Status](https://img.shields.io/github/actions/workflow/status/crytic/slither/ci.yml?branch=master)](https://github.com/crytic/slither/actions?query=workflow%3ACI) -[![Slack Status](https://empireslacking.herokuapp.com/badge.svg)](https://empireslacking.herokuapp.com) -[![PyPI version](https://badge.fury.io/py/slither-analyzer.svg)](https://badge.fury.io/py/slither-analyzer) - -Slither is a Solidity static analysis framework written in Python3. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, enhance their code comprehension, and quickly prototype custom analyses. - -- [Features](#features) -- [Usage](#usage) -- [How to Install](#how-to-install) -- [Detectors](#detectors) -- [Printers](#printers) -- [Tools](#tools) -- [API Documentation](#api-documentation) -- [Getting Help](#getting-help) -- [FAQ](#faq) -- [Publications](#publications) +![PyPI](https://img.shields.io/pypi/v/slither-analyzer?logo=python&logoColor=white&label=slither-analyzer) +[![Slither - Read the Docs](https://img.shields.io/badge/Slither-Read_the_Docs-2ea44f)](https://crytic.github.io/slither/slither.html) +[![Slither - Wiki](https://img.shields.io/badge/Slither-Wiki-2ea44f)](https://github.com/crytic/slither/wiki/SlithIR) + +> Join the Empire Hacking Slack +> +> [![Slack Status](https://slack.empirehacking.nyc/badge.svg)](https://slack.empirehacking.nyc/) +> > - Discussions and Support + + +**Slither** is a Solidity static analysis framework written in Python3. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, enhance their code comprehension, and quickly prototype custom analyses. + + * [Features](#features) + * [Usage](#usage) + * [How to install](#how-to-install) + + [Using Pip](#using-pip) + + [Using Git](#using-git) + + [Using Docker](#using-docker) + + [Integration](#integration) + * [Detectors](#detectors) + * [Printers](#printers) + + [Quick Review Printers](#quick-review-printers) + + [In-Depth Review Printers](#in-depth-review-printers) + * [Tools](#tools) + * [API Documentation](#api-documentation) + * [Getting Help](#getting-help) + * [FAQ](#faq) + * [License](#license) + * [Publications](#publications) + + [Trail of Bits publication](#trail-of-bits-publication) + + [External publications](#external-publications) + ## Features @@ -36,7 +53,7 @@ Slither is a Solidity static analysis framework written in Python3. It runs a su Run Slither on a Hardhat/Foundry/Dapp/Brownie application: -```bash +```console slither . ``` @@ -44,18 +61,19 @@ This is the preferred option if your project has dependencies as Slither relies However, you can run Slither on a single file that does not import dependencies: -```bash +```console slither tests/uninitialized.sol ``` ## How to install -Slither requires Python 3.8+. +> **Note**
+> Slither requires Python 3.8+. If you're **not** going to use one of the [supported compilation frameworks](https://github.com/crytic/crytic-compile), you need [solc](https://github.com/ethereum/solidity/), the Solidity compiler; we recommend using [solc-select](https://github.com/crytic/solc-select) to conveniently switch between solc versions. ### Using Pip -```bash +```console pip3 install slither-analyzer ``` From e5f2a86f0906fd62c6c4eccb9dbfa5ab30671a78 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 6 Jul 2023 11:05:58 -0500 Subject: [PATCH 023/169] 0.9.6 (#2031) * 0.9.6 * lint readme --- README.md | 125 +++++++++++++++++++++++++++--------------------------- setup.py | 5 +-- 2 files changed, 64 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 18c1c62268..1a0d203c7d 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,51 @@ -Slither Static Analysis Framework Logo - # [Slither, the Solidity source analyzer](https://crytic.github.io/slither/slither.html) +Slither Static Analysis Framework Logo + [![Build Status](https://img.shields.io/github/actions/workflow/status/crytic/slither/ci.yml?branch=master)](https://github.com/crytic/slither/actions?query=workflow%3ACI) ![PyPI](https://img.shields.io/pypi/v/slither-analyzer?logo=python&logoColor=white&label=slither-analyzer) [![Slither - Read the Docs](https://img.shields.io/badge/Slither-Read_the_Docs-2ea44f)](https://crytic.github.io/slither/slither.html) [![Slither - Wiki](https://img.shields.io/badge/Slither-Wiki-2ea44f)](https://github.com/crytic/slither/wiki/SlithIR) > Join the Empire Hacking Slack -> +> > [![Slack Status](https://slack.empirehacking.nyc/badge.svg)](https://slack.empirehacking.nyc/) > > - Discussions and Support - **Slither** is a Solidity static analysis framework written in Python3. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, enhance their code comprehension, and quickly prototype custom analyses. - * [Features](#features) - * [Usage](#usage) - * [How to install](#how-to-install) - + [Using Pip](#using-pip) - + [Using Git](#using-git) - + [Using Docker](#using-docker) - + [Integration](#integration) - * [Detectors](#detectors) - * [Printers](#printers) - + [Quick Review Printers](#quick-review-printers) - + [In-Depth Review Printers](#in-depth-review-printers) - * [Tools](#tools) - * [API Documentation](#api-documentation) - * [Getting Help](#getting-help) - * [FAQ](#faq) - * [License](#license) - * [Publications](#publications) - + [Trail of Bits publication](#trail-of-bits-publication) - + [External publications](#external-publications) - +* [Features](#features) +* [Usage](#usage) +* [How to install](#how-to-install) + * [Using Pip](#using-pip) + * [Using Git](#using-git) + * [Using Docker](#using-docker) + * [Integration](#integration) +* [Detectors](#detectors) +* [Printers](#printers) + * [Quick Review Printers](#quick-review-printers) + * [In-Depth Review Printers](#in-depth-review-printers) +* [Tools](#tools) +* [API Documentation](#api-documentation) +* [Getting Help](#getting-help) +* [FAQ](#faq) +* [License](#license) +* [Publications](#publications) + * [Trail of Bits publication](#trail-of-bits-publication) + * [External publications](#external-publications) ## Features -- Detects vulnerable Solidity code with low false positives (see the list of [trophies](./trophies.md)) -- Identifies where the error condition occurs in the source code -- Easily integrates into continuous integration and Hardhat/Foundry builds -- Built-in 'printers' quickly report crucial contract information -- Detector API to write custom analyses in Python -- Ability to analyze contracts written with Solidity >= 0.4 -- Intermediate representation ([SlithIR](https://github.com/trailofbits/slither/wiki/SlithIR)) enables simple, high-precision analyses -- Correctly parses 99.9% of all public Solidity code -- Average execution time of less than 1 second per contract -- Integrates with Github's code scanning in [CI](https://github.com/marketplace/actions/slither-action) +* Detects vulnerable Solidity code with low false positives (see the list of [trophies](./trophies.md)) +* Identifies where the error condition occurs in the source code +* Easily integrates into continuous integration and Hardhat/Foundry builds +* Built-in 'printers' quickly report crucial contract information +* Detector API to write custom analyses in Python +* Ability to analyze contracts written with Solidity >= 0.4 +* Intermediate representation ([SlithIR](https://github.com/trailofbits/slither/wiki/SlithIR)) enables simple, high-precision analyses +* Correctly parses 99.9% of all public Solidity code +* Average execution time of less than 1 second per contract +* Integrates with Github's code scanning in [CI](https://github.com/marketplace/actions/slither-action) ## Usage @@ -102,9 +100,9 @@ docker run -it -v /home/share:/share trailofbits/eth-security-toolbox ### Integration -- For GitHub action integration, use [slither-action](https://github.com/marketplace/actions/slither-action). -- To generate a Markdown report, use `slither [target] --checklist`. -- To generate a Markdown with GitHub source code highlighting, use `slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/` (replace `ORG`, `REPO`, `COMMIT`) +* For GitHub action integration, use [slither-action](https://github.com/marketplace/actions/slither-action). +* To generate a Markdown report, use `slither [target] --checklist`. +* To generate a Markdown with GitHub source code highlighting, use `slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/` (replace `ORG`, `REPO`, `COMMIT`) ## Detectors @@ -200,23 +198,24 @@ Num | Detector | What it Detects | Impact | Confidence For more information, see -- The [Detector Documentation](https://github.com/crytic/slither/wiki/Detector-Documentation) for details on each detector -- The [Detection Selection](https://github.com/crytic/slither/wiki/Usage#detector-selection) to run only selected detectors. By default, all the detectors are run. -- The [Triage Mode](https://github.com/crytic/slither/wiki/Usage#triage-mode) to filter individual results +* The [Detector Documentation](https://github.com/crytic/slither/wiki/Detector-Documentation) for details on each detector +* The [Detection Selection](https://github.com/crytic/slither/wiki/Usage#detector-selection) to run only selected detectors. By default, all the detectors are run. +* The [Triage Mode](https://github.com/crytic/slither/wiki/Usage#triage-mode) to filter individual results ## Printers + ### Quick Review Printers -- `human-summary`: [Print a human-readable summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#human-summary) -- `inheritance-graph`: [Export the inheritance graph of each contract to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) -- `contract-summary`: [Print a summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#contract-summary) -- `loc`: [Count the total number lines of code (LOC), source lines of code (SLOC), and comment lines of code (CLOC) found in source files (SRC), dependencies (DEP), and test files (TEST).](https://github.com/trailofbits/slither/wiki/Printer-documentation#loc) +* `human-summary`: [Print a human-readable summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#human-summary) +* `inheritance-graph`: [Export the inheritance graph of each contract to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) +* `contract-summary`: [Print a summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#contract-summary) +* `loc`: [Count the total number lines of code (LOC), source lines of code (SLOC), and comment lines of code (CLOC) found in source files (SRC), dependencies (DEP), and test files (TEST).](https://github.com/trailofbits/slither/wiki/Printer-documentation#loc) ### In-Depth Review Printers -- `call-graph`: [Export the call-graph of the contracts to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#call-graph) -- `cfg`: [Export the CFG of each functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#cfg) -- `function-summary`: [Print a summary of the functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) -- `vars-and-auth`: [Print the state variables written and the authorization of the functions](https://github.com/crytic/slither/wiki/Printer-documentation#variables-written-and-authorization) -- `not-pausable`: [Print functions that do not use `whenNotPaused` modifier](https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused). +* `call-graph`: [Export the call-graph of the contracts to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#call-graph) +* `cfg`: [Export the CFG of each functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#cfg) +* `function-summary`: [Print a summary of the functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) +* `vars-and-auth`: [Print the state variables written and the authorization of the functions](https://github.com/crytic/slither/wiki/Printer-documentation#variables-written-and-authorization) +* `not-pausable`: [Print functions that do not use `whenNotPaused` modifier](https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused). To run a printer, use `--print` and a comma-separated list of printers. @@ -224,13 +223,13 @@ See the [Printer documentation](https://github.com/crytic/slither/wiki/Printer-d ## Tools -- `slither-check-upgradeability`: [Review `delegatecall`-based upgradeability](https://github.com/crytic/slither/wiki/Upgradeability-Checks) -- `slither-prop`: [Automatic unit test and property generation](https://github.com/crytic/slither/wiki/Property-generation) -- `slither-flat`: [Flatten a codebase](https://github.com/crytic/slither/wiki/Contract-Flattening) -- `slither-check-erc`: [Check the ERC's conformance](https://github.com/crytic/slither/wiki/ERC-Conformance) -- `slither-format`: [Automatic patch generation](https://github.com/crytic/slither/wiki/Slither-format) -- `slither-read-storage`: [Read storage values from contracts](./slither/tools/read_storage/README.md) -- `slither-interface`: [Generate an interface for a contract](./slither/tools/interface/README.md) +* `slither-check-upgradeability`: [Review `delegatecall`-based upgradeability](https://github.com/crytic/slither/wiki/Upgradeability-Checks) +* `slither-prop`: [Automatic unit test and property generation](https://github.com/crytic/slither/wiki/Property-generation) +* `slither-flat`: [Flatten a codebase](https://github.com/crytic/slither/wiki/Contract-Flattening) +* `slither-check-erc`: [Check the ERC's conformance](https://github.com/crytic/slither/wiki/ERC-Conformance) +* `slither-format`: [Automatic patch generation](https://github.com/crytic/slither/wiki/Slither-format) +* `slither-read-storage`: [Read storage values from contracts](./slither/tools/read_storage/README.md) +* `slither-interface`: [Generate an interface for a contract](./slither/tools/interface/README.md) See the [Tool documentation](https://github.com/crytic/slither/wiki/Tool-Documentation) for additional tools. @@ -244,23 +243,23 @@ Documentation on Slither's internals is available [here](https://crytic.github.i Feel free to stop by our [Slack channel](https://empireslacking.herokuapp.com) (#ethereum) for help using or extending Slither. -- The [Printer documentation](https://github.com/trailofbits/slither/wiki/Printer-documentation) describes the information Slither is capable of visualizing for each contract. +* The [Printer documentation](https://github.com/trailofbits/slither/wiki/Printer-documentation) describes the information Slither is capable of visualizing for each contract. -- The [Detector documentation](https://github.com/trailofbits/slither/wiki/Adding-a-new-detector) describes how to write a new vulnerability analyses. +* The [Detector documentation](https://github.com/trailofbits/slither/wiki/Adding-a-new-detector) describes how to write a new vulnerability analyses. -- The [API documentation](https://github.com/crytic/slither/wiki/Python-API) describes the methods and objects available for custom analyses. +* The [API documentation](https://github.com/crytic/slither/wiki/Python-API) describes the methods and objects available for custom analyses. -- The [SlithIR documentation](https://github.com/trailofbits/slither/wiki/SlithIR) describes the SlithIR intermediate representation. +* The [SlithIR documentation](https://github.com/trailofbits/slither/wiki/SlithIR) describes the SlithIR intermediate representation. ## FAQ How do I exclude mocks or tests? -- View our documentation on [path filtering](https://github.com/crytic/slither/wiki/Usage#path-filtering). +* View our documentation on [path filtering](https://github.com/crytic/slither/wiki/Usage#path-filtering). How do I fix "unknown file" or compilation issues? -- Because slither requires the solc AST, it must have all dependencies available. +* Because slither requires the solc AST, it must have all dependencies available. If a contract has dependencies, `slither contract.sol` will fail. Instead, use `slither .` in the parent directory of `contracts/` (you should see `contracts/` when you run `ls`). If you have a `node_modules/` folder, it must be in the same directory as `contracts/`. To verify that this issue is related to slither, @@ -275,7 +274,7 @@ Slither is licensed and distributed under the AGPLv3 license. [Contact us](mailt ### Trail of Bits publication -- [Slither: A Static Analysis Framework For Smart Contracts](https://arxiv.org/abs/1908.09878), Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19 +* [Slither: A Static Analysis Framework For Smart Contracts](https://arxiv.org/abs/1908.09878), Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19 ### External publications diff --git a/setup.py b/setup.py index e7019b1aac..182b91d35b 100644 --- a/setup.py +++ b/setup.py @@ -8,14 +8,14 @@ description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.9.5", + version="0.9.6", packages=find_packages(), python_requires=">=3.8", install_requires=[ "packaging", "prettytable>=3.3.0", "pycryptodome>=3.4.6", - "crytic-compile>=0.3.2,<0.4.0", + "crytic-compile>=0.3.3,<0.4.0", # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", "web3>=6.0.0", "eth-abi>=4.0.0", @@ -36,7 +36,6 @@ "coverage[toml]", "filelock", "pytest-insta", - "solc-select>=1.0.4", ], "doc": [ "pdoc", From 06e218c822adcf83f96c7996b1c1683dd6a4d27d Mon Sep 17 00:00:00 2001 From: devtooligan Date: Wed, 5 Jul 2023 18:00:13 -0700 Subject: [PATCH 024/169] refactor: prefer custom classes to dicts --- slither/printers/summary/halstead.py | 177 ++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 4 deletions(-) diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py index 12e422fb08..5741db1231 100644 --- a/slither/printers/summary/halstead.py +++ b/slither/printers/summary/halstead.py @@ -25,19 +25,182 @@ """ import math +from dataclasses import dataclass, field +from typing import Tuple, List, Dict from collections import OrderedDict +from slither.core.declarations import ( + Contract, + Pragma, + Import, + Function, + Modifier, +) from slither.printers.abstract_printer import AbstractPrinter from slither.slithir.variables.temporary import TemporaryVariable -from slither.utils.myprettytable import make_pretty_table -from slither.utils.upgradeability import encode_ir_for_halstead +from slither.utils.myprettytable import make_pretty_table, MyPrettyTable +from slither.utils.upgradeability import encode_ir_for_halstead # TODO: Add to slither/utils/halstead -def compute_halstead(contracts: list) -> tuple: +@dataclass +class HalsteadContractMetrics: + """Class to hold the Halstead metrics for a single contract.""" + # TODO: Add to slither/utils/halstead + contract: Contract + all_operators: List[str] = field(default_factory=list) + all_operands: List[str] = field(default_factory=list) + n1: int = 0 + n2: int = 0 + N1: int = 0 + N2: int = 0 + n: int = 0 + N: int = 0 + S: float = 0 + V: float = 0 + D: float = 0 + E: float = 0 + T: float = 0 + B: float = 0 + + def __post_init__(self): + if (len(self.all_operators) == 0): + self.populate_operators_and_operands() + self.compute_metrics() + + def to_dict(self) -> Dict[str, float]: + """Return the metrics as a dictionary.""" + return OrderedDict({ + "Total Operators": self.N1, + "Unique Operators": self.n1, + "Total Operands": self.N2, + "Unique Operands": self.n2, + "Vocabulary": str(self.n1 + self.n2), + "Program Length": str(self.N1 + self.N2), + "Estimated Length": f"{self.S:.0f}", + "Volume": f"{self.V:.0f}", + "Difficulty": f"{self.D:.0f}", + "Effort": f"{self.E:.0f}", + "Time": f"{self.T:.0f}", + "Estimated Bugs": f"{self.B:.3f}", + }) + + def populate_operators_and_operands(self): + """Populate the operators and operands lists.""" + operators = [] + operands = [] + for func in self.contract.functions: + for node in func.nodes: + for operation in node.irs: + # use operation.expression.type to get the unique operator type + encoded_operator = encode_ir_for_halstead(operation) + operators.append(encoded_operator) + + # use operation.used to get the operands of the operation ignoring the temporary variables + operands.extend([ + op for op in operation.used if not isinstance(op, TemporaryVariable) + ]) + # import pdb; pdb.set_trace() + self.all_operators.extend(operators) + self.all_operands.extend(operands) + + def compute_metrics(self, all_operators=[], all_operands=[]): + """Compute the Halstead metrics.""" + if len(all_operators) == 0: + all_operators = self.all_operators + all_operands = self.all_operands + + self.n1 = len(set(all_operators)) + self.n2 = len(set(all_operands)) + self.N1 = len(all_operators) + self.N2 = len(all_operands) + if any(number <= 0 for number in [self.n1, self.n2, self.N1, self.N2]): + raise ValueError("n1 and n2 must be greater than 0") + + self.n = self.n1 + self.n2 + self.N = self.N1 + self.N2 + self.S = self.n1 * math.log2(self.n1) + self.n2 * math.log2(self.n2) + self.V = self.N * math.log2(self.n) + self.D = (self.n1 / 2) * (self.N2 / self.n2) + self.E = self.D * self.V + self.T = self.E / 18 + self.B = (self.E ** (2 / 3)) / 3000 + + +@dataclass +class SectionInfo: + title: str + pretty_table: MyPrettyTable + txt: str + + +@dataclass +class HalsteadMetrics: + """Class to hold the Halstead metrics for all contracts and methods for reporting.""" + contracts: List[Contract] = field(default_factory=list) + contract_metrics: OrderedDict[Contract, HalsteadContractMetrics] = field(default_factory=OrderedDict) + title: str = "Halstead complexity metrics" + full_txt: str = "" + core: SectionInfo = field(default=SectionInfo) + extended1: SectionInfo = field(default=SectionInfo) + extended2: SectionInfo = field(default=SectionInfo) + CORE_KEYS = ( + "Total Operators", + "Unique Operators", + "Total Operands", + "Unique Operands", + ) + EXTENDED1_KEYS = ( + "Vocabulary", + "Program Length", + "Estimated Length", + "Volume", + ) + EXTENDED2_KEYS = ( + "Difficulty", + "Effort", + "Time", + "Estimated Bugs", + ) + SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( + ("Core", CORE_KEYS), + ("Extended1", EXTENDED1_KEYS), + ("Extended2", EXTENDED2_KEYS), + ) + + + def __post_init__(self): + for contract in self.contracts: + self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) + + if len(self.contracts) > 1: + all_operators = [ + operator for contract in self.contracts + for operator in self.contract_metrics[contract.name].all_operators + ] + + all_operands = [ + operand for contract in self.contracts + for operand in self.contract_metrics[contract.name].all_operands + ] + + self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics(all_operators=all_operators, all_operands=all_operands) + + data = { + contract.name: self.contract_metrics[contract.name].to_dict() + for contract in self.contracts + } + for (title, keys) in self.SECTIONS: + pretty_table = make_pretty_table(["Contract", *keys], data, False) + section_title = f"{self.title} - {title}" + txt = f"\n\n{section_title}:\n{pretty_table}\n" + self.full_txt += txt + setattr(self, title.lower(), SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt)) + +def compute_halstead(contracts: list) -> Tuple[Dict, Dict, Dict]: """Used to compute the Halstead complexity metrics for a list of contracts. Args: contracts: list of contracts. Returns: - Halstead metrics as a tuple of two OrderedDicts (core_metrics, extended_metrics) + Halstead metrics as a tuple of three OrderedDicts (core_metrics, extended_metrics1, extended_metrics2) which each contain one key per contract. The value of each key is a dict of metrics. In addition to one key per contract, there is a key for "ALL CONTRACTS" that contains @@ -162,6 +325,8 @@ def output(self, _filename): core, extended1, extended2 = compute_halstead(self.contracts) + halstead = HalsteadMetrics(self.contracts) + # Core metrics: operations and operands txt = "\n\nHalstead complexity core metrics:\n" keys = list(core[self.contracts[0].name].keys()) @@ -185,5 +350,9 @@ def output(self, _filename): res.add_pretty_table(table_extended1, "Halstead extended metrics1") res.add_pretty_table(table_extended2, "Halstead extended metrics2") self.info(txt) + self.info("*****************************************************************") + self.info("new one") + self.info("*****************************************************************") + self.info(halstead.full_txt) return res From db5ec712de134cef84c9bde4e2a57125a2336a13 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 12:06:58 -0700 Subject: [PATCH 025/169] chore: move halstead utilities to utils folder --- slither/printers/summary/halstead.py | 321 +-------------------------- slither/utils/halstead.py | 203 +++++++++++++++++ 2 files changed, 208 insertions(+), 316 deletions(-) create mode 100644 slither/utils/halstead.py diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py index 5741db1231..ef446e3896 100644 --- a/slither/printers/summary/halstead.py +++ b/slither/printers/summary/halstead.py @@ -22,296 +22,9 @@ T = E / 18 seconds # Time required to program B = (E^(2/3)) / 3000 # Number of delivered bugs - """ -import math -from dataclasses import dataclass, field -from typing import Tuple, List, Dict -from collections import OrderedDict -from slither.core.declarations import ( - Contract, - Pragma, - Import, - Function, - Modifier, -) from slither.printers.abstract_printer import AbstractPrinter -from slither.slithir.variables.temporary import TemporaryVariable -from slither.utils.myprettytable import make_pretty_table, MyPrettyTable -from slither.utils.upgradeability import encode_ir_for_halstead # TODO: Add to slither/utils/halstead - - -@dataclass -class HalsteadContractMetrics: - """Class to hold the Halstead metrics for a single contract.""" - # TODO: Add to slither/utils/halstead - contract: Contract - all_operators: List[str] = field(default_factory=list) - all_operands: List[str] = field(default_factory=list) - n1: int = 0 - n2: int = 0 - N1: int = 0 - N2: int = 0 - n: int = 0 - N: int = 0 - S: float = 0 - V: float = 0 - D: float = 0 - E: float = 0 - T: float = 0 - B: float = 0 - - def __post_init__(self): - if (len(self.all_operators) == 0): - self.populate_operators_and_operands() - self.compute_metrics() - - def to_dict(self) -> Dict[str, float]: - """Return the metrics as a dictionary.""" - return OrderedDict({ - "Total Operators": self.N1, - "Unique Operators": self.n1, - "Total Operands": self.N2, - "Unique Operands": self.n2, - "Vocabulary": str(self.n1 + self.n2), - "Program Length": str(self.N1 + self.N2), - "Estimated Length": f"{self.S:.0f}", - "Volume": f"{self.V:.0f}", - "Difficulty": f"{self.D:.0f}", - "Effort": f"{self.E:.0f}", - "Time": f"{self.T:.0f}", - "Estimated Bugs": f"{self.B:.3f}", - }) - - def populate_operators_and_operands(self): - """Populate the operators and operands lists.""" - operators = [] - operands = [] - for func in self.contract.functions: - for node in func.nodes: - for operation in node.irs: - # use operation.expression.type to get the unique operator type - encoded_operator = encode_ir_for_halstead(operation) - operators.append(encoded_operator) - - # use operation.used to get the operands of the operation ignoring the temporary variables - operands.extend([ - op for op in operation.used if not isinstance(op, TemporaryVariable) - ]) - # import pdb; pdb.set_trace() - self.all_operators.extend(operators) - self.all_operands.extend(operands) - - def compute_metrics(self, all_operators=[], all_operands=[]): - """Compute the Halstead metrics.""" - if len(all_operators) == 0: - all_operators = self.all_operators - all_operands = self.all_operands - - self.n1 = len(set(all_operators)) - self.n2 = len(set(all_operands)) - self.N1 = len(all_operators) - self.N2 = len(all_operands) - if any(number <= 0 for number in [self.n1, self.n2, self.N1, self.N2]): - raise ValueError("n1 and n2 must be greater than 0") - - self.n = self.n1 + self.n2 - self.N = self.N1 + self.N2 - self.S = self.n1 * math.log2(self.n1) + self.n2 * math.log2(self.n2) - self.V = self.N * math.log2(self.n) - self.D = (self.n1 / 2) * (self.N2 / self.n2) - self.E = self.D * self.V - self.T = self.E / 18 - self.B = (self.E ** (2 / 3)) / 3000 - - -@dataclass -class SectionInfo: - title: str - pretty_table: MyPrettyTable - txt: str - - -@dataclass -class HalsteadMetrics: - """Class to hold the Halstead metrics for all contracts and methods for reporting.""" - contracts: List[Contract] = field(default_factory=list) - contract_metrics: OrderedDict[Contract, HalsteadContractMetrics] = field(default_factory=OrderedDict) - title: str = "Halstead complexity metrics" - full_txt: str = "" - core: SectionInfo = field(default=SectionInfo) - extended1: SectionInfo = field(default=SectionInfo) - extended2: SectionInfo = field(default=SectionInfo) - CORE_KEYS = ( - "Total Operators", - "Unique Operators", - "Total Operands", - "Unique Operands", - ) - EXTENDED1_KEYS = ( - "Vocabulary", - "Program Length", - "Estimated Length", - "Volume", - ) - EXTENDED2_KEYS = ( - "Difficulty", - "Effort", - "Time", - "Estimated Bugs", - ) - SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( - ("Core", CORE_KEYS), - ("Extended1", EXTENDED1_KEYS), - ("Extended2", EXTENDED2_KEYS), - ) - - - def __post_init__(self): - for contract in self.contracts: - self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) - - if len(self.contracts) > 1: - all_operators = [ - operator for contract in self.contracts - for operator in self.contract_metrics[contract.name].all_operators - ] - - all_operands = [ - operand for contract in self.contracts - for operand in self.contract_metrics[contract.name].all_operands - ] - - self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics(all_operators=all_operators, all_operands=all_operands) - - data = { - contract.name: self.contract_metrics[contract.name].to_dict() - for contract in self.contracts - } - for (title, keys) in self.SECTIONS: - pretty_table = make_pretty_table(["Contract", *keys], data, False) - section_title = f"{self.title} - {title}" - txt = f"\n\n{section_title}:\n{pretty_table}\n" - self.full_txt += txt - setattr(self, title.lower(), SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt)) - -def compute_halstead(contracts: list) -> Tuple[Dict, Dict, Dict]: - """Used to compute the Halstead complexity metrics for a list of contracts. - Args: - contracts: list of contracts. - Returns: - Halstead metrics as a tuple of three OrderedDicts (core_metrics, extended_metrics1, extended_metrics2) - which each contain one key per contract. The value of each key is a dict of metrics. - - In addition to one key per contract, there is a key for "ALL CONTRACTS" that contains - the metrics for ALL CONTRACTS combined. (Not the sums of the individual contracts!) - - core_metrics: - {"contract1 name": { - "N1_total_operators": N1, - "n1_unique_operators": n1, - "N2_total_operands": N2, - "n2_unique_operands": n1, - }} - - extended_metrics1: - {"contract1 name": { - "n_vocabulary": n1 + n2, - "N_prog_length": N1 + N2, - "S_est_length": S, - "V_volume": V, - }} - extended_metrics2: - {"contract1 name": { - "D_difficulty": D, - "E_effort": E, - "T_time": T, - "B_bugs": B, - }} - - """ - core = OrderedDict() - extended1 = OrderedDict() - extended2 = OrderedDict() - all_operators = [] - all_operands = [] - for contract in contracts: - operators = [] - operands = [] - for func in contract.functions: - for node in func.nodes: - for operation in node.irs: - # use operation.expression.type to get the unique operator type - encoded_operator = encode_ir_for_halstead(operation) - operators.append(encoded_operator) - all_operators.append(encoded_operator) - - # use operation.used to get the operands of the operation ignoring the temporary variables - new_operands = [ - op for op in operation.used if not isinstance(op, TemporaryVariable) - ] - operands.extend(new_operands) - all_operands.extend(new_operands) - ( - core[contract.name], - extended1[contract.name], - extended2[contract.name], - ) = _calculate_metrics(operators, operands) - if len(contracts) > 1: - core["ALL CONTRACTS"] = OrderedDict() - extended1["ALL CONTRACTS"] = OrderedDict() - extended2["ALL CONTRACTS"] = OrderedDict() - ( - core["ALL CONTRACTS"], - extended1["ALL CONTRACTS"], - extended2["ALL CONTRACTS"], - ) = _calculate_metrics(all_operators, all_operands) - return (core, extended1, extended2) - - -# pylint: disable=too-many-locals -def _calculate_metrics(operators, operands): - """Used to compute the Halstead complexity metrics for a list of operators and operands. - Args: - operators: list of operators. - operands: list of operands. - Returns: - Halstead metrics as a tuple of two OrderedDicts (core_metrics, extended_metrics) - which each contain one key per contract. The value of each key is a dict of metrics. - NOTE: The metric values are ints and floats that have been converted to formatted strings - """ - n1 = len(set(operators)) - n2 = len(set(operands)) - N1 = len(operators) - N2 = len(operands) - n = n1 + n2 - N = N1 + N2 - S = 0 if (n1 == 0 or n2 == 0) else n1 * math.log2(n1) + n2 * math.log2(n2) - V = N * math.log2(n) if n > 0 else 0 - D = (n1 / 2) * (N2 / n2) if n2 > 0 else 0 - E = D * V - T = E / 18 - B = (E ** (2 / 3)) / 3000 - core_metrics = { - "Total Operators": N1, - "Unique Operators": n1, - "Total Operands": N2, - "Unique Operands": n2, - } - extended_metrics1 = { - "Vocabulary": str(n1 + n2), - "Program Length": str(N1 + N2), - "Estimated Length": f"{S:.0f}", - "Volume": f"{V:.0f}", - } - extended_metrics2 = { - "Difficulty": f"{D:.0f}", - "Effort": f"{E:.0f}", - "Time": f"{T:.0f}", - "Estimated Bugs": f"{B:.3f}", - } - return (core_metrics, extended_metrics1, extended_metrics2) - +from slither.utils.halstead import HalsteadMetrics class Halstead(AbstractPrinter): ARGUMENT = "halstead" @@ -323,36 +36,12 @@ def output(self, _filename): if len(self.contracts) == 0: return self.generate_output("No contract found") - core, extended1, extended2 = compute_halstead(self.contracts) - halstead = HalsteadMetrics(self.contracts) - # Core metrics: operations and operands - txt = "\n\nHalstead complexity core metrics:\n" - keys = list(core[self.contracts[0].name].keys()) - table_core = make_pretty_table(["Contract", *keys], core, False) - txt += str(table_core) + "\n" - - # Extended metrics1: vocabulary, program length, estimated length, volume - txt += "\nHalstead complexity extended metrics1:\n" - keys = list(extended1[self.contracts[0].name].keys()) - table_extended1 = make_pretty_table(["Contract", *keys], extended1, False) - txt += str(table_extended1) + "\n" - - # Extended metrics2: difficulty, effort, time, bugs - txt += "\nHalstead complexity extended metrics2:\n" - keys = list(extended2[self.contracts[0].name].keys()) - table_extended2 = make_pretty_table(["Contract", *keys], extended2, False) - txt += str(table_extended2) + "\n" - - res = self.generate_output(txt) - res.add_pretty_table(table_core, "Halstead core metrics") - res.add_pretty_table(table_extended1, "Halstead extended metrics1") - res.add_pretty_table(table_extended2, "Halstead extended metrics2") - self.info(txt) - self.info("*****************************************************************") - self.info("new one") - self.info("*****************************************************************") + res = self.generate_output(halstead.full_txt) + res.add_pretty_table(halstead.core.pretty_table, halstead.core.title) + res.add_pretty_table(halstead.extended1.pretty_table, halstead.extended1.title) + res.add_pretty_table(halstead.extended2.pretty_table, halstead.extended2.title) self.info(halstead.full_txt) return res diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py new file mode 100644 index 0000000000..7417fb4e10 --- /dev/null +++ b/slither/utils/halstead.py @@ -0,0 +1,203 @@ +""" + Halstead complexity metrics + https://en.wikipedia.org/wiki/Halstead_complexity_measures + + 12 metrics based on the number of unique operators and operands: + + Core metrics: + n1 = the number of distinct operators + n2 = the number of distinct operands + N1 = the total number of operators + N2 = the total number of operands + + Extended metrics1: + n = n1 + n2 # Program vocabulary + N = N1 + N2 # Program length + S = n1 * log2(n1) + n2 * log2(n2) # Estimated program length + V = N * log2(n) # Volume + + Extended metrics2: + D = (n1 / 2) * (N2 / n2) # Difficulty + E = D * V # Effort + T = E / 18 seconds # Time required to program + B = (E^(2/3)) / 3000 # Number of delivered bugs + + +""" +import math +from dataclasses import dataclass, field +from typing import Tuple, List, Dict +from collections import OrderedDict +from slither.core.declarations import Contract +from slither.slithir.variables.temporary import TemporaryVariable +from slither.utils.myprettytable import make_pretty_table, MyPrettyTable +from slither.utils.upgradeability import encode_ir_for_halstead + + +@dataclass +class HalsteadContractMetrics: + """Class to hold the Halstead metrics for a single contract.""" + contract: Contract + all_operators: List[str] = field(default_factory=list) + all_operands: List[str] = field(default_factory=list) + n1: int = 0 + n2: int = 0 + N1: int = 0 + N2: int = 0 + n: int = 0 + N: int = 0 + S: float = 0 + V: float = 0 + D: float = 0 + E: float = 0 + T: float = 0 + B: float = 0 + + def __post_init__(self): + """ Operators and operands can be passed in as constructor args to avoid computing + them based on the contract. Useful for computing metrics for ALL_CONTRACTS""" + if (len(self.all_operators) == 0): + self.populate_operators_and_operands() + if (len(self.all_operators) > 0): + self.compute_metrics() + + def to_dict(self) -> Dict[str, float]: + """Return the metrics as a dictionary.""" + return OrderedDict({ + "Total Operators": self.N1, + "Unique Operators": self.n1, + "Total Operands": self.N2, + "Unique Operands": self.n2, + "Vocabulary": str(self.n1 + self.n2), + "Program Length": str(self.N1 + self.N2), + "Estimated Length": f"{self.S:.0f}", + "Volume": f"{self.V:.0f}", + "Difficulty": f"{self.D:.0f}", + "Effort": f"{self.E:.0f}", + "Time": f"{self.T:.0f}", + "Estimated Bugs": f"{self.B:.3f}", + }) + + def populate_operators_and_operands(self): + """Populate the operators and operands lists.""" + operators = [] + operands = [] + for func in self.contract.functions: + for node in func.nodes: + for operation in node.irs: + # use operation.expression.type to get the unique operator type + encoded_operator = encode_ir_for_halstead(operation) + operators.append(encoded_operator) + + # use operation.used to get the operands of the operation ignoring the temporary variables + operands.extend([ + op for op in operation.used if not isinstance(op, TemporaryVariable) + ]) + self.all_operators.extend(operators) + self.all_operands.extend(operands) + + def compute_metrics(self, all_operators=[], all_operands=[]): + """Compute the Halstead metrics.""" + if len(all_operators) == 0: + all_operators = self.all_operators + all_operands = self.all_operands + + # core metrics + self.n1 = len(set(all_operators)) + self.n2 = len(set(all_operands)) + self.N1 = len(all_operators) + self.N2 = len(all_operands) + if any(number <= 0 for number in [self.n1, self.n2, self.N1, self.N2]): + raise ValueError("n1 and n2 must be greater than 0") + + # extended metrics 1 + self.n = self.n1 + self.n2 + self.N = self.N1 + self.N2 + self.S = self.n1 * math.log2(self.n1) + self.n2 * math.log2(self.n2) + self.V = self.N * math.log2(self.n) + + # extended metrics 2 + self.D = (self.n1 / 2) * (self.N2 / self.n2) + self.E = self.D * self.V + self.T = self.E / 18 + self.B = (self.E ** (2 / 3)) / 3000 + + +@dataclass +class SectionInfo: + """Class to hold the information for a section of the report.""" + title: str + pretty_table: MyPrettyTable + txt: str + + +@dataclass +class HalsteadMetrics: + """Class to hold the Halstead metrics for all contracts. Contains methods useful for reporting. + + There are 3 sections in the report: + 1. Core metrics (n1, n2, N1, N2) + 2. Extended metrics 1 (n, N, S, V) + 3. Extended metrics 2 (D, E, T, B) + + """ + contracts: List[Contract] = field(default_factory=list) + contract_metrics: OrderedDict[Contract, HalsteadContractMetrics] = field(default_factory=OrderedDict) + title: str = "Halstead complexity metrics" + full_txt: str = "" + core: SectionInfo = field(default=SectionInfo) + extended1: SectionInfo = field(default=SectionInfo) + extended2: SectionInfo = field(default=SectionInfo) + CORE_KEYS = ( + "Total Operators", + "Unique Operators", + "Total Operands", + "Unique Operands", + ) + EXTENDED1_KEYS = ( + "Vocabulary", + "Program Length", + "Estimated Length", + "Volume", + ) + EXTENDED2_KEYS = ( + "Difficulty", + "Effort", + "Time", + "Estimated Bugs", + ) + SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( + ("Core", CORE_KEYS), + ("Extended1", EXTENDED1_KEYS), + ("Extended2", EXTENDED2_KEYS), + ) + + + def __post_init__(self): + # Compute the metrics for each contract and for all contracts. + for contract in self.contracts: + self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) + + # If there are more than 1 contract, compute the metrics for all contracts. + if len(self.contracts) > 1: + all_operators = [ + operator for contract in self.contracts + for operator in self.contract_metrics[contract.name].all_operators + ] + all_operands = [ + operand for contract in self.contracts + for operand in self.contract_metrics[contract.name].all_operands + ] + self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics(all_operators=all_operators, all_operands=all_operands) + + # Create the table and text for each section. + data = { + contract.name: self.contract_metrics[contract.name].to_dict() + for contract in self.contracts + } + for (title, keys) in self.SECTIONS: + pretty_table = make_pretty_table(["Contract", *keys], data, False) + section_title = f"{self.title} ({title})" + txt = f"\n\n{section_title}:\n{pretty_table}\n" + self.full_txt += txt + setattr(self, title.lower(), SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt)) From 0fb6e42a9d97833387dc23624f4763b33e9fb8ab Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 12:12:40 -0700 Subject: [PATCH 026/169] chore: lint --- slither/printers/summary/halstead.py | 1 + slither/utils/halstead.py | 72 +++++++++++++++++----------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py index ef446e3896..f5e4f0a90b 100644 --- a/slither/printers/summary/halstead.py +++ b/slither/printers/summary/halstead.py @@ -26,6 +26,7 @@ from slither.printers.abstract_printer import AbstractPrinter from slither.utils.halstead import HalsteadMetrics + class Halstead(AbstractPrinter): ARGUMENT = "halstead" HELP = "Computes the Halstead complexity metrics for each contract" diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index 7417fb4e10..d9835b6be2 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -35,8 +35,10 @@ @dataclass +# pylint: disable=too-many-instance-attributes class HalsteadContractMetrics: """Class to hold the Halstead metrics for a single contract.""" + contract: Contract all_operators: List[str] = field(default_factory=list) all_operands: List[str] = field(default_factory=list) @@ -54,29 +56,31 @@ class HalsteadContractMetrics: B: float = 0 def __post_init__(self): - """ Operators and operands can be passed in as constructor args to avoid computing + """Operators and operands can be passed in as constructor args to avoid computing them based on the contract. Useful for computing metrics for ALL_CONTRACTS""" - if (len(self.all_operators) == 0): + if len(self.all_operators) == 0: self.populate_operators_and_operands() - if (len(self.all_operators) > 0): + if len(self.all_operators) > 0: self.compute_metrics() def to_dict(self) -> Dict[str, float]: """Return the metrics as a dictionary.""" - return OrderedDict({ - "Total Operators": self.N1, - "Unique Operators": self.n1, - "Total Operands": self.N2, - "Unique Operands": self.n2, - "Vocabulary": str(self.n1 + self.n2), - "Program Length": str(self.N1 + self.N2), - "Estimated Length": f"{self.S:.0f}", - "Volume": f"{self.V:.0f}", - "Difficulty": f"{self.D:.0f}", - "Effort": f"{self.E:.0f}", - "Time": f"{self.T:.0f}", - "Estimated Bugs": f"{self.B:.3f}", - }) + return OrderedDict( + { + "Total Operators": self.N1, + "Unique Operators": self.n1, + "Total Operands": self.N2, + "Unique Operands": self.n2, + "Vocabulary": str(self.n1 + self.n2), + "Program Length": str(self.N1 + self.N2), + "Estimated Length": f"{self.S:.0f}", + "Volume": f"{self.V:.0f}", + "Difficulty": f"{self.D:.0f}", + "Effort": f"{self.E:.0f}", + "Time": f"{self.T:.0f}", + "Estimated Bugs": f"{self.B:.3f}", + } + ) def populate_operators_and_operands(self): """Populate the operators and operands lists.""" @@ -90,15 +94,15 @@ def populate_operators_and_operands(self): operators.append(encoded_operator) # use operation.used to get the operands of the operation ignoring the temporary variables - operands.extend([ - op for op in operation.used if not isinstance(op, TemporaryVariable) - ]) + operands.extend( + [op for op in operation.used if not isinstance(op, TemporaryVariable)] + ) self.all_operators.extend(operators) self.all_operands.extend(operands) - def compute_metrics(self, all_operators=[], all_operands=[]): + def compute_metrics(self, all_operators=None, all_operands=None): """Compute the Halstead metrics.""" - if len(all_operators) == 0: + if all_operators is None: all_operators = self.all_operators all_operands = self.all_operands @@ -126,12 +130,14 @@ def compute_metrics(self, all_operators=[], all_operands=[]): @dataclass class SectionInfo: """Class to hold the information for a section of the report.""" + title: str pretty_table: MyPrettyTable txt: str @dataclass +# pylint: disable=too-many-instance-attributes class HalsteadMetrics: """Class to hold the Halstead metrics for all contracts. Contains methods useful for reporting. @@ -141,8 +147,11 @@ class HalsteadMetrics: 3. Extended metrics 2 (D, E, T, B) """ + contracts: List[Contract] = field(default_factory=list) - contract_metrics: OrderedDict[Contract, HalsteadContractMetrics] = field(default_factory=OrderedDict) + contract_metrics: OrderedDict[Contract, HalsteadContractMetrics] = field( + default_factory=OrderedDict + ) title: str = "Halstead complexity metrics" full_txt: str = "" core: SectionInfo = field(default=SectionInfo) @@ -172,7 +181,6 @@ class HalsteadMetrics: ("Extended2", EXTENDED2_KEYS), ) - def __post_init__(self): # Compute the metrics for each contract and for all contracts. for contract in self.contracts: @@ -181,14 +189,18 @@ def __post_init__(self): # If there are more than 1 contract, compute the metrics for all contracts. if len(self.contracts) > 1: all_operators = [ - operator for contract in self.contracts + operator + for contract in self.contracts for operator in self.contract_metrics[contract.name].all_operators ] all_operands = [ - operand for contract in self.contracts + operand + for contract in self.contracts for operand in self.contract_metrics[contract.name].all_operands ] - self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics(all_operators=all_operators, all_operands=all_operands) + self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics( + None, all_operators=all_operators, all_operands=all_operands + ) # Create the table and text for each section. data = { @@ -200,4 +212,8 @@ def __post_init__(self): section_title = f"{self.title} ({title})" txt = f"\n\n{section_title}:\n{pretty_table}\n" self.full_txt += txt - setattr(self, title.lower(), SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt)) + setattr( + self, + title.lower(), + SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), + ) From 8f831ada952e8af8c084712282d6f73ec08afa1d Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 15:00:09 -0700 Subject: [PATCH 027/169] fix: 'type' object is not subscriptable --- slither/utils/halstead.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index d9835b6be2..d781e3c39b 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -149,7 +149,7 @@ class HalsteadMetrics: """ contracts: List[Contract] = field(default_factory=list) - contract_metrics: OrderedDict[Contract, HalsteadContractMetrics] = field( + contract_metrics: OrderedDict = field( default_factory=OrderedDict ) title: str = "Halstead complexity metrics" From 61e3076647bce3dbd2940986fce9863abe63eb38 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 15:15:59 -0700 Subject: [PATCH 028/169] chore: lint --- slither/utils/halstead.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index d781e3c39b..f4426f60a9 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -149,9 +149,7 @@ class HalsteadMetrics: """ contracts: List[Contract] = field(default_factory=list) - contract_metrics: OrderedDict = field( - default_factory=OrderedDict - ) + contract_metrics: OrderedDict = field(default_factory=OrderedDict) title: str = "Halstead complexity metrics" full_txt: str = "" core: SectionInfo = field(default=SectionInfo) From fb25cbb26e4460305b5498ffe0bbfad9d8bb3044 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 15:40:51 -0700 Subject: [PATCH 029/169] refactor: initial --- slither/printers/summary/ck.py | 1 + slither/utils/ck.py | 166 +++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 slither/utils/ck.py diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py index a9f80b3544..fc199dc875 100644 --- a/slither/printers/summary/ck.py +++ b/slither/printers/summary/ck.py @@ -19,6 +19,7 @@ from slither.slithir.operations.high_level_call import HighLevelCall from slither.printers.abstract_printer import AbstractPrinter from slither.printers.summary.martin import compute_coupling +from slither.utils.ck import CKMetrics def compute_dit(contract, depth=0): diff --git a/slither/utils/ck.py b/slither/utils/ck.py new file mode 100644 index 0000000000..d3c5735216 --- /dev/null +++ b/slither/utils/ck.py @@ -0,0 +1,166 @@ +""" +Description + +""" +import math +from dataclasses import dataclass, field +from typing import Tuple, List, Dict +from collections import OrderedDict +from slither.core.declarations import Contract +from slither.slithir.variables.temporary import TemporaryVariable +from slither.utils.myprettytable import make_pretty_table, MyPrettyTable +from slither.utils.upgradeability import encode_ir_for_halstead + + +@dataclass +# pylint: disable=too-many-instance-attributes +class TEMPLATEContractMetrics: + """Class to hold the TEMPLATE metrics for a single contract.""" + + contract: Contract + + def __post_init__(self): + # """Operators and operands can be passed in as constructor args to avoid computing + # them based on the contract. Useful for computing metrics for ALL_CONTRACTS""" + # if len(self.all_operators) == 0: + # self.populate_operators_and_operands() + # if len(self.all_operators) > 0: + # self.compute_metrics() + pass + + def to_dict(self) -> Dict[str, float]: + """Return the metrics as a dictionary.""" + return OrderedDict( + # { + # "Total Operators": self.N1, + # "Unique Operators": self.n1, + # "Total Operands": self.N2, + # "Unique Operands": self.n2, + # "Vocabulary": str(self.n1 + self.n2), + # "Program Length": str(self.N1 + self.N2), + # "Estimated Length": f"{self.S:.0f}", + # "Volume": f"{self.V:.0f}", + # "Difficulty": f"{self.D:.0f}", + # "Effort": f"{self.E:.0f}", + # "Time": f"{self.T:.0f}", + # "Estimated Bugs": f"{self.B:.3f}", + # } + ) + + def compute_metrics(self): + # """Compute the Halstead metrics.""" + # if all_operators is None: + # all_operators = self.all_operators + # all_operands = self.all_operands + + # # core metrics + # self.n1 = len(set(all_operators)) + # self.n2 = len(set(all_operands)) + # self.N1 = len(all_operators) + # self.N2 = len(all_operands) + # if any(number <= 0 for number in [self.n1, self.n2, self.N1, self.N2]): + # raise ValueError("n1 and n2 must be greater than 0") + + # # extended metrics 1 + # self.n = self.n1 + self.n2 + # self.N = self.N1 + self.N2 + # self.S = self.n1 * math.log2(self.n1) + self.n2 * math.log2(self.n2) + # self.V = self.N * math.log2(self.n) + + # # extended metrics 2 + # self.D = (self.n1 / 2) * (self.N2 / self.n2) + # self.E = self.D * self.V + # self.T = self.E / 18 + # self.B = (self.E ** (2 / 3)) / 3000 + pass + + +@dataclass +class SectionInfo: + """Class to hold the information for a section of the report.""" + + title: str + pretty_table: MyPrettyTable + txt: str + + +@dataclass +# pylint: disable=too-many-instance-attributes +class TEMPLATEMetrics: + """Class to hold the TEMPLATE metrics for all contracts. Contains methods useful for reporting. + + There are 3 sections in the report: + 1. Core metrics (n1, n2, N1, N2) + 2. Extended metrics 1 (n, N, S, V) + 3. Extended metrics 2 (D, E, T, B) + + """ + + contracts: List[Contract] = field(default_factory=list) + contract_metrics: OrderedDict = field(default_factory=OrderedDict) + title: str = "Halstead complexity metrics" + full_txt: str = "" + # core: SectionInfo = field(default=SectionInfo) + # extended1: SectionInfo = field(default=SectionInfo) + # extended2: SectionInfo = field(default=SectionInfo) + # CORE_KEYS = ( + # "Total Operators", + # "Unique Operators", + # "Total Operands", + # "Unique Operands", + # ) + # EXTENDED1_KEYS = ( + # "Vocabulary", + # "Program Length", + # "Estimated Length", + # "Volume", + # ) + # EXTENDED2_KEYS = ( + # "Difficulty", + # "Effort", + # "Time", + # "Estimated Bugs", + # ) + # SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( + # ("Core", CORE_KEYS), + # ("Extended1", EXTENDED1_KEYS), + # ("Extended2", EXTENDED2_KEYS), + # ) + + def __post_init__(self): + # # Compute the metrics for each contract and for all contracts. + # for contract in self.contracts: + # self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) + + # # If there are more than 1 contract, compute the metrics for all contracts. + # if len(self.contracts) > 1: + # all_operators = [ + # operator + # for contract in self.contracts + # for operator in self.contract_metrics[contract.name].all_operators + # ] + # all_operands = [ + # operand + # for contract in self.contracts + # for operand in self.contract_metrics[contract.name].all_operands + # ] + # self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics( + # None, all_operators=all_operators, all_operands=all_operands + # ) + pass + + # Create the table and text for each section. + data = { + contract.name: self.contract_metrics[contract.name].to_dict() + for contract in self.contracts + } + for (title, keys) in self.SECTIONS: + pretty_table = make_pretty_table(["Contract", *keys], data, False) + section_title = f"{self.title} ({title})" + txt = f"\n\n{section_title}:\n{pretty_table}\n" + self.full_txt += txt + setattr( + self, + title.lower(), + SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), + ) From 8d2e7c40ee58a4f46e8cb69d659cbef4a388bd6f Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 16:51:38 -0700 Subject: [PATCH 030/169] refactor: prefer custom classes to dicts --- slither/printers/summary/martin.py | 128 ++++++++++++++++++++++++++++- slither/utils/halstead.py | 41 +++++---- 2 files changed, 151 insertions(+), 18 deletions(-) diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py index 693ec15759..56a04f341f 100644 --- a/slither/printers/summary/martin.py +++ b/slither/printers/summary/martin.py @@ -9,9 +9,12 @@ Distance from the Main Sequence (D): abs(A + I - 1) """ -from typing import Tuple +from typing import Tuple, List, Dict +from dataclasses import dataclass, field +from collections import OrderedDict from slither.slithir.operations.high_level_call import HighLevelCall -from slither.utils.myprettytable import make_pretty_table +from slither.core.declarations import Contract +from slither.utils.myprettytable import make_pretty_table, MyPrettyTable from slither.printers.abstract_printer import AbstractPrinter @@ -86,6 +89,117 @@ def compute_coupling(contracts: list, abstractness: float) -> dict: } return coupling_dict +@dataclass +class MartinContractMetrics: + contract: Contract + ca: int + ce: int + abstractness: float + i: float = 0.0 + d: float = 0.0 + + def __post_init__(self): + if self.ce + self.ca > 0: + self.i = float(self.ce / (self.ce + self.ca)) + self.d = float(abs(self.i - self.abstractness)) + + def to_dict(self): + return { + "Dependents": self.ca, + "Dependencies": self.ce, + "Instability": f"{self.i:.2f}", + "Distance from main sequence": f"{self.d:.2f}", + } + +@dataclass +class SectionInfo: + """Class to hold the information for a section of the report.""" + + title: str + pretty_table: MyPrettyTable + txt: str + + +@dataclass +class MartinMetrics: + contracts: List[Contract] = field(default_factory=list) + abstractness: float = 0.0 + contract_metrics: OrderedDict = field(default_factory=OrderedDict) + title: str = "Martin complexity metrics" + full_text: str = "" + core: SectionInfo = field(default=SectionInfo) + CORE_KEYS = ( + "Dependents", + "Dependencies", + "Instability", + "Distance from main sequence", + ) + SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( + ("Core", CORE_KEYS), + ) + + def __post_init__(self): + self.update_abstractness() + self.update_coupling() + self.update_reporting_sections() + + def update_reporting_sections(self): + # Create the table and text for each section. + data = { + contract.name: self.contract_metrics[contract.name].to_dict() + for contract in self.contracts + } + for (title, keys) in self.SECTIONS: + pretty_table = make_pretty_table(["Contract", *keys], data, False) + section_title = f"{self.title} ({title})" + txt = f"\n\n{section_title}:\n" + txt = "Martin agile software metrics\n" + txt += "Efferent Coupling (Ce) - Number of contracts that a contract depends on\n" + txt += "Afferent Coupling (Ca) - Number of contracts that depend on the contract\n" + txt += "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" + txt += "Abstractness (A) - Number of abstract contracts / total number of contracts\n" + txt += "Distance from the Main Sequence (D) - abs(A + I - 1)\n" + txt += "\n" + txt += f"Abstractness (overall): {round(self.abstractness, 2)}\n" + txt += f"{pretty_table}\n" + self.full_text += txt + setattr( + self, + title.lower(), + SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), + ) + + def update_abstractness(self) -> float: + abstract_contract_count = 0 + for c in self.contracts: + if not c.is_fully_implemented: + abstract_contract_count += 1 + self.abstractness = float(abstract_contract_count / len(self.contracts)) + + + def update_coupling(self) -> Dict: + dependencies = {} + for contract in self.contracts: + for func in contract.functions: + high_level_calls = [ + ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) + ] + # convert irs to string with target function and contract name + external_calls = [h.destination.type.type.name for h in high_level_calls] + dependencies[contract.name] = set(external_calls) + dependents = {} + for contract, deps in dependencies.items(): + for dep in deps: + if dep not in dependents: + dependents[dep] = set() + dependents[dep].add(contract) + + coupling_dict = {} + for contract in self.contracts: + ce = len(dependencies.get(contract.name, [])) + ca = len(dependents.get(contract.name, [])) + self.contract_metrics[contract.name] = MartinContractMetrics(contract, ca, ce, self.abstractness) + class Martin(AbstractPrinter): ARGUMENT = "martin" @@ -94,6 +208,16 @@ class Martin(AbstractPrinter): WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#martin" def output(self, _filename): + if len(self.contracts) == 0: + return self.generate_output("No contract found") + + martin = MartinMetrics(self.contracts) + + res = self.generate_output(martin.full_text) + res.add_pretty_table(martin.core.pretty_table, martin.core.title) + self.info(martin.full_text) + + (abstract_contract_count, total_contract_count) = count_abstracts(self.contracts) abstractness = float(abstract_contract_count / total_contract_count) coupling_dict = compute_coupling(self.contracts, abstractness) diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index f4426f60a9..a152474d08 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -151,7 +151,7 @@ class HalsteadMetrics: contracts: List[Contract] = field(default_factory=list) contract_metrics: OrderedDict = field(default_factory=OrderedDict) title: str = "Halstead complexity metrics" - full_txt: str = "" + full_text: str = "" core: SectionInfo = field(default=SectionInfo) extended1: SectionInfo = field(default=SectionInfo) extended2: SectionInfo = field(default=SectionInfo) @@ -181,25 +181,34 @@ class HalsteadMetrics: def __post_init__(self): # Compute the metrics for each contract and for all contracts. + self.update_contract_metrics() + self.add_all_contracts_metrics() + self.update_reporting_sections() + + def update_contract_metrics(self): for contract in self.contracts: self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) + def add_all_contracts_metrics(self): # If there are more than 1 contract, compute the metrics for all contracts. - if len(self.contracts) > 1: - all_operators = [ - operator - for contract in self.contracts - for operator in self.contract_metrics[contract.name].all_operators - ] - all_operands = [ - operand - for contract in self.contracts - for operand in self.contract_metrics[contract.name].all_operands - ] - self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics( - None, all_operators=all_operators, all_operands=all_operands - ) + if len(self.contracts) <= 1: + return + all_operators = [ + operator + for contract in self.contracts + for operator in self.contract_metrics[contract.name].all_operators + ] + all_operands = [ + operand + for contract in self.contracts + for operand in self.contract_metrics[contract.name].all_operands + ] + self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics( + None, all_operators=all_operators, all_operands=all_operands + ) + + def update_reporting_sections(self): # Create the table and text for each section. data = { contract.name: self.contract_metrics[contract.name].to_dict() @@ -209,7 +218,7 @@ def __post_init__(self): pretty_table = make_pretty_table(["Contract", *keys], data, False) section_title = f"{self.title} ({title})" txt = f"\n\n{section_title}:\n{pretty_table}\n" - self.full_txt += txt + self.full_text += txt setattr( self, title.lower(), From c787fb4fbeef2296e1329f01ac32493fbaaac523 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 16:55:37 -0700 Subject: [PATCH 031/169] chore: move Martin logic to utils --- slither/printers/summary/halstead.py | 4 +- slither/printers/summary/martin.py | 211 +-------------------------- slither/utils/martin.py | 130 +++++++++++++++++ 3 files changed, 133 insertions(+), 212 deletions(-) create mode 100644 slither/utils/martin.py diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py index f5e4f0a90b..8144e467f7 100644 --- a/slither/printers/summary/halstead.py +++ b/slither/printers/summary/halstead.py @@ -39,10 +39,10 @@ def output(self, _filename): halstead = HalsteadMetrics(self.contracts) - res = self.generate_output(halstead.full_txt) + res = self.generate_output(halstead.full_text) res.add_pretty_table(halstead.core.pretty_table, halstead.core.title) res.add_pretty_table(halstead.extended1.pretty_table, halstead.extended1.title) res.add_pretty_table(halstead.extended2.pretty_table, halstead.extended2.title) - self.info(halstead.full_txt) + self.info(halstead.full_text) return res diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py index 56a04f341f..66b14fb90c 100644 --- a/slither/printers/summary/martin.py +++ b/slither/printers/summary/martin.py @@ -9,197 +9,8 @@ Distance from the Main Sequence (D): abs(A + I - 1) """ -from typing import Tuple, List, Dict -from dataclasses import dataclass, field -from collections import OrderedDict -from slither.slithir.operations.high_level_call import HighLevelCall -from slither.core.declarations import Contract -from slither.utils.myprettytable import make_pretty_table, MyPrettyTable from slither.printers.abstract_printer import AbstractPrinter - - -def count_abstracts(contracts) -> Tuple[int, int]: - """ - Count the number of abstract contracts - Args: - contracts(list): list of contracts - Returns: - a tuple of (abstract_contract_count, total_contract_count) - """ - abstract_contract_count = 0 - for c in contracts: - if not c.is_fully_implemented: - abstract_contract_count += 1 - return (abstract_contract_count, len(contracts)) - - -def compute_coupling(contracts: list, abstractness: float) -> dict: - """ - Used to compute the coupling between contracts external calls made to internal contracts - Args: - contracts: list of contracts - Returns: - dict of contract names with dicts of the coupling metrics: - { - "contract_name1": { - "Dependents": 0, - "Dependencies": 3 - "Instability": 1.0, - "Abstractness": 0.0, - "Distance from main sequence": 1.0, - }, - "contract_name2": { - "Dependents": 1, - "Dependencies": 0 - "Instability": 0.0, - "Abstractness": 1.0, - "Distance from main sequence": 0.0, - } - """ - dependencies = {} - for contract in contracts: - for func in contract.functions: - high_level_calls = [ - ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) - ] - # convert irs to string with target function and contract name - external_calls = [h.destination.type.type.name for h in high_level_calls] - dependencies[contract.name] = set(external_calls) - dependents = {} - for contract, deps in dependencies.items(): - for dep in deps: - if dep not in dependents: - dependents[dep] = set() - dependents[dep].add(contract) - - coupling_dict = {} - for contract in contracts: - ce = len(dependencies.get(contract.name, [])) - ca = len(dependents.get(contract.name, [])) - i = 0.0 - d = 0.0 - if ce + ca > 0: - i = float(ce / (ce + ca)) - d = float(abs(i - abstractness)) - coupling_dict[contract.name] = { - "Dependents": ca, - "Dependencies": ce, - "Instability": f"{i:.2f}", - "Distance from main sequence": f"{d:.2f}", - } - return coupling_dict - -@dataclass -class MartinContractMetrics: - contract: Contract - ca: int - ce: int - abstractness: float - i: float = 0.0 - d: float = 0.0 - - def __post_init__(self): - if self.ce + self.ca > 0: - self.i = float(self.ce / (self.ce + self.ca)) - self.d = float(abs(self.i - self.abstractness)) - - def to_dict(self): - return { - "Dependents": self.ca, - "Dependencies": self.ce, - "Instability": f"{self.i:.2f}", - "Distance from main sequence": f"{self.d:.2f}", - } - -@dataclass -class SectionInfo: - """Class to hold the information for a section of the report.""" - - title: str - pretty_table: MyPrettyTable - txt: str - - -@dataclass -class MartinMetrics: - contracts: List[Contract] = field(default_factory=list) - abstractness: float = 0.0 - contract_metrics: OrderedDict = field(default_factory=OrderedDict) - title: str = "Martin complexity metrics" - full_text: str = "" - core: SectionInfo = field(default=SectionInfo) - CORE_KEYS = ( - "Dependents", - "Dependencies", - "Instability", - "Distance from main sequence", - ) - SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( - ("Core", CORE_KEYS), - ) - - def __post_init__(self): - self.update_abstractness() - self.update_coupling() - self.update_reporting_sections() - - def update_reporting_sections(self): - # Create the table and text for each section. - data = { - contract.name: self.contract_metrics[contract.name].to_dict() - for contract in self.contracts - } - for (title, keys) in self.SECTIONS: - pretty_table = make_pretty_table(["Contract", *keys], data, False) - section_title = f"{self.title} ({title})" - txt = f"\n\n{section_title}:\n" - txt = "Martin agile software metrics\n" - txt += "Efferent Coupling (Ce) - Number of contracts that a contract depends on\n" - txt += "Afferent Coupling (Ca) - Number of contracts that depend on the contract\n" - txt += "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" - txt += "Abstractness (A) - Number of abstract contracts / total number of contracts\n" - txt += "Distance from the Main Sequence (D) - abs(A + I - 1)\n" - txt += "\n" - txt += f"Abstractness (overall): {round(self.abstractness, 2)}\n" - txt += f"{pretty_table}\n" - self.full_text += txt - setattr( - self, - title.lower(), - SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), - ) - - def update_abstractness(self) -> float: - abstract_contract_count = 0 - for c in self.contracts: - if not c.is_fully_implemented: - abstract_contract_count += 1 - self.abstractness = float(abstract_contract_count / len(self.contracts)) - - - def update_coupling(self) -> Dict: - dependencies = {} - for contract in self.contracts: - for func in contract.functions: - high_level_calls = [ - ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) - ] - # convert irs to string with target function and contract name - external_calls = [h.destination.type.type.name for h in high_level_calls] - dependencies[contract.name] = set(external_calls) - dependents = {} - for contract, deps in dependencies.items(): - for dep in deps: - if dep not in dependents: - dependents[dep] = set() - dependents[dep].add(contract) - - coupling_dict = {} - for contract in self.contracts: - ce = len(dependencies.get(contract.name, [])) - ca = len(dependents.get(contract.name, [])) - self.contract_metrics[contract.name] = MartinContractMetrics(contract, ca, ce, self.abstractness) - +from slither.utils.martin import MartinMetrics class Martin(AbstractPrinter): ARGUMENT = "martin" @@ -216,24 +27,4 @@ def output(self, _filename): res = self.generate_output(martin.full_text) res.add_pretty_table(martin.core.pretty_table, martin.core.title) self.info(martin.full_text) - - - (abstract_contract_count, total_contract_count) = count_abstracts(self.contracts) - abstractness = float(abstract_contract_count / total_contract_count) - coupling_dict = compute_coupling(self.contracts, abstractness) - - table = make_pretty_table( - ["Contract", *list(coupling_dict[self.contracts[0].name].keys())], coupling_dict - ) - txt = "Martin agile software metrics\n" - txt += "Efferent Coupling (Ce) - Number of contracts that a contract depends on\n" - txt += "Afferent Coupling (Ca) - Number of contracts that depend on the contract\n" - txt += "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" - txt += "Abstractness (A) - Number of abstract contracts / total number of contracts\n" - txt += "Distance from the Main Sequence (D) - abs(A + I - 1)\n" - txt += "\n" - txt += f"Abstractness (overall): {round(abstractness, 2)}\n" + str(table) - self.info(txt) - res = self.generate_output(txt) - res.add_pretty_table(table, "Code Lines") return res diff --git a/slither/utils/martin.py b/slither/utils/martin.py new file mode 100644 index 0000000000..2ca38473d1 --- /dev/null +++ b/slither/utils/martin.py @@ -0,0 +1,130 @@ +""" + Robert "Uncle Bob" Martin - Agile software metrics + https://en.wikipedia.org/wiki/Software_package_metrics + + Efferent Coupling (Ce): Number of contracts that the contract depends on + Afferent Coupling (Ca): Number of contracts that depend on a contract + Instability (I): Ratio of efferent coupling to total coupling (Ce / (Ce + Ca)) + Abstractness (A): Number of abstract contracts / total number of contracts + Distance from the Main Sequence (D): abs(A + I - 1) + +""" +from typing import Tuple, List, Dict +from dataclasses import dataclass, field +from collections import OrderedDict +from slither.slithir.operations.high_level_call import HighLevelCall +from slither.core.declarations import Contract +from slither.utils.myprettytable import make_pretty_table, MyPrettyTable + + +@dataclass +class MartinContractMetrics: + contract: Contract + ca: int + ce: int + abstractness: float + i: float = 0.0 + d: float = 0.0 + + def __post_init__(self): + if self.ce + self.ca > 0: + self.i = float(self.ce / (self.ce + self.ca)) + self.d = float(abs(self.i - self.abstractness)) + + def to_dict(self): + return { + "Dependents": self.ca, + "Dependencies": self.ce, + "Instability": f"{self.i:.2f}", + "Distance from main sequence": f"{self.d:.2f}", + } + +@dataclass +class SectionInfo: + """Class to hold the information for a section of the report.""" + + title: str + pretty_table: MyPrettyTable + txt: str + + +@dataclass +class MartinMetrics: + contracts: List[Contract] = field(default_factory=list) + abstractness: float = 0.0 + contract_metrics: OrderedDict = field(default_factory=OrderedDict) + title: str = "Martin complexity metrics" + full_text: str = "" + core: SectionInfo = field(default=SectionInfo) + CORE_KEYS = ( + "Dependents", + "Dependencies", + "Instability", + "Distance from main sequence", + ) + SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( + ("Core", CORE_KEYS), + ) + + def __post_init__(self): + self.update_abstractness() + self.update_coupling() + self.update_reporting_sections() + + def update_reporting_sections(self): + # Create the table and text for each section. + data = { + contract.name: self.contract_metrics[contract.name].to_dict() + for contract in self.contracts + } + for (title, keys) in self.SECTIONS: + pretty_table = make_pretty_table(["Contract", *keys], data, False) + section_title = f"{self.title} ({title})" + txt = f"\n\n{section_title}:\n" + txt = "Martin agile software metrics\n" + txt += "Efferent Coupling (Ce) - Number of contracts that a contract depends on\n" + txt += "Afferent Coupling (Ca) - Number of contracts that depend on the contract\n" + txt += "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" + txt += "Abstractness (A) - Number of abstract contracts / total number of contracts\n" + txt += "Distance from the Main Sequence (D) - abs(A + I - 1)\n" + txt += "\n" + txt += f"Abstractness (overall): {round(self.abstractness, 2)}\n" + txt += f"{pretty_table}\n" + self.full_text += txt + setattr( + self, + title.lower(), + SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), + ) + + def update_abstractness(self) -> float: + abstract_contract_count = 0 + for c in self.contracts: + if not c.is_fully_implemented: + abstract_contract_count += 1 + self.abstractness = float(abstract_contract_count / len(self.contracts)) + + + def update_coupling(self) -> Dict: + dependencies = {} + for contract in self.contracts: + for func in contract.functions: + high_level_calls = [ + ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) + ] + # convert irs to string with target function and contract name + external_calls = [h.destination.type.type.name for h in high_level_calls] + dependencies[contract.name] = set(external_calls) + dependents = {} + for contract, deps in dependencies.items(): + for dep in deps: + if dep not in dependents: + dependents[dep] = set() + dependents[dep].add(contract) + + coupling_dict = {} + for contract in self.contracts: + ce = len(dependencies.get(contract.name, [])) + ca = len(dependents.get(contract.name, [])) + self.contract_metrics[contract.name] = MartinContractMetrics(contract, ca, ce, self.abstractness) + From 2e99e498f0d82d01de92ad38e763773d7e365beb Mon Sep 17 00:00:00 2001 From: devtooligan Date: Thu, 6 Jul 2023 16:59:57 -0700 Subject: [PATCH 032/169] chore: lint --- slither/printers/summary/martin.py | 1 + slither/utils/halstead.py | 1 - slither/utils/martin.py | 21 ++++++++++++--------- slither/utils/myprettytable.py | 1 + 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py index 66b14fb90c..c49e63fcb5 100644 --- a/slither/printers/summary/martin.py +++ b/slither/printers/summary/martin.py @@ -12,6 +12,7 @@ from slither.printers.abstract_printer import AbstractPrinter from slither.utils.martin import MartinMetrics + class Martin(AbstractPrinter): ARGUMENT = "martin" HELP = "Martin agile software metrics (Ca, Ce, I, A, D)" diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index a152474d08..93552c9cd3 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -207,7 +207,6 @@ def add_all_contracts_metrics(self): None, all_operators=all_operators, all_operands=all_operands ) - def update_reporting_sections(self): # Create the table and text for each section. data = { diff --git a/slither/utils/martin.py b/slither/utils/martin.py index 2ca38473d1..ded8c0efa3 100644 --- a/slither/utils/martin.py +++ b/slither/utils/martin.py @@ -39,6 +39,7 @@ def to_dict(self): "Distance from main sequence": f"{self.d:.2f}", } + @dataclass class SectionInfo: """Class to hold the information for a section of the report.""" @@ -62,9 +63,7 @@ class MartinMetrics: "Instability", "Distance from main sequence", ) - SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( - ("Core", CORE_KEYS), - ) + SECTIONS: Tuple[Tuple[str, Tuple[str]]] = (("Core", CORE_KEYS),) def __post_init__(self): self.update_abstractness() @@ -84,7 +83,9 @@ def update_reporting_sections(self): txt = "Martin agile software metrics\n" txt += "Efferent Coupling (Ce) - Number of contracts that a contract depends on\n" txt += "Afferent Coupling (Ca) - Number of contracts that depend on the contract\n" - txt += "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" + txt += ( + "Instability (I) - Ratio of efferent coupling to total coupling (Ce / (Ce + Ca))\n" + ) txt += "Abstractness (A) - Number of abstract contracts / total number of contracts\n" txt += "Distance from the Main Sequence (D) - abs(A + I - 1)\n" txt += "\n" @@ -104,13 +105,15 @@ def update_abstractness(self) -> float: abstract_contract_count += 1 self.abstractness = float(abstract_contract_count / len(self.contracts)) - def update_coupling(self) -> Dict: dependencies = {} for contract in self.contracts: for func in contract.functions: high_level_calls = [ - ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) + ir + for node in func.nodes + for ir in node.irs_ssa + if isinstance(ir, HighLevelCall) ] # convert irs to string with target function and contract name external_calls = [h.destination.type.type.name for h in high_level_calls] @@ -122,9 +125,9 @@ def update_coupling(self) -> Dict: dependents[dep] = set() dependents[dep].add(contract) - coupling_dict = {} for contract in self.contracts: ce = len(dependencies.get(contract.name, [])) ca = len(dependents.get(contract.name, [])) - self.contract_metrics[contract.name] = MartinContractMetrics(contract, ca, ce, self.abstractness) - + self.contract_metrics[contract.name] = MartinContractMetrics( + contract, ca, ce, self.abstractness + ) diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index b33164894a..e45edeaf13 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -26,6 +26,7 @@ def __str__(self) -> str: # **Dict to MyPrettyTable utility functions** + def make_pretty_table(headers: list, body: dict, totals: bool = False) -> MyPrettyTable: """ Converts a dict to a MyPrettyTable. Dict keys are the row headers. From 8c51e47a42d25d00379d3c883f4a876c62122315 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 11:25:51 -0700 Subject: [PATCH 033/169] Update scripts/ci_test_printers.sh Co-authored-by: alpharush <0xalpharush@protonmail.com> --- scripts/ci_test_printers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci_test_printers.sh b/scripts/ci_test_printers.sh index 90d1b0e038..329c415c6e 100755 --- a/scripts/ci_test_printers.sh +++ b/scripts/ci_test_printers.sh @@ -5,7 +5,7 @@ cd tests/e2e/solc_parsing/test_data/compile/ || exit # Do not test the evm printer,as it needs a refactoring -ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc, slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" +ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" # Only test 0.5.17 to limit test time for file in *0.5.17-compact.zip; do From 56993490dd1de85a2fa1bde1d97cd17989beb1c5 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 11:29:22 -0700 Subject: [PATCH 034/169] fix: typo --- scripts/ci_test_printers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci_test_printers.sh b/scripts/ci_test_printers.sh index 90d1b0e038..329c415c6e 100755 --- a/scripts/ci_test_printers.sh +++ b/scripts/ci_test_printers.sh @@ -5,7 +5,7 @@ cd tests/e2e/solc_parsing/test_data/compile/ || exit # Do not test the evm printer,as it needs a refactoring -ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc, slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" +ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" # Only test 0.5.17 to limit test time for file in *0.5.17-compact.zip; do From 4a3ab0a6538e0ecd6f562449a095722fe95a91c8 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 11:30:39 -0700 Subject: [PATCH 035/169] fix: add martin printer to testing printer list --- scripts/ci_test_printers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci_test_printers.sh b/scripts/ci_test_printers.sh index 329c415c6e..e7310700e5 100755 --- a/scripts/ci_test_printers.sh +++ b/scripts/ci_test_printers.sh @@ -5,7 +5,7 @@ cd tests/e2e/solc_parsing/test_data/compile/ || exit # Do not test the evm printer,as it needs a refactoring -ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" +ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc,martin,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" # Only test 0.5.17 to limit test time for file in *0.5.17-compact.zip; do From 42cd6e0ecfae92f31d57ae1316b62925e3007ede Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 12:13:22 -0700 Subject: [PATCH 036/169] fix: account for case w no functions --- slither/utils/halstead.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index f4426f60a9..829dc8035c 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -86,6 +86,8 @@ def populate_operators_and_operands(self): """Populate the operators and operands lists.""" operators = [] operands = [] + if not hasattr(self.contract, "functions"): + return for func in self.contract.functions: for node in func.nodes: for operation in node.irs: From 8d483ed471a7c630f8a4c0b694a2d7e2d196f4c2 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 12:37:07 -0700 Subject: [PATCH 037/169] fix: external calls --- slither/utils/martin.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/slither/utils/martin.py b/slither/utils/martin.py index ded8c0efa3..16e3e13e80 100644 --- a/slither/utils/martin.py +++ b/slither/utils/martin.py @@ -105,9 +105,11 @@ def update_abstractness(self) -> float: abstract_contract_count += 1 self.abstractness = float(abstract_contract_count / len(self.contracts)) + # pylint: disable=too-many-branches def update_coupling(self) -> Dict: dependencies = {} for contract in self.contracts: + external_calls = [] for func in contract.functions: high_level_calls = [ ir @@ -116,7 +118,27 @@ def update_coupling(self) -> Dict: if isinstance(ir, HighLevelCall) ] # convert irs to string with target function and contract name - external_calls = [h.destination.type.type.name for h in high_level_calls] + # Get the target contract name for each high level call + new_external_calls = [] + for high_level_call in high_level_calls: + if isinstance(high_level_call.destination, Contract): + new_external_call = high_level_call.destination.name + elif isinstance(high_level_call.destination, str): + new_external_call = high_level_call.destination + elif not hasattr(high_level_call.destination, "type"): + continue + elif isinstance(high_level_call.destination.type, Contract): + new_external_call = high_level_call.destination.type.name + elif isinstance(high_level_call.destination.type, str): + new_external_call = high_level_call.destination.type + elif not hasattr(high_level_call.destination.type, "type"): + continue + if isinstance(high_level_call.destination.type.type, Contract): + new_external_call = high_level_call.destination.type.type.name + if isinstance(high_level_call.destination.type.type, str): + new_external_call = high_level_call.destination.type.type + new_external_calls.append(new_external_call) + external_calls.extend(new_external_calls) dependencies[contract.name] = set(external_calls) dependents = {} for contract, deps in dependencies.items(): From 6843d03da43a984698ad493efe3de262246520e4 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 12:37:07 -0700 Subject: [PATCH 038/169] fix: external calls --- slither/utils/martin.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/slither/utils/martin.py b/slither/utils/martin.py index ded8c0efa3..7d39b2c14a 100644 --- a/slither/utils/martin.py +++ b/slither/utils/martin.py @@ -105,9 +105,11 @@ def update_abstractness(self) -> float: abstract_contract_count += 1 self.abstractness = float(abstract_contract_count / len(self.contracts)) + # pylint: disable=too-many-branches def update_coupling(self) -> Dict: dependencies = {} for contract in self.contracts: + external_calls = [] for func in contract.functions: high_level_calls = [ ir @@ -116,7 +118,29 @@ def update_coupling(self) -> Dict: if isinstance(ir, HighLevelCall) ] # convert irs to string with target function and contract name - external_calls = [h.destination.type.type.name for h in high_level_calls] + # Get the target contract name for each high level call + new_external_calls = [] + for high_level_call in high_level_calls: + if isinstance(high_level_call.destination, Contract): + new_external_call = high_level_call.destination.name + elif isinstance(high_level_call.destination, str): + new_external_call = high_level_call.destination + elif not hasattr(high_level_call.destination, "type"): + continue + elif isinstance(high_level_call.destination.type, Contract): + new_external_call = high_level_call.destination.type.name + elif isinstance(high_level_call.destination.type, str): + new_external_call = high_level_call.destination.type + elif not hasattr(high_level_call.destination.type, "type"): + continue + elif isinstance(high_level_call.destination.type.type, Contract): + new_external_call = high_level_call.destination.type.type.name + elif isinstance(high_level_call.destination.type.type, str): + new_external_call = high_level_call.destination.type.type + else: + continue + new_external_calls.append(new_external_call) + external_calls.extend(new_external_calls) dependencies[contract.name] = set(external_calls) dependents = {} for contract, deps in dependencies.items(): From a35dff3a15b47ca75391029838aeddf5a6175ce2 Mon Sep 17 00:00:00 2001 From: devtooligan Date: Fri, 7 Jul 2023 16:31:36 -0700 Subject: [PATCH 039/169] refactor: ck --- slither/printers/summary/ck.py | 269 ++------------------- slither/utils/ck.py | 413 ++++++++++++++++++++++++--------- slither/utils/halstead.py | 18 +- slither/utils/martin.py | 6 +- slither/utils/myprettytable.py | 1 + 5 files changed, 334 insertions(+), 373 deletions(-) diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py index 27f6dd06d5..f7a8510391 100644 --- a/slither/printers/summary/ck.py +++ b/slither/printers/summary/ck.py @@ -14,214 +14,24 @@ During the calculation of the metrics above, there are a number of other intermediate metrics that are calculated. These are also included in the output: - TODO!!! + - State variables: total number of state variables + - Constants: total number of constants + - Immutables: total number of immutables + - Public: total number of public functions + - External: total number of external functions + - Internal: total number of internal functions + - Private: total number of private functions + - Mutating: total number of state mutating functions + - View: total number of view functions + - Pure: total number of pure functions + - External mutating: total number of external mutating functions + - No auth or onlyOwner: total number of functions without auth or onlyOwner modifiers + - No modifiers: total number of functions without modifiers + - Ext calls: total number of external calls """ -from typing import Tuple -from slither.utils.colors import bold -from slither.utils.myprettytable import make_pretty_table -from slither.slithir.operations.high_level_call import HighLevelCall from slither.printers.abstract_printer import AbstractPrinter -from slither.utils.martin import MartinMetrics - - -def compute_dit(contract, depth=0): - """ - Recursively compute the depth of inheritance tree (DIT) of a contract - Args: - contract: Contract - the contract to compute the DIT for - depth: int - the depth of the contract in the inheritance tree - Returns: - the depth of the contract in the inheritance tree - """ - if not contract.inheritance: - return depth - max_dit = depth - for inherited_contract in contract.inheritance: - dit = compute_dit(inherited_contract, depth + 1) - max_dit = max(max_dit, dit) - return max_dit - - -# pylint: disable=too-many-locals -def compute_metrics(contracts): - """ - Compute CK metrics of a contract - Args: - contracts(list): list of contracts - Returns: - a tuple of (metrics1, metrics2, metrics3, metrics4, metrics5) - # Visbility - metrics1["contract name"] = { - "State variables":int, - "Constants":int, - "Immutables":int, - } - metrics2["contract name"] = { - "Public": int, - "External":int, - "Internal":int, - "Private":int, - } - # Mutability - metrics3["contract name"] = { - "Mutating":int, - "View":int, - "Pure":int, - } - # External facing, mutating: total / no auth / no modifiers - metrics4["contract name"] = { - "External mutating":int, - "No auth or onlyOwner":int, - "No modifiers":int, - } - metrics5["contract name"] = { - "Ext calls":int, - "Response For a Class":int, - "NOC":int, - "DIT":int, - } - - RFC is counted as follows: - +1 for each public or external fn - +1 for each public getter - +1 for each UNIQUE external call - - """ - metrics1 = {} - metrics2 = {} - metrics3 = {} - metrics4 = {} - metrics5 = {} - dependents = { - inherited.name: { - contract.name for contract in contracts if inherited.name in contract.inheritance - } - for inherited in contracts - } - - # Use MartinMetrics to compute Ca and Ce - martin = MartinMetrics(contracts) - - for contract in contracts: - (state_variables, constants, immutables, public_getters) = count_variables(contract) - rfc = public_getters # add 1 for each public getter - metrics1[contract.name] = { - "State variables": state_variables, - "Constants": constants, - "Immutables": immutables, - } - metrics2[contract.name] = { - "Public": 0, - "External": 0, - "Internal": 0, - "Private": 0, - } - metrics3[contract.name] = { - "Mutating": 0, - "View": 0, - "Pure": 0, - } - metrics4[contract.name] = { - "External mutating": 0, - "No auth or onlyOwner": 0, - "No modifiers": 0, - } - metrics5[contract.name] = { - "Ext calls": 0, - "RFC": 0, - "NOC": len(dependents[contract.name]), - "DIT": compute_dit(contract), - "CBO": coupling[contract.name]["Dependents"] + coupling[contract.name]["Dependencies"], - } - for func in contract.functions: - if func.name == "constructor": - continue - pure = func.pure - view = not pure and func.view - mutating = not pure and not view - external = func.visibility == "external" - public = func.visibility == "public" - internal = func.visibility == "internal" - private = func.visibility == "private" - external_public_mutating = external or public and mutating - external_no_auth = external_public_mutating and no_auth(func) - external_no_modifiers = external_public_mutating and len(func.modifiers) == 0 - if external or public: - rfc += 1 - - high_level_calls = [ - ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) - ] - - # convert irs to string with target function and contract name - external_calls = [] - for high_level_call in high_level_calls: - if hasattr(high_level_call.destination, "name"): - external_calls.append( - f"{high_level_call.function_name}{high_level_call.destination.name}" - ) - else: - external_calls.append( - f"{high_level_call.function_name}{high_level_call.destination.type.type.name}" - ) - - rfc += len(set(external_calls)) - - metrics2[contract.name]["Public"] += 1 if public else 0 - metrics2[contract.name]["External"] += 1 if external else 0 - metrics2[contract.name]["Internal"] += 1 if internal else 0 - metrics2[contract.name]["Private"] += 1 if private else 0 - - metrics3[contract.name]["Mutating"] += 1 if mutating else 0 - metrics3[contract.name]["View"] += 1 if view else 0 - metrics3[contract.name]["Pure"] += 1 if pure else 0 - - metrics4[contract.name]["External mutating"] += 1 if external_public_mutating else 0 - metrics4[contract.name]["No auth or onlyOwner"] += 1 if external_no_auth else 0 - metrics4[contract.name]["No modifiers"] += 1 if external_no_modifiers else 0 - - metrics5[contract.name]["Ext calls"] += len(external_calls) - metrics5[contract.name]["RFC"] = rfc - - return metrics1, metrics2, metrics3, metrics4, metrics5 - - -def count_variables(contract) -> Tuple[int, int, int, int]: - """Count the number of variables in a contract - Args: - contract(core.declarations.contract.Contract): contract to count variables - Returns: - Tuple of (state_variable_count, constant_count, immutable_count, public_getter) - """ - state_variable_count = 0 - constant_count = 0 - immutable_count = 0 - public_getter = 0 - for var in contract.variables: - if var.is_constant: - constant_count += 1 - elif var.is_immutable: - immutable_count += 1 - else: - state_variable_count += 1 - if var.visibility == "Public": - public_getter += 1 - return (state_variable_count, constant_count, immutable_count, public_getter) - - -def no_auth(func) -> bool: - """ - Check if a function has no auth or only_owner modifiers - Args: - func(core.declarations.function.Function): function to check - Returns: - bool - """ - for modifier in func.modifiers: - if "auth" in modifier.name or "only_owner" in modifier.name: - return False - return True +from slither.utils.ck import CKMetrics class CK(AbstractPrinter): @@ -233,48 +43,15 @@ class CK(AbstractPrinter): def output(self, _filename): if len(self.contracts) == 0: return self.generate_output("No contract found") - metrics1, metrics2, metrics3, metrics4, metrics5 = compute_metrics(self.contracts) - txt = bold("\nCK complexity metrics\n") - # metrics2: variable counts - txt += bold("\nVariables\n") - keys = list(metrics1[self.contracts[0].name].keys()) - table0 = make_pretty_table(["Contract", *keys], metrics1, True) - txt += str(table0) + "\n" - - # metrics3: function visibility - txt += bold("\nFunction visibility\n") - keys = list(metrics2[self.contracts[0].name].keys()) - table1 = make_pretty_table(["Contract", *keys], metrics2, True) - txt += str(table1) + "\n" - - # metrics4: function mutability counts - txt += bold("\nState mutability\n") - keys = list(metrics3[self.contracts[0].name].keys()) - table2 = make_pretty_table(["Contract", *keys], metrics3, True) - txt += str(table2) + "\n" - - # metrics5: external facing mutating functions - txt += bold("\nExternal/Public functions with modifiers\n") - keys = list(metrics4[self.contracts[0].name].keys()) - table3 = make_pretty_table(["Contract", *keys], metrics4, True) - txt += str(table3) + "\n" - # metrics5: ext calls and ck metrics - txt += bold("\nExternal calls and CK Metrics:\n") - txt += bold("Response For a Class (RFC)\n") - txt += bold("Number of Children (NOC)\n") - txt += bold("Depth of Inheritance Tree (DIT)\n") - txt += bold("Coupling Between Object Classes (CBO)\n") - keys = list(metrics5[self.contracts[0].name].keys()) - table4 = make_pretty_table(["Contract", *keys], metrics5, False) - txt += str(table4) + "\n" + ck = CKMetrics(self.contracts) - res = self.generate_output(txt) - res.add_pretty_table(table0, "CK complexity core metrics 1/5") - res.add_pretty_table(table1, "CK complexity core metrics 2/5") - res.add_pretty_table(table2, "CK complexity core metrics 3/5") - res.add_pretty_table(table3, "CK complexity core metrics 4/5") - res.add_pretty_table(table4, "CK complexity core metrics 5/5") - self.info(txt) + res = self.generate_output(ck.full_text) + res.add_pretty_table(ck.auxiliary1.pretty_table, ck.auxiliary1.title) + res.add_pretty_table(ck.auxiliary2.pretty_table, ck.auxiliary2.title) + res.add_pretty_table(ck.auxiliary3.pretty_table, ck.auxiliary3.title) + res.add_pretty_table(ck.auxiliary4.pretty_table, ck.auxiliary4.title) + res.add_pretty_table(ck.core.pretty_table, ck.core.title) + self.info(ck.full_text) return res diff --git a/slither/utils/ck.py b/slither/utils/ck.py index d3c5735216..7b0d1afd90 100644 --- a/slither/utils/ck.py +++ b/slither/utils/ck.py @@ -1,79 +1,239 @@ """ -Description + CK Metrics are a suite of six software metrics proposed by Chidamber and Kemerer in 1994. + These metrics are used to measure the complexity of a class. + https://en.wikipedia.org/wiki/Programming_complexity + + - Response For a Class (RFC) is a metric that measures the number of unique method calls within a class. + - Number of Children (NOC) is a metric that measures the number of children a class has. + - Depth of Inheritance Tree (DIT) is a metric that measures the number of parent classes a class has. + - Coupling Between Object Classes (CBO) is a metric that measures the number of classes a class is coupled to. + + Not implemented: + - Lack of Cohesion of Methods (LCOM) is a metric that measures the lack of cohesion in methods. + - Weighted Methods per Class (WMC) is a metric that measures the complexity of a class. + + During the calculation of the metrics above, there are a number of other intermediate metrics that are calculated. + These are also included in the output: + - State variables: total number of state variables + - Constants: total number of constants + - Immutables: total number of immutables + - Public: total number of public functions + - External: total number of external functions + - Internal: total number of internal functions + - Private: total number of private functions + - Mutating: total number of state mutating functions + - View: total number of view functions + - Pure: total number of pure functions + - External mutating: total number of external mutating functions + - No auth or onlyOwner: total number of functions without auth or onlyOwner modifiers + - No modifiers: total number of functions without modifiers + - Ext calls: total number of external calls """ -import math -from dataclasses import dataclass, field -from typing import Tuple, List, Dict from collections import OrderedDict +from typing import Tuple, List, Dict +from dataclasses import dataclass, field +from slither.utils.colors import bold from slither.core.declarations import Contract -from slither.slithir.variables.temporary import TemporaryVariable from slither.utils.myprettytable import make_pretty_table, MyPrettyTable -from slither.utils.upgradeability import encode_ir_for_halstead +from slither.utils.martin import MartinMetrics +from slither.slithir.operations.high_level_call import HighLevelCall + + +# Utility functions + + +def compute_dit(contract: Contract, depth: int = 0) -> int: + """ + Recursively compute the depth of inheritance tree (DIT) of a contract + Args: + contract(core.declarations.contract.Contract): contract to compute DIT for + depth(int): current depth of the contract + Returns: + int: depth of the contract + """ + if not contract.inheritance: + return depth + max_dit = depth + for inherited_contract in contract.inheritance: + dit = compute_dit(inherited_contract, depth + 1) + max_dit = max(max_dit, dit) + return max_dit + + +def has_auth(func) -> bool: + """ + Check if a function has no auth or only_owner modifiers + Args: + func(core.declarations.function.Function): function to check + Returns: + bool True if it does have auth or only_owner modifiers + """ + for modifier in func.modifiers: + if "auth" in modifier.name or "only_owner" in modifier.name: + return True + return False + + +# Utility classes for calculating CK metrics @dataclass # pylint: disable=too-many-instance-attributes -class TEMPLATEContractMetrics: - """Class to hold the TEMPLATE metrics for a single contract.""" +class CKContractMetrics: + """Class to hold the CK metrics for a single contract.""" contract: Contract + # Used to calculate CBO - should be passed in as a constructor arg + martin_metrics: Dict + + # Used to calculate NOC + dependents: Dict + + state_variables: int = 0 + constants: int = 0 + immutables: int = 0 + public: int = 0 + external: int = 0 + internal: int = 0 + private: int = 0 + mutating: int = 0 + view: int = 0 + pure: int = 0 + external_mutating: int = 0 + no_auth_or_only_owner: int = 0 + no_modifiers: int = 0 + ext_calls: int = 0 + rfc: int = 0 + noc: int = 0 + dit: int = 0 + cbo: int = 0 + def __post_init__(self): - # """Operators and operands can be passed in as constructor args to avoid computing - # them based on the contract. Useful for computing metrics for ALL_CONTRACTS""" - # if len(self.all_operators) == 0: - # self.populate_operators_and_operands() - # if len(self.all_operators) > 0: - # self.compute_metrics() - pass + if not hasattr(self.contract, "functions"): + return + self.count_variables() + self.noc = len(self.dependents[self.contract.name]) + self.dit = compute_dit(self.contract) + self.cbo = ( + self.martin_metrics[self.contract.name].ca + self.martin_metrics[self.contract.name].ce + ) + self.calculate_metrics() + + # pylint: disable=too-many-locals + # pylint: disable=too-many-branches + def calculate_metrics(self): + """Calculate the metrics for a contract""" + rfc = self.public # initialize with public getter count + for func in self.contract.functions: + if func.name == "constructor": + continue + pure = func.pure + view = not pure and func.view + mutating = not pure and not view + external = func.visibility == "external" + public = func.visibility == "public" + internal = func.visibility == "internal" + private = func.visibility == "private" + external_public_mutating = external or public and mutating + external_no_auth = external_public_mutating and not has_auth(func) + external_no_modifiers = external_public_mutating and len(func.modifiers) == 0 + if external or public: + rfc += 1 + + high_level_calls = [ + ir for node in func.nodes for ir in node.irs_ssa if isinstance(ir, HighLevelCall) + ] + + # convert irs to string with target function and contract name + external_calls = [] + for high_level_call in high_level_calls: + if isinstance(high_level_call.destination, Contract): + destination_contract = high_level_call.destination.name + elif isinstance(high_level_call.destination, str): + destination_contract = high_level_call.destination + elif not hasattr(high_level_call.destination, "type"): + continue + elif isinstance(high_level_call.destination.type, Contract): + destination_contract = high_level_call.destination.type.name + elif isinstance(high_level_call.destination.type, str): + destination_contract = high_level_call.destination.type + elif not hasattr(high_level_call.destination.type, "type"): + continue + elif isinstance(high_level_call.destination.type.type, Contract): + destination_contract = high_level_call.destination.type.type.name + elif isinstance(high_level_call.destination.type.type, str): + destination_contract = high_level_call.destination.type.type + else: + continue + external_calls.append(f"{high_level_call.function_name}{destination_contract}") + rfc += len(set(external_calls)) + + self.public += public + self.external += external + self.internal += internal + self.private += private + + self.mutating += mutating + self.view += view + self.pure += pure + + self.external_mutating += external_public_mutating + self.no_auth_or_only_owner += external_no_auth + self.no_modifiers += external_no_modifiers + + self.ext_calls += len(external_calls) + self.rfc = rfc + + def count_variables(self): + """Count the number of variables in a contract""" + state_variable_count = 0 + constant_count = 0 + immutable_count = 0 + public_getter_count = 0 + for variable in self.contract.variables: + if variable.is_constant: + constant_count += 1 + elif variable.is_immutable: + immutable_count += 1 + else: + state_variable_count += 1 + if variable.visibility == "Public": + public_getter_count += 1 + self.state_variables = state_variable_count + self.constants = constant_count + self.immutables = immutable_count + + # initialize RFC with public getter count + # self.public is used count public functions not public variables + self.rfc = public_getter_count def to_dict(self) -> Dict[str, float]: """Return the metrics as a dictionary.""" return OrderedDict( - # { - # "Total Operators": self.N1, - # "Unique Operators": self.n1, - # "Total Operands": self.N2, - # "Unique Operands": self.n2, - # "Vocabulary": str(self.n1 + self.n2), - # "Program Length": str(self.N1 + self.N2), - # "Estimated Length": f"{self.S:.0f}", - # "Volume": f"{self.V:.0f}", - # "Difficulty": f"{self.D:.0f}", - # "Effort": f"{self.E:.0f}", - # "Time": f"{self.T:.0f}", - # "Estimated Bugs": f"{self.B:.3f}", - # } + { + "State variables": self.state_variables, + "Constants": self.constants, + "Immutables": self.immutables, + "Public": self.public, + "External": self.external, + "Internal": self.internal, + "Private": self.private, + "Mutating": self.mutating, + "View": self.view, + "Pure": self.pure, + "External mutating": self.external_mutating, + "No auth or onlyOwner": self.no_auth_or_only_owner, + "No modifiers": self.no_modifiers, + "Ext calls": self.ext_calls, + "RFC": self.rfc, + "NOC": self.noc, + "DIT": self.dit, + "CBO": self.cbo, + } ) - def compute_metrics(self): - # """Compute the Halstead metrics.""" - # if all_operators is None: - # all_operators = self.all_operators - # all_operands = self.all_operands - - # # core metrics - # self.n1 = len(set(all_operators)) - # self.n2 = len(set(all_operands)) - # self.N1 = len(all_operators) - # self.N2 = len(all_operands) - # if any(number <= 0 for number in [self.n1, self.n2, self.N1, self.N2]): - # raise ValueError("n1 and n2 must be greater than 0") - - # # extended metrics 1 - # self.n = self.n1 + self.n2 - # self.N = self.N1 + self.N2 - # self.S = self.n1 * math.log2(self.n1) + self.n2 * math.log2(self.n2) - # self.V = self.N * math.log2(self.n) - - # # extended metrics 2 - # self.D = (self.n1 / 2) * (self.N2 / self.n2) - # self.E = self.D * self.V - # self.T = self.E / 18 - # self.B = (self.E ** (2 / 3)) / 3000 - pass - @dataclass class SectionInfo: @@ -86,81 +246,102 @@ class SectionInfo: @dataclass # pylint: disable=too-many-instance-attributes -class TEMPLATEMetrics: - """Class to hold the TEMPLATE metrics for all contracts. Contains methods useful for reporting. - - There are 3 sections in the report: - 1. Core metrics (n1, n2, N1, N2) - 2. Extended metrics 1 (n, N, S, V) - 3. Extended metrics 2 (D, E, T, B) +class CKMetrics: + """Class to hold the CK metrics for all contracts. Contains methods useful for reporting. + There are 5 sections in the report: + 1. Variable count by type (state, constant, immutable) + 2. Function count by visibility (public, external, internal, private) + 3. Function count by mutability (mutating, view, pure) + 4. External mutating function count by modifier (external mutating, no auth or onlyOwner, no modifiers) + 5. CK metrics (RFC, NOC, DIT, CBO) """ contracts: List[Contract] = field(default_factory=list) contract_metrics: OrderedDict = field(default_factory=OrderedDict) - title: str = "Halstead complexity metrics" - full_txt: str = "" - # core: SectionInfo = field(default=SectionInfo) - # extended1: SectionInfo = field(default=SectionInfo) - # extended2: SectionInfo = field(default=SectionInfo) - # CORE_KEYS = ( - # "Total Operators", - # "Unique Operators", - # "Total Operands", - # "Unique Operands", - # ) - # EXTENDED1_KEYS = ( - # "Vocabulary", - # "Program Length", - # "Estimated Length", - # "Volume", - # ) - # EXTENDED2_KEYS = ( - # "Difficulty", - # "Effort", - # "Time", - # "Estimated Bugs", - # ) - # SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( - # ("Core", CORE_KEYS), - # ("Extended1", EXTENDED1_KEYS), - # ("Extended2", EXTENDED2_KEYS), - # ) + title: str = "CK complexity metrics" + full_text: str = "" + auxiliary1: SectionInfo = field(default=SectionInfo) + auxiliary2: SectionInfo = field(default=SectionInfo) + auxiliary3: SectionInfo = field(default=SectionInfo) + auxiliary4: SectionInfo = field(default=SectionInfo) + core: SectionInfo = field(default=SectionInfo) + AUXILIARY1_KEYS = ( + "State variables", + "Constants", + "Immutables", + ) + AUXILIARY2_KEYS = ( + "Public", + "External", + "Internal", + "Private", + ) + AUXILIARY3_KEYS = ( + "Mutating", + "View", + "Pure", + ) + AUXILIARY4_KEYS = ( + "External mutating", + "No auth or onlyOwner", + "No modifiers", + ) + CORE_KEYS = ( + "Ext calls", + "RFC", + "NOC", + "DIT", + "CBO", + ) + SECTIONS: Tuple[Tuple[str, str, Tuple[str]]] = ( + ("Variables", "auxiliary1", AUXILIARY1_KEYS), + ("Function visibility", "auxiliary2", AUXILIARY2_KEYS), + ("State mutability", "auxiliary3", AUXILIARY3_KEYS), + ("External mutating functions", "auxiliary4", AUXILIARY4_KEYS), + ("Core", "core", CORE_KEYS), + ) def __post_init__(self): - # # Compute the metrics for each contract and for all contracts. - # for contract in self.contracts: - # self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) - - # # If there are more than 1 contract, compute the metrics for all contracts. - # if len(self.contracts) > 1: - # all_operators = [ - # operator - # for contract in self.contracts - # for operator in self.contract_metrics[contract.name].all_operators - # ] - # all_operands = [ - # operand - # for contract in self.contracts - # for operand in self.contract_metrics[contract.name].all_operands - # ] - # self.contract_metrics["ALL CONTRACTS"] = HalsteadContractMetrics( - # None, all_operators=all_operators, all_operands=all_operands - # ) - pass + martin_metrics = MartinMetrics(self.contracts).contract_metrics + dependents = { + inherited.name: { + contract.name + for contract in self.contracts + if inherited.name in contract.inheritance + } + for inherited in self.contracts + } + for contract in self.contracts: + self.contract_metrics[contract.name] = CKContractMetrics( + contract=contract, martin_metrics=martin_metrics, dependents=dependents + ) # Create the table and text for each section. data = { contract.name: self.contract_metrics[contract.name].to_dict() for contract in self.contracts } - for (title, keys) in self.SECTIONS: - pretty_table = make_pretty_table(["Contract", *keys], data, False) + + # Update each section + for (title, attr, keys) in self.SECTIONS: + if attr == "core": + # Special handling for core section + totals_enabled = False + subtitle += bold("RFC: Response For a Class\n") + subtitle += bold("NOC: Number of Children\n") + subtitle += bold("DIT: Depth of Inheritance Tree\n") + subtitle += bold("CBO: Coupling Between Object Classes\n") + else: + totals_enabled = True + subtitle = "" + + pretty_table = make_pretty_table(["Contract", *keys], data, totals=totals_enabled) section_title = f"{self.title} ({title})" - txt = f"\n\n{section_title}:\n{pretty_table}\n" - self.full_txt += txt + txt = f"\n\n{section_title}:\n{subtitle}{pretty_table}\n" + self.full_text += txt setattr( self, - title.lower(), + attr, SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), ) diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index a5ab41cc9b..64dd1f6a1a 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -58,7 +58,10 @@ class HalsteadContractMetrics: def __post_init__(self): """Operators and operands can be passed in as constructor args to avoid computing them based on the contract. Useful for computing metrics for ALL_CONTRACTS""" + if len(self.all_operators) == 0: + if not hasattr(self.contract, "functions"): + return self.populate_operators_and_operands() if len(self.all_operators) > 0: self.compute_metrics() @@ -86,8 +89,7 @@ def populate_operators_and_operands(self): """Populate the operators and operands lists.""" operators = [] operands = [] - if not hasattr(self.contract, "functions"): - return + for func in self.contract.functions: for node in func.nodes: for operation in node.irs: @@ -175,10 +177,10 @@ class HalsteadMetrics: "Time", "Estimated Bugs", ) - SECTIONS: Tuple[Tuple[str, Tuple[str]]] = ( - ("Core", CORE_KEYS), - ("Extended1", EXTENDED1_KEYS), - ("Extended2", EXTENDED2_KEYS), + SECTIONS: Tuple[Tuple[str, str, Tuple[str]]] = ( + ("Core", "core", CORE_KEYS), + ("Extended 1/2", "extended1", EXTENDED1_KEYS), + ("Extended 2/2", "extended2", EXTENDED2_KEYS), ) def __post_init__(self): @@ -215,13 +217,13 @@ def update_reporting_sections(self): contract.name: self.contract_metrics[contract.name].to_dict() for contract in self.contracts } - for (title, keys) in self.SECTIONS: + for (title, attr, keys) in self.SECTIONS: pretty_table = make_pretty_table(["Contract", *keys], data, False) section_title = f"{self.title} ({title})" txt = f"\n\n{section_title}:\n{pretty_table}\n" self.full_text += txt setattr( self, - title.lower(), + attr, SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), ) diff --git a/slither/utils/martin.py b/slither/utils/martin.py index 7d39b2c14a..fb62a4c584 100644 --- a/slither/utils/martin.py +++ b/slither/utils/martin.py @@ -63,7 +63,7 @@ class MartinMetrics: "Instability", "Distance from main sequence", ) - SECTIONS: Tuple[Tuple[str, Tuple[str]]] = (("Core", CORE_KEYS),) + SECTIONS: Tuple[Tuple[str, str, Tuple[str]]] = (("Core", "core", CORE_KEYS),) def __post_init__(self): self.update_abstractness() @@ -76,7 +76,7 @@ def update_reporting_sections(self): contract.name: self.contract_metrics[contract.name].to_dict() for contract in self.contracts } - for (title, keys) in self.SECTIONS: + for (title, attr, keys) in self.SECTIONS: pretty_table = make_pretty_table(["Contract", *keys], data, False) section_title = f"{self.title} ({title})" txt = f"\n\n{section_title}:\n" @@ -94,7 +94,7 @@ def update_reporting_sections(self): self.full_text += txt setattr( self, - title.lower(), + attr, SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), ) diff --git a/slither/utils/myprettytable.py b/slither/utils/myprettytable.py index 2763470c4e..d67f570c0a 100644 --- a/slither/utils/myprettytable.py +++ b/slither/utils/myprettytable.py @@ -37,6 +37,7 @@ def __str__(self) -> str: # UTILITY FUNCTIONS + def make_pretty_table( headers: list, body: dict, totals: bool = False, total_header="TOTAL" ) -> MyPrettyTable: From 97f817712fbe35d5d118cf1caa54075f9d660528 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 22:35:07 +0000 Subject: [PATCH 040/169] Bump actions/upload-pages-artifact from 1 to 2 Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 1 to 2. - [Release notes](https://github.com/actions/upload-pages-artifact/releases) - [Commits](https://github.com/actions/upload-pages-artifact/compare/v1...v2) --- updated-dependencies: - dependency-name: actions/upload-pages-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f6d66aa0a0..625cafe4f0 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -37,7 +37,7 @@ jobs: - run: pip install -e ".[doc]" - run: pdoc -o html/ slither '!slither.tools' #TODO fix import errors on pdoc run - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v2 with: # Upload the doc path: './html/' From ec309343a5e9c7dbf3ca5d4cc1dfb12b080da049 Mon Sep 17 00:00:00 2001 From: Simone Date: Mon, 17 Jul 2023 15:42:10 +0200 Subject: [PATCH 041/169] Fix abi.decode tuple result with udt --- slither/slithir/convert.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index d40715c4f3..df9400c6a0 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1210,7 +1210,12 @@ def convert_to_solidity_func( and len(new_ir.arguments) == 2 and isinstance(new_ir.arguments[1], list) ): - types = list(new_ir.arguments[1]) + types = [] + for arg_type in new_ir.arguments[1]: + decode_type = arg_type + if isinstance(decode_type, (Structure, Enum, Contract)): + decode_type = UserDefinedType(decode_type) + types.append(decode_type) new_ir.lvalue.set_type(types) # abi.decode where the type to decode is a singleton # abi.decode(a, (uint)) From 65aaafa0c61f1b5dd8c8ce15e945bae3eebf12c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 22:38:31 +0000 Subject: [PATCH 042/169] Bump pypa/gh-action-pypi-publish from 1.8.7 to 1.8.8 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.7 to 1.8.8. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.7...v1.8.8) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f7d9ff9e7b..24f04ee87b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -44,7 +44,7 @@ jobs: path: dist/ - name: publish - uses: pypa/gh-action-pypi-publish@v1.8.7 + uses: pypa/gh-action-pypi-publish@v1.8.8 - name: sign uses: sigstore/gh-action-sigstore-python@v1.2.3 From b4add6eb055d205b3ab3c040357ed918cf9e8359 Mon Sep 17 00:00:00 2001 From: Simone Date: Tue, 18 Jul 2023 13:53:17 +0200 Subject: [PATCH 043/169] Fix enum.max/min when enum in other contract --- .../visitors/slithir/expression_to_slithir.py | 25 ++++++++++-- tests/e2e/solc_parsing/test_ast_parsing.py | 1 + .../enum-max-min.sol-0.8.19-compact.zip | Bin 0 -> 3319 bytes .../solc_parsing/test_data/enum-max-min.sol | 37 ++++++++++++++++++ .../enum-max-min.sol-0.8.19-compact.json | 12 ++++++ 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 tests/e2e/solc_parsing/test_data/compile/enum-max-min.sol-0.8.19-compact.zip create mode 100644 tests/e2e/solc_parsing/test_data/enum-max-min.sol create mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-max-min.sol-0.8.19-compact.json diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 005ad81a44..0e265f909c 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -443,6 +443,7 @@ def _post_member_access(self, expression: MemberAccess) -> None: # Look for type(X).max / min # Because we looked at the AST structure, we need to look into the nested expression # Hopefully this is always on a direct sub field, and there is no weird construction + # pylint: disable=too-many-nested-blocks if isinstance(expression.expression, CallExpression) and expression.member_name in [ "min", "max", @@ -462,10 +463,22 @@ def _post_member_access(self, expression: MemberAccess) -> None: constant_type = type_found else: # type(enum).max/min - assert isinstance(type_expression_found, Identifier) - type_found_in_expression = type_expression_found.value - assert isinstance(type_found_in_expression, (EnumContract, EnumTopLevel)) - type_found = UserDefinedType(type_found_in_expression) + # Case when enum is in another contract e.g. type(C.E).max + if isinstance(type_expression_found, MemberAccess): + contract = type_expression_found.expression.value + assert isinstance(contract, Contract) + for enum in contract.enums: + if enum.name == type_expression_found.member_name: + type_found_in_expression = enum + type_found = UserDefinedType(enum) + break + else: + assert isinstance(type_expression_found, Identifier) + type_found_in_expression = type_expression_found.value + assert isinstance( + type_found_in_expression, (EnumContract, EnumTopLevel) + ) + type_found = UserDefinedType(type_found_in_expression) constant_type = None min_value = type_found_in_expression.min max_value = type_found_in_expression.max @@ -523,6 +536,10 @@ def _post_member_access(self, expression: MemberAccess) -> None: if expression.member_name in expr.custom_errors_as_dict: set_val(expression, expr.custom_errors_as_dict[expression.member_name]) return + # Lookup enums when in a different contract e.g. C.E + if str(expression) in expr.enums_as_dict: + set_val(expression, expr.enums_as_dict[str(expression)]) + return val_ref = ReferenceVariable(self._node) member = Member(expr, Constant(expression.member_name), val_ref) diff --git a/tests/e2e/solc_parsing/test_ast_parsing.py b/tests/e2e/solc_parsing/test_ast_parsing.py index 307e6736ff..d6cc1b8b4c 100644 --- a/tests/e2e/solc_parsing/test_ast_parsing.py +++ b/tests/e2e/solc_parsing/test_ast_parsing.py @@ -459,6 +459,7 @@ def make_version(minor: int, patch_min: int, patch_max: int) -> List[str]: ["0.6.9", "0.7.6", "0.8.16"], ), Test("user_defined_operators-0.8.19.sol", ["0.8.19"]), + Test("enum-max-min.sol", ["0.8.19"]), ] # create the output folder if needed try: diff --git a/tests/e2e/solc_parsing/test_data/compile/enum-max-min.sol-0.8.19-compact.zip b/tests/e2e/solc_parsing/test_data/compile/enum-max-min.sol-0.8.19-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..f29ad0bdb623661cfecebcc9e63e18e268196b83 GIT binary patch literal 3319 zcma)Q@U0XzVZ0aWde^=SIm$}~s-fF2J3fE@q;SUI@a^VwT? z^4Z%u@Vhv^H?#6YIXb(VSvVtYY~8K+?OYrkfOz--69B*;0FVj^u@<@!a>}0g(I82h z-s@ody!}Z~B#c3tW!9yYR^UutI%8>6lnAGx|)K;iT#XY(F_kx$x2al&e#Q z17X`pk5kb5oa)4KoH+*R082@SZJKemSUzUvxGCwa?EDeGUqxT=-X1M5i3*<;kWDtR zB_kW(BG(=zp>n$6r4&#E$lx|#vm|*7-%;_c>UM!q8Hoel2rFeb)S6sKU4KyF%BxU6zodzr2yq9U92)BE@rj zq2dOM2+pT^w~|N|n^ze1VUi1iebpR7Pa$Q1xV4XKOZGaY8W1V35t|y8Up2Pu+yH1g zH95U$KzCVRO`LDfzSgIEIN0@F4f9WyOyr<-;38MTcn}-M4Fyb_Tj#B4uP%GjDg849 zpIA6u6N&0UEvZ2;?`V@9V;rg>udc2b;@>Y)e%+x7T7yVrX5`M#yOn@#zm_ z{0Hi;sIJWclhy4wi|~?R$b^v7gsA;{xPp!*@DzTG5p1meN8-mGZP716y#|9p?^~-neGLC(8UvUVivBk}lBFufVI7 zzhIz?X16~3ZHD`8*k-)opAxF0-+WeXeS$&~oPjuihtAOlLvv5MH1wTQkS^J^3 z%MaY|DkKtp!%)^RswybgR#saIUqglpvCx#sv_8FD4aG?#oBX>Onwv+=JqOrpV%wbd zkKd1pjuHxO2*&+Ru z4`3W)8C&fx?PhGOREzp{4jwzG({rv3Wql-jR_B7$)UppQ3bly6BQnI@S31qyjg#LU z{Ge{#`l0<{M2Ay z=%)FmTBZ1F!-2;BvESFtj+gtvH|S6wIV?qc`|K zxkVI`i9^_fx)Jxsmq|>2hHnNrS-Rzb&1?yb!e^OS9mP2E|4P*_|?38785< zhxto?L@7GzX>ctvQx!dX5G4xQBoXr~G}grVmlQC`uz8waKynSC!+~UYosUp}Z>6*l z?RESg?o=5on+9nI=9b$AT}!1*F}k3yG#;Evke@4E4ErA=FnZ<~UrB&M&X#UWh#|)k z>x)G08}rbPk$zp(26t=QuFD{l%&|g5+Mzm@(37L=WV(7XERguHn( zdAAn?k(6Rw{^UOKxj~nrUSC7EmJ1hRjB=(&`j_|k%;csqwbbj(BgfOZm z2}jimjAt*J=MWT3^uk}ZWCQ5(8|+%Dhnr+MS{OJ<6v0;I>dP$y`8b=iaa%S4Bt8BmiwVyH!FVlMZ&W>H;-vggHYaUhz=6+>w)Ee^StoxAU z^G{dZGGDI4F5SflFb7^H=h7o$UK5OQ#WuA&Cgf|J(~MtkqBImNTRV8>omgGU%3ASn z6}SL>-d(1exjPtrwm8Cig(Z~`tQ78w!-(LQe{Kmeszrvgh8+6=(lhSv>_dC%+Z1~& zz^1{gNy74KZ3Jr({9cQ|>ojN?XQefE!A^~A6X2KHXmo-Stz|a+C?(7tVVBJX4Qeja zj8FGLwB)eRh1%``20*Hc&r`BHwr7Ov-MgZT+a{HE&UO{YbA~(t~}h7AB{@X!O}`Eqt1#HDysEsPRM+`!AablVq-`T$tHc%cR%AZd3k-Si-Ik*>v<&LG8uwRo*WhsrL zxh8RM=U>jz{KM)^Uf7)Rhgp8H9wBE$@XIz;?;LPgpZ$o+*U^N7hhP1t{wjR*7LC7{&)n9w@RXOOp=3UE9d6W=cjz!sd}^@K zpGC$KwCMhW@cTE6t;_ZW6YZGrw-(svTZIVxk0e9F8tY}O7P0iku}QvEYvkTo@uZpo zkqgWm5e{kEQ_cDd^a^Fa_<@~;&ug*lkUY$i-FTYE=1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "b()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "c()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "d()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "e()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" + } +} \ No newline at end of file From 60a67680b06ec21311158a115f4d4a7d97a678cc Mon Sep 17 00:00:00 2001 From: Simone Date: Tue, 18 Jul 2023 14:07:51 +0200 Subject: [PATCH 044/169] Compile after the test was added --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5cf02136bd..ae7951c7f9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -96,8 +96,8 @@ For each new detector, at least one regression tests must be present. #### Adding parsing tests 1. Create a test in `tests/e2e/solc_parsing/` -2. Run `python tests/e2e/solc_parsing/test_ast_parsing.py --compile`. This will compile the artifact in `tests/e2e/solc_parsing/compile`. Add the compiled artifact to git. -3. Update `ALL_TESTS` in `tests/e2e/solc_parsing/test_ast_parsing.py`. +2. Update `ALL_TESTS` in `tests/e2e/solc_parsing/test_ast_parsing.py`. +3. Run `python tests/e2e/solc_parsing/test_ast_parsing.py --compile`. This will compile the artifact in `tests/e2e/solc_parsing/compile`. Add the compiled artifact to git. 4. Run `python tests/e2e/solc_parsing/test_ast_parsing.py --generate`. This will generate the json artifacts in `tests/e2e/solc_parsing/expected_json`. Add the generated files to git. 5. Run `pytest tests/e2e/solc_parsing/test_ast_parsing.py` and check that everything worked. From baa7fb5974ed7bbb99216481723e90d9015f36b6 Mon Sep 17 00:00:00 2001 From: webthethird Date: Wed, 26 Jul 2023 21:36:09 -0500 Subject: [PATCH 045/169] Better struct handling in code generation util --- slither/utils/code_generation.py | 112 +++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 12 deletions(-) diff --git a/slither/utils/code_generation.py b/slither/utils/code_generation.py index bb8344d8fb..907100239e 100644 --- a/slither/utils/code_generation.py +++ b/slither/utils/code_generation.py @@ -12,16 +12,18 @@ MappingType, ArrayType, ElementaryType, + TypeAlias ) -from slither.core.declarations import Structure, Enum, Contract +from slither.core.declarations import Structure, StructureContract, Enum, Contract if TYPE_CHECKING: from slither.core.declarations import FunctionContract, CustomErrorContract from slither.core.variables.state_variable import StateVariable from slither.core.variables.local_variable import LocalVariable + from slither.core.variables.structure_variable import StructureVariable -# pylint: disable=too-many-arguments +# pylint: disable=too-many-arguments,too-many-locals,too-many-branches def generate_interface( contract: "Contract", unroll_structs: bool = True, @@ -56,12 +58,47 @@ def generate_interface( for enum in contract.enums: interface += f" enum {enum.name} {{ {', '.join(enum.values)} }}\n" if include_structs: - for struct in contract.structures: + # Include structures defined in this contract and at the top level + structs = contract.structures + contract.compilation_unit.structures_top_level + # Function signatures may reference other structures as well + # Include structures defined in libraries used for them + for _for in contract.using_for.keys(): + if ( + isinstance(_for, UserDefinedType) + and isinstance(_for.type, StructureContract) + and _for.type not in structs + ): + structs.append(_for.type) + # Include any other structures used as function arguments/returns + for func in contract.functions_entry_points: + for arg in func.parameters + func.returns: + _type = arg.type + if isinstance(_type, ArrayType): + _type = _type.type + while isinstance(_type, MappingType): + _type = _type.type_to + if isinstance(_type, UserDefinedType): + _type = _type.type + if isinstance(_type, Structure) and _type not in structs: + structs.append(_type) + for struct in structs: interface += generate_struct_interface_str(struct, indent=4) + for elem in struct.elems_ordered: + if ( + isinstance(elem.type, UserDefinedType) + and isinstance(elem.type.type, StructureContract) + and elem.type.type not in structs + ): + structs.append(elem.type.type) for var in contract.state_variables_entry_points: - interface += f" function {generate_interface_variable_signature(var, unroll_structs)};\n" + # if any(func.name == var.name for func in contract.functions_entry_points): + # # ignore public variables that override a public function + # continue + var_sig = generate_interface_variable_signature(var, unroll_structs) + if var_sig is not None and var_sig != "": + interface += f" function {var_sig};\n" for func in contract.functions_entry_points: - if func.is_constructor or func.is_fallback or func.is_receive: + if func.is_constructor or func.is_fallback or func.is_receive or not func.is_implemented: continue interface += ( f" function {generate_interface_function_signature(func, unroll_structs)};\n" @@ -75,6 +112,10 @@ def generate_interface_variable_signature( ) -> Optional[str]: if var.visibility in ["private", "internal"]: return None + if isinstance(var.type, UserDefinedType) and isinstance(var.type.type, Structure): + for elem in var.type.type.elems_ordered: + if isinstance(elem.type, MappingType): + return "" if unroll_structs: params = [ convert_type_for_solidity_signature_to_string(x).replace("(", "").replace(")", "") @@ -93,6 +134,11 @@ def generate_interface_variable_signature( _type = _type.type_to while isinstance(_type, (ArrayType, UserDefinedType)): _type = _type.type + if isinstance(_type, TypeAlias): + _type = _type.type + if isinstance(_type, Structure): + if any(isinstance(elem.type, MappingType) for elem in _type.elems_ordered): + return "" ret = str(_type) if isinstance(_type, Structure) or (isinstance(_type, Type) and _type.is_dynamic): ret += " memory" @@ -125,6 +171,8 @@ def format_var(var: "LocalVariable", unroll: bool) -> str: .replace("(", "") .replace(")", "") ) + if var.type.is_dynamic: + return f"{_handle_dynamic_struct_elem(var.type)} {var.location}" if isinstance(var.type, ArrayType) and isinstance( var.type.type, (UserDefinedType, ElementaryType) ): @@ -135,12 +183,14 @@ def format_var(var: "LocalVariable", unroll: bool) -> str: + f" {var.location}" ) if isinstance(var.type, UserDefinedType): - if isinstance(var.type.type, (Structure, Enum)): + if isinstance(var.type.type, Structure): return f"{str(var.type.type)} memory" + if isinstance(var.type.type, Enum): + return str(var.type.type) if isinstance(var.type.type, Contract): return "address" - if var.type.is_dynamic: - return f"{var.type} {var.location}" + if isinstance(var.type, TypeAlias): + return str(var.type.type) return str(var.type) name, _, _ = func.signature @@ -154,6 +204,12 @@ def format_var(var: "LocalVariable", unroll: bool) -> str: view = " view" if func.view and not func.pure else "" pure = " pure" if func.pure else "" payable = " payable" if func.payable else "" + # Make sure the function doesn't return a struct with nested mappings + for ret in func.returns: + if isinstance(ret.type, UserDefinedType) and isinstance(ret.type.type, Structure): + for elem in ret.type.type.elems_ordered: + if isinstance(elem.type, MappingType): + return "" returns = [format_var(ret, unroll_structs) for ret in func.returns] parameters = [format_var(param, unroll_structs) for param in func.parameters] _interface_signature_str = ( @@ -184,17 +240,49 @@ def generate_struct_interface_str(struct: "Structure", indent: int = 0) -> str: spaces += " " definition = f"{spaces}struct {struct.name} {{\n" for elem in struct.elems_ordered: - if isinstance(elem.type, UserDefinedType): - if isinstance(elem.type.type, (Structure, Enum)): + if elem.type.is_dynamic: + definition += f"{spaces} {_handle_dynamic_struct_elem(elem.type)} {elem.name};\n" + elif isinstance(elem.type, UserDefinedType): + if isinstance(elem.type.type, Structure): definition += f"{spaces} {elem.type.type} {elem.name};\n" - elif isinstance(elem.type.type, Contract): - definition += f"{spaces} address {elem.name};\n" + else: + definition += f"{spaces} {convert_type_for_solidity_signature_to_string(elem.type)} {elem.name};\n" + elif isinstance(elem.type, TypeAlias): + definition += f"{spaces} {elem.type.type} {elem.name};\n" else: definition += f"{spaces} {elem.type} {elem.name};\n" definition += f"{spaces}}}\n" return definition +def _handle_dynamic_struct_elem(elem_type: Type) -> str: + assert elem_type.is_dynamic + if isinstance(elem_type, ElementaryType): + return f"{elem_type}" + if isinstance(elem_type, ArrayType): + base_type = elem_type.type + if isinstance(base_type, UserDefinedType): + if isinstance(base_type.type, Contract): + return "address[]" + if isinstance(base_type.type, Enum): + return convert_type_for_solidity_signature_to_string(elem_type) + return f"{base_type.type.name}[]" + return f"{base_type}[]" + if isinstance(elem_type, MappingType): + type_to = elem_type.type_to + type_from = elem_type.type_from + if isinstance(type_from, UserDefinedType) and isinstance(type_from.type, Contract): + type_from = ElementaryType("address") + if isinstance(type_to, MappingType): + return f"mapping({type_from} => {_handle_dynamic_struct_elem(type_to)})" + if isinstance(type_to, UserDefinedType): + if isinstance(type_to.type, Contract): + return f"mapping({type_from} => address)" + return f"mapping({type_from} => {type_to.type.name})" + return f"{elem_type}" + return "" + + def generate_custom_error_interface( error: "CustomErrorContract", unroll_structs: bool = True ) -> str: From c47fa62b712af745cecbb0f20329d567c24affff Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 28 Jul 2023 17:36:04 -0500 Subject: [PATCH 046/169] ci: add problem matchers for yamllint and pylint --- .github/workflows/linter.yml | 7 +++--- .github/workflows/matchers/pylint.json | 32 ++++++++++++++++++++++++ .github/workflows/matchers/yamllint.json | 22 ++++++++++++++++ .github/workflows/pylint.yml | 6 +++++ 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/matchers/pylint.json create mode 100644 .github/workflows/matchers/yamllint.json diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index b352a8301d..0468b07f8a 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -9,8 +9,6 @@ defaults: on: pull_request: branches: [master, dev] - paths: - - "**/*.py" schedule: # run CI every day even if no PRs/merges occur @@ -42,6 +40,10 @@ jobs: mkdir -p .github/linters cp pyproject.toml .github/linters + - name: Register yamllint problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/yamllint.json" + - name: Lint everything else uses: super-linter/super-linter/slim@v4.9.2 if: always() @@ -55,7 +57,6 @@ jobs: VALIDATE_PYTHON_PYLINT: false VALIDATE_PYTHON_BLACK: false VALIDATE_PYTHON_ISORT: false - # Always false VALIDATE_JSON: false VALIDATE_JAVASCRIPT_STANDARD: false VALIDATE_PYTHON_FLAKE8: false diff --git a/.github/workflows/matchers/pylint.json b/.github/workflows/matchers/pylint.json new file mode 100644 index 0000000000..4d9e13fca7 --- /dev/null +++ b/.github/workflows/matchers/pylint.json @@ -0,0 +1,32 @@ +{ + "problemMatcher": [ + { + "owner": "pylint-error", + "severity": "error", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([EF]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + }, + { + "owner": "pylint-warning", + "severity": "warning", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([CRW]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + } + ] +} \ No newline at end of file diff --git a/.github/workflows/matchers/yamllint.json b/.github/workflows/matchers/yamllint.json new file mode 100644 index 0000000000..b0b2f125c6 --- /dev/null +++ b/.github/workflows/matchers/yamllint.json @@ -0,0 +1,22 @@ +{ + "problemMatcher": [ + { + "owner": "yamllint", + "pattern": [ + { + "regexp": "^(.*\\.ya?ml)$", + "file": 1 + }, + { + "regexp": "^\\s{2}(\\d+):(\\d+)\\s+(error|warning)\\s+(.*?)\\s+\\((.*)\\)$", + "line": 1, + "column": 2, + "severity": 3, + "message": 4, + "code": 5, + "loop": true + } + ] + } + ] + } \ No newline at end of file diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 207f98eac0..8c7e7bce93 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -9,6 +9,8 @@ defaults: on: pull_request: branches: [master, dev] + paths: + - "**/*.py" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -36,6 +38,10 @@ jobs: mkdir -p .github/linters cp pyproject.toml .github/linters + - name: Register pylint problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/pylint.json" + - name: Pylint uses: super-linter/super-linter/slim@v4.9.2 if: always() From d90505826f952526f5daccd107b4100ed44ab2cb Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 3 Aug 2023 16:51:49 -0500 Subject: [PATCH 047/169] fix ternary rewrite test and make assertion more strict (#2067) --- .../unit/slithir/test_ternary_expressions.py | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/tests/unit/slithir/test_ternary_expressions.py b/tests/unit/slithir/test_ternary_expressions.py index 0acd9345d7..712c9582b0 100644 --- a/tests/unit/slithir/test_ternary_expressions.py +++ b/tests/unit/slithir/test_ternary_expressions.py @@ -1,8 +1,13 @@ from pathlib import Path from slither import Slither from slither.core.cfg.node import NodeType -from slither.slithir.operations import Assignment -from slither.core.expressions import AssignmentOperation, TupleExpression +from slither.slithir.operations import Assignment, Unpack +from slither.core.expressions import ( + AssignmentOperation, + TupleExpression, + NewElementaryType, + CallExpression, +) TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" @@ -12,27 +17,29 @@ def test_ternary_conversions(solc_binary_path) -> None: solc_path = solc_binary_path("0.8.0") slither = Slither(Path(TEST_DATA_DIR, "ternary_expressions.sol").as_posix(), solc=solc_path) for contract in slither.contracts: - for function in contract.functions: - vars_declared = 0 - vars_assigned = 0 - for node in function.nodes: - if node.type in [NodeType.IF, NodeType.IFLOOP]: + if not contract.is_signature_only: + for function in contract.functions: + vars_declared = 0 + vars_assigned = 0 + for node in function.nodes: + if node.type in [NodeType.IF, NodeType.IFLOOP]: - # Iterate over true and false son - for inner_node in node.sons: - # Count all variables declared - expression = inner_node.expression - if isinstance(expression, AssignmentOperation): - var_expr = expression.expression_left - # Only tuples declare more than one var - if isinstance(var_expr, TupleExpression): - vars_declared += len(var_expr.expressions) - else: - vars_declared += 1 + # Iterate over true and false son + for inner_node in node.sons: + # Count all variables declared + expression = inner_node.expression + if isinstance( + expression, (AssignmentOperation, NewElementaryType, CallExpression) + ): + var_expr = expression.expression_left + # Only tuples declare more than one var + if isinstance(var_expr, TupleExpression): + vars_declared += len(var_expr.expressions) + else: + vars_declared += 1 - for ir in inner_node.irs: - # Count all variables defined - if isinstance(ir, Assignment): - vars_assigned += 1 - - assert vars_declared == vars_assigned + for ir in inner_node.irs: + # Count all variables defined + if isinstance(ir, (Assignment, Unpack)): + vars_assigned += 1 + assert vars_declared == vars_assigned and vars_assigned != 0 From e0098907c998fede544525f859f917074a752e63 Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Thu, 3 Aug 2023 23:53:09 +0200 Subject: [PATCH 048/169] Add CustomError as printable output (#2063) --- slither/core/declarations/__init__.py | 2 ++ .../declarations/custom_error_contract.py | 4 +++ .../declarations/custom_error_top_level.py | 4 +++ slither/utils/output.py | 29 +++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/slither/core/declarations/__init__.py b/slither/core/declarations/__init__.py index 92e0b9eca3..f341187518 100644 --- a/slither/core/declarations/__init__.py +++ b/slither/core/declarations/__init__.py @@ -18,3 +18,5 @@ from .function_contract import FunctionContract from .function_top_level import FunctionTopLevel from .custom_error_contract import CustomErrorContract +from .custom_error_top_level import CustomErrorTopLevel +from .custom_error import CustomError diff --git a/slither/core/declarations/custom_error_contract.py b/slither/core/declarations/custom_error_contract.py index cd279a3a62..2c8bec9efa 100644 --- a/slither/core/declarations/custom_error_contract.py +++ b/slither/core/declarations/custom_error_contract.py @@ -16,3 +16,7 @@ def is_declared_by(self, contract: "Contract") -> bool: :return: """ return self.contract == contract + + @property + def canonical_name(self) -> str: + return self.contract.name + "." + self.full_name diff --git a/slither/core/declarations/custom_error_top_level.py b/slither/core/declarations/custom_error_top_level.py index 64a6a85353..b80356b245 100644 --- a/slither/core/declarations/custom_error_top_level.py +++ b/slither/core/declarations/custom_error_top_level.py @@ -12,3 +12,7 @@ class CustomErrorTopLevel(CustomError, TopLevel): def __init__(self, compilation_unit: "SlitherCompilationUnit", scope: "FileScope") -> None: super().__init__(compilation_unit) self.file_scope: "FileScope" = scope + + @property + def canonical_name(self) -> str: + return self.full_name diff --git a/slither/utils/output.py b/slither/utils/output.py index 84c9ac65a1..4a91ca9b9b 100644 --- a/slither/utils/output.py +++ b/slither/utils/output.py @@ -18,6 +18,7 @@ Structure, Pragma, FunctionContract, + CustomError, ) from slither.core.source_mapping.source_mapping import SourceMapping from slither.core.variables.local_variable import LocalVariable @@ -438,6 +439,8 @@ def add(self, add: SupportedOutput, additional_fields: Optional[Dict] = None) -> self.add_event(add, additional_fields=additional_fields) elif isinstance(add, Structure): self.add_struct(add, additional_fields=additional_fields) + elif isinstance(add, CustomError): + self.add_custom_error(add, additional_fields=additional_fields) elif isinstance(add, Pragma): self.add_pragma(add, additional_fields=additional_fields) elif isinstance(add, Node): @@ -585,6 +588,32 @@ def add_event(self, event: Event, additional_fields: Optional[Dict] = None) -> N self._data["elements"].append(element) + # endregion + ################################################################################### + ################################################################################### + # region CustomError + ################################################################################### + ################################################################################### + + def add_custom_error( + self, custom_error: CustomError, additional_fields: Optional[Dict] = None + ) -> None: + if additional_fields is None: + additional_fields = {} + type_specific_fields = { + "parent": _create_parent_element(custom_error), + "signature": custom_error.full_name, + } + element = _create_base_element( + "custom_error", + custom_error.name, + custom_error.source_mapping.to_json(), + type_specific_fields, + additional_fields, + ) + + self._data["elements"].append(element) + # endregion ################################################################################### ################################################################################### From d86bd4109d69f7e99ea84e716f7d41d9ac29b1ea Mon Sep 17 00:00:00 2001 From: SheldonHolmgren <116484297+SheldonHolmgren@users.noreply.github.com> Date: Thu, 3 Aug 2023 22:54:15 +0100 Subject: [PATCH 049/169] UnaryOperation: -variable and +variable doesn't make variable an lvalue (#2027) --- slither/core/expressions/unary_operation.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/slither/core/expressions/unary_operation.py b/slither/core/expressions/unary_operation.py index 6572249278..4051326131 100644 --- a/slither/core/expressions/unary_operation.py +++ b/slither/core/expressions/unary_operation.py @@ -106,8 +106,6 @@ def __init__( UnaryOperationType.MINUSMINUS_PRE, UnaryOperationType.PLUSPLUS_POST, UnaryOperationType.MINUSMINUS_POST, - UnaryOperationType.PLUS_PRE, - UnaryOperationType.MINUS_PRE, ]: expression.set_lvalue() From 3f90e86badfa956b5cc692e0421c2b8065c31d43 Mon Sep 17 00:00:00 2001 From: yisun92 Date: Thu, 3 Aug 2023 17:56:04 -0400 Subject: [PATCH 050/169] fix: get_state_variable_from_canonical_name() filter by canonical_name (#1983) --- slither/core/declarations/contract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index fd2cdd4684..9b1488db31 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -861,7 +861,7 @@ def get_state_variable_from_canonical_name( Returns: StateVariable """ - return next((v for v in self.state_variables if v.name == canonical_name), None) + return next((v for v in self.state_variables if v.canonical_name == canonical_name), None) def get_structure_from_name(self, structure_name: str) -> Optional["StructureContract"]: """ From d9977c02ad22e9f6b5b99ec6f0ad2f12fa16fb33 Mon Sep 17 00:00:00 2001 From: Simone Date: Sun, 6 Aug 2023 11:17:16 +0200 Subject: [PATCH 051/169] Add end assembly node in the cfg --- slither/core/cfg/node.py | 1 + slither/solc_parsing/declarations/function.py | 4 ++- .../assembly-all.sol-0.6.0-compact.json | 4 +-- .../assembly-all.sol-0.6.1-compact.json | 4 +-- .../assembly-all.sol-0.6.10-compact.json | 4 +-- .../assembly-all.sol-0.6.11-compact.json | 4 +-- .../assembly-all.sol-0.6.12-compact.json | 4 +-- .../assembly-all.sol-0.6.2-compact.json | 4 +-- .../assembly-all.sol-0.6.3-compact.json | 4 +-- .../assembly-all.sol-0.6.4-compact.json | 4 +-- .../assembly-all.sol-0.6.5-compact.json | 4 +-- .../assembly-all.sol-0.6.6-compact.json | 4 +-- .../assembly-all.sol-0.6.7-compact.json | 4 +-- .../assembly-all.sol-0.6.8-compact.json | 4 +-- .../assembly-all.sol-0.6.9-compact.json | 4 +-- .../assembly-all.sol-0.7.0-compact.json | 4 +-- .../assembly-all.sol-0.7.1-compact.json | 4 +-- .../assembly-all.sol-0.7.2-compact.json | 4 +-- .../assembly-all.sol-0.7.3-compact.json | 4 +-- .../assembly-all.sol-0.7.4-compact.json | 4 +-- .../assembly-all.sol-0.7.5-compact.json | 4 +-- .../assembly-all.sol-0.7.6-compact.json | 4 +-- .../assembly-all.sol-0.8.0-compact.json | 4 +-- .../assembly-all.sol-0.8.1-compact.json | 4 +-- .../assembly-all.sol-0.8.10-compact.json | 4 +-- .../assembly-all.sol-0.8.11-compact.json | 4 +-- .../assembly-all.sol-0.8.12-compact.json | 4 +-- .../assembly-all.sol-0.8.13-compact.json | 4 +-- .../assembly-all.sol-0.8.14-compact.json | 4 +-- .../assembly-all.sol-0.8.15-compact.json | 4 +-- .../assembly-all.sol-0.8.2-compact.json | 4 +-- .../assembly-all.sol-0.8.3-compact.json | 4 +-- .../assembly-all.sol-0.8.4-compact.json | 4 +-- .../assembly-all.sol-0.8.5-compact.json | 4 +-- .../assembly-all.sol-0.8.6-compact.json | 4 +-- .../assembly-all.sol-0.8.7-compact.json | 4 +-- .../assembly-all.sol-0.8.8-compact.json | 4 +-- .../assembly-all.sol-0.8.9-compact.json | 4 +-- .../assembly-functions.sol-0.6.9-compact.json | 2 +- .../assembly-functions.sol-0.7.6-compact.json | 2 +- ...assembly-functions.sol-0.8.16-compact.json | 2 +- .../assignment-0.4.0.sol-0.4.0-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.1-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.10-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.11-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.2-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.3-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.4-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.5-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.6-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.7-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.8-compact.json | 5 ---- .../assignment-0.4.0.sol-0.4.9-compact.json | 5 ---- .../assignment-0.4.7.sol-0.4.7-compact.json | 5 ---- .../assignment-0.4.7.sol-0.4.8-compact.json | 5 ---- .../assignment-0.4.7.sol-0.4.9-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.0-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.1-compact.json | 5 ---- ...aryoperation-0.4.0.sol-0.4.10-compact.json | 5 ---- ...aryoperation-0.4.0.sol-0.4.11-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.2-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.3-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.4-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.5-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.6-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.7-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.8-compact.json | 5 ---- ...naryoperation-0.4.0.sol-0.4.9-compact.json | 5 ---- ...naryoperation-0.4.7.sol-0.4.7-compact.json | 5 ---- ...naryoperation-0.4.7.sol-0.4.8-compact.json | 5 ---- ...naryoperation-0.4.7.sol-0.4.9-compact.json | 5 ---- .../expected/break-all.sol-0.4.0-compact.json | 5 ---- .../expected/break-all.sol-0.4.1-compact.json | 5 ---- .../break-all.sol-0.4.10-compact.json | 5 ---- .../break-all.sol-0.4.11-compact.json | 5 ---- .../expected/break-all.sol-0.4.2-compact.json | 5 ---- .../expected/break-all.sol-0.4.3-compact.json | 5 ---- .../expected/break-all.sol-0.4.4-compact.json | 5 ---- .../expected/break-all.sol-0.4.5-compact.json | 5 ---- .../expected/break-all.sol-0.4.6-compact.json | 5 ---- .../expected/break-all.sol-0.4.7-compact.json | 5 ---- .../expected/break-all.sol-0.4.8-compact.json | 5 ---- .../expected/break-all.sol-0.4.9-compact.json | 5 ---- ...all_to_variable-all.sol-0.4.0-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.1-compact.json | 6 ---- ...ll_to_variable-all.sol-0.4.10-compact.json | 6 ---- ...ll_to_variable-all.sol-0.4.11-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.2-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.3-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.4-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.5-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.6-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.7-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.8-compact.json | 6 ---- ...all_to_variable-all.sol-0.4.9-compact.json | 6 ---- .../comment-all.sol-0.4.0-compact.json | 5 ---- .../comment-all.sol-0.4.1-compact.json | 5 ---- .../comment-all.sol-0.4.10-compact.json | 5 ---- .../comment-all.sol-0.4.11-compact.json | 5 ---- .../comment-all.sol-0.4.2-compact.json | 5 ---- .../comment-all.sol-0.4.3-compact.json | 5 ---- .../comment-all.sol-0.4.4-compact.json | 5 ---- .../comment-all.sol-0.4.5-compact.json | 5 ---- .../comment-all.sol-0.4.6-compact.json | 5 ---- .../comment-all.sol-0.4.7-compact.json | 5 ---- .../comment-all.sol-0.4.8-compact.json | 5 ---- .../comment-all.sol-0.4.9-compact.json | 5 ---- .../continue-all.sol-0.4.0-compact.json | 5 ---- .../continue-all.sol-0.4.1-compact.json | 5 ---- .../continue-all.sol-0.4.10-compact.json | 5 ---- .../continue-all.sol-0.4.11-compact.json | 5 ---- .../continue-all.sol-0.4.2-compact.json | 5 ---- .../continue-all.sol-0.4.3-compact.json | 5 ---- .../continue-all.sol-0.4.4-compact.json | 5 ---- .../continue-all.sol-0.4.5-compact.json | 5 ---- .../continue-all.sol-0.4.6-compact.json | 5 ---- .../continue-all.sol-0.4.7-compact.json | 5 ---- .../continue-all.sol-0.4.8-compact.json | 5 ---- .../continue-all.sol-0.4.9-compact.json | 5 ---- .../contract-0.4.0.sol-0.4.0-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.1-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.10-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.11-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.2-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.3-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.4-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.5-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.6-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.7-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.8-compact.json | 19 ------------ .../contract-0.4.0.sol-0.4.9-compact.json | 19 ------------ .../custom_error-0.4.0.sol-0.4.0-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.1-compact.json | 1 - ...custom_error-0.4.0.sol-0.4.10-compact.json | 1 - ...custom_error-0.4.0.sol-0.4.11-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.2-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.3-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.4-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.5-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.6-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.7-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.8-compact.json | 1 - .../custom_error-0.4.0.sol-0.4.9-compact.json | 1 - .../dowhile-0.4.0.sol-0.4.0-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.1-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.10-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.11-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.2-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.3-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.4-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.5-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.6-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.7-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.8-compact.json | 3 -- .../dowhile-0.4.0.sol-0.4.9-compact.json | 3 -- .../dowhile-0.4.5.sol-0.4.5-compact.json | 5 ---- .../dowhile-0.4.5.sol-0.4.6-compact.json | 5 ---- .../dowhile-0.4.5.sol-0.4.7-compact.json | 5 ---- .../dowhile-0.4.5.sol-0.4.8-compact.json | 5 ---- .../dowhile-0.4.5.sol-0.4.9-compact.json | 5 ---- .../emit-0.4.21.sol-0.4.21-compact.json | 7 ----- .../emit-0.4.21.sol-0.4.21-legacy.json | 7 ----- .../emit-0.4.21.sol-0.4.22-compact.json | 7 ----- .../emit-0.4.21.sol-0.4.22-legacy.json | 7 ----- .../emit-0.4.21.sol-0.4.23-compact.json | 7 ----- .../emit-0.4.21.sol-0.4.23-legacy.json | 7 ----- .../emit-0.4.21.sol-0.4.24-compact.json | 7 ----- .../emit-0.4.21.sol-0.4.24-legacy.json | 7 ----- .../emit-0.4.21.sol-0.4.25-compact.json | 7 ----- .../emit-0.4.21.sol-0.4.25-legacy.json | 7 ----- .../emit-0.4.21.sol-0.4.26-compact.json | 7 ----- .../emit-0.4.21.sol-0.4.26-legacy.json | 7 ----- .../emit-0.4.8.sol-0.4.8-compact.json | 6 ---- .../expected/emit-0.4.8.sol-0.4.8-legacy.json | 6 ---- .../emit-0.4.8.sol-0.4.9-compact.json | 6 ---- .../expected/emit-0.4.8.sol-0.4.9-legacy.json | 6 ---- .../enum-0.4.0.sol-0.4.0-compact.json | 3 -- .../enum-0.4.0.sol-0.4.1-compact.json | 3 -- .../enum-0.4.0.sol-0.4.10-compact.json | 3 -- .../enum-0.4.0.sol-0.4.11-compact.json | 3 -- .../enum-0.4.0.sol-0.4.2-compact.json | 3 -- .../enum-0.4.0.sol-0.4.3-compact.json | 3 -- .../enum-0.4.0.sol-0.4.4-compact.json | 3 -- .../enum-0.4.0.sol-0.4.5-compact.json | 3 -- .../enum-0.4.0.sol-0.4.6-compact.json | 3 -- .../enum-0.4.0.sol-0.4.7-compact.json | 3 -- .../enum-0.4.0.sol-0.4.8-compact.json | 3 -- .../enum-0.4.0.sol-0.4.9-compact.json | 3 -- .../expected/event-all.sol-0.4.0-compact.json | 3 -- .../expected/event-all.sol-0.4.1-compact.json | 3 -- .../event-all.sol-0.4.10-compact.json | 3 -- .../event-all.sol-0.4.11-compact.json | 3 -- .../expected/event-all.sol-0.4.2-compact.json | 3 -- .../expected/event-all.sol-0.4.3-compact.json | 3 -- .../expected/event-all.sol-0.4.4-compact.json | 3 -- .../expected/event-all.sol-0.4.5-compact.json | 3 -- .../expected/event-all.sol-0.4.6-compact.json | 3 -- .../expected/event-all.sol-0.4.7-compact.json | 3 -- .../expected/event-all.sol-0.4.8-compact.json | 3 -- .../expected/event-all.sol-0.4.9-compact.json | 3 -- .../expected/for-all.sol-0.4.0-compact.json | 15 ---------- .../expected/for-all.sol-0.4.1-compact.json | 15 ---------- .../expected/for-all.sol-0.4.10-compact.json | 15 ---------- .../expected/for-all.sol-0.4.11-compact.json | 15 ---------- .../expected/for-all.sol-0.4.2-compact.json | 15 ---------- .../expected/for-all.sol-0.4.3-compact.json | 15 ---------- .../expected/for-all.sol-0.4.4-compact.json | 15 ---------- .../expected/for-all.sol-0.4.5-compact.json | 15 ---------- .../expected/for-all.sol-0.4.6-compact.json | 15 ---------- .../expected/for-all.sol-0.4.7-compact.json | 15 ---------- .../expected/for-all.sol-0.4.8-compact.json | 15 ---------- .../expected/for-all.sol-0.4.9-compact.json | 15 ---------- .../function-0.4.0.sol-0.4.0-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.1-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.10-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.11-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.2-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.3-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.4-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.5-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.6-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.7-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.8-compact.json | 30 ------------------- .../function-0.4.0.sol-0.4.9-compact.json | 30 ------------------- .../functioncall-0.4.0.sol-0.4.0-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.1-compact.json | 11 ------- ...functioncall-0.4.0.sol-0.4.10-compact.json | 11 ------- ...functioncall-0.4.0.sol-0.4.11-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.2-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.3-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.4-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.5-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.6-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.7-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.8-compact.json | 11 ------- .../functioncall-0.4.0.sol-0.4.9-compact.json | 11 ------- .../functioncall-0.4.5.sol-0.4.5-compact.json | 11 ------- .../functioncall-0.4.5.sol-0.4.6-compact.json | 11 ------- .../functioncall-0.4.5.sol-0.4.7-compact.json | 11 ------- .../functioncall-0.4.5.sol-0.4.8-compact.json | 11 ------- .../functioncall-0.4.5.sol-0.4.9-compact.json | 11 ------- ...l_variables-0.8.18.sol-0.8.18-compact.json | 2 +- .../expected/if-all.sol-0.4.0-compact.json | 8 ----- .../expected/if-all.sol-0.4.1-compact.json | 8 ----- .../expected/if-all.sol-0.4.10-compact.json | 8 ----- .../expected/if-all.sol-0.4.11-compact.json | 8 ----- .../expected/if-all.sol-0.4.2-compact.json | 8 ----- .../expected/if-all.sol-0.4.3-compact.json | 8 ----- .../expected/if-all.sol-0.4.4-compact.json | 8 ----- .../expected/if-all.sol-0.4.5-compact.json | 8 ----- .../expected/if-all.sol-0.4.6-compact.json | 8 ----- .../expected/if-all.sol-0.4.7-compact.json | 8 ----- .../expected/if-all.sol-0.4.8-compact.json | 8 ----- .../expected/if-all.sol-0.4.9-compact.json | 8 ----- ...rom_top_level-0.4.0.sol-0.4.0-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.1-compact.json | 1 - ...om_top_level-0.4.0.sol-0.4.10-compact.json | 1 - ...om_top_level-0.4.0.sol-0.4.11-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.2-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.3-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.4-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.5-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.6-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.7-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.8-compact.json | 1 - ...rom_top_level-0.4.0.sol-0.4.9-compact.json | 1 - .../indexaccess-all.sol-0.4.0-compact.json | 5 ---- .../indexaccess-all.sol-0.4.1-compact.json | 5 ---- .../indexaccess-all.sol-0.4.10-compact.json | 5 ---- .../indexaccess-all.sol-0.4.11-compact.json | 5 ---- .../indexaccess-all.sol-0.4.2-compact.json | 5 ---- .../indexaccess-all.sol-0.4.3-compact.json | 5 ---- .../indexaccess-all.sol-0.4.4-compact.json | 5 ---- .../indexaccess-all.sol-0.4.5-compact.json | 5 ---- .../indexaccess-all.sol-0.4.6-compact.json | 5 ---- .../indexaccess-all.sol-0.4.7-compact.json | 5 ---- .../indexaccess-all.sol-0.4.8-compact.json | 5 ---- .../indexaccess-all.sol-0.4.9-compact.json | 5 ---- ...exrangeaccess-0.4.0.sol-0.4.0-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.1-compact.json | 3 -- ...xrangeaccess-0.4.0.sol-0.4.10-compact.json | 3 -- ...xrangeaccess-0.4.0.sol-0.4.11-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.2-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.3-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.4-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.5-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.6-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.7-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.8-compact.json | 3 -- ...exrangeaccess-0.4.0.sol-0.4.9-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.0-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.1-compact.json | 3 -- ...t_conversion-0.4.0.sol-0.4.10-compact.json | 3 -- ...t_conversion-0.4.0.sol-0.4.11-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.2-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.3-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.4-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.5-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.6-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.7-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.8-compact.json | 3 -- ...it_conversion-0.4.0.sol-0.4.9-compact.json | 3 -- .../literal-0.4.0.sol-0.4.0-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.1-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.2-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.3-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.4-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.5-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.6-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.7-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.8-compact.json | 5 ---- .../literal-0.4.0.sol-0.4.9-compact.json | 5 ---- .../literal-0.4.10.sol-0.4.10-compact.json | 5 ---- .../literal-0.4.10.sol-0.4.11-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.0-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.1-compact.json | 5 ---- ...memberaccess-0.4.0.sol-0.4.10-compact.json | 5 ---- ...memberaccess-0.4.0.sol-0.4.11-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.2-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.3-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.4-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.5-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.6-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.7-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.8-compact.json | 5 ---- .../memberaccess-0.4.0.sol-0.4.9-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.0-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.1-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.10-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.11-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.2-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.3-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.4-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.5-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.6-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.7-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.8-compact.json | 5 ---- .../minmax-0.4.0.sol-0.4.9-compact.json | 5 ---- .../modifier-all.sol-0.4.0-compact.json | 8 ----- .../modifier-all.sol-0.4.1-compact.json | 8 ----- .../modifier-all.sol-0.4.10-compact.json | 8 ----- .../modifier-all.sol-0.4.11-compact.json | 8 ----- .../modifier-all.sol-0.4.2-compact.json | 8 ----- .../modifier-all.sol-0.4.3-compact.json | 8 ----- .../modifier-all.sol-0.4.4-compact.json | 8 ----- .../modifier-all.sol-0.4.5-compact.json | 8 ----- .../modifier-all.sol-0.4.6-compact.json | 8 ----- .../modifier-all.sol-0.4.7-compact.json | 8 ----- .../modifier-all.sol-0.4.8-compact.json | 8 ----- .../modifier-all.sol-0.4.9-compact.json | 8 ----- .../modifier-all.sol-0.7.0-compact.json | 8 ----- .../modifier-all.sol-0.7.0-legacy.json | 8 ----- .../modifier-all.sol-0.7.1-compact.json | 8 ----- .../modifier-all.sol-0.7.1-legacy.json | 8 ----- .../modifier-all.sol-0.7.2-compact.json | 8 ----- .../modifier-all.sol-0.7.2-legacy.json | 8 ----- .../modifier-all.sol-0.7.3-compact.json | 8 ----- .../modifier-all.sol-0.7.3-legacy.json | 8 ----- .../modifier-all.sol-0.7.4-compact.json | 8 ----- .../modifier-all.sol-0.7.4-legacy.json | 8 ----- .../modifier-all.sol-0.7.5-compact.json | 8 ----- .../modifier-all.sol-0.7.5-legacy.json | 8 ----- .../modifier-all.sol-0.7.6-compact.json | 8 ----- .../modifier-all.sol-0.7.6-legacy.json | 8 ----- .../modifier-all.sol-0.8.0-compact.json | 8 ----- .../modifier-all.sol-0.8.1-compact.json | 8 ----- .../modifier-all.sol-0.8.10-compact.json | 8 ----- .../modifier-all.sol-0.8.11-compact.json | 8 ----- .../modifier-all.sol-0.8.12-compact.json | 8 ----- .../modifier-all.sol-0.8.13-compact.json | 8 ----- .../modifier-all.sol-0.8.14-compact.json | 8 ----- .../modifier-all.sol-0.8.15-compact.json | 8 ----- .../modifier-all.sol-0.8.2-compact.json | 8 ----- .../modifier-all.sol-0.8.3-compact.json | 8 ----- .../modifier-all.sol-0.8.4-compact.json | 8 ----- .../modifier-all.sol-0.8.5-compact.json | 8 ----- .../modifier-all.sol-0.8.6-compact.json | 8 ----- .../modifier-all.sol-0.8.7-compact.json | 8 ----- .../modifier-all.sol-0.8.8-compact.json | 8 ----- .../modifier-all.sol-0.8.9-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.0-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.1-compact.json | 8 ----- ...ewexpression-0.4.0.sol-0.4.10-compact.json | 8 ----- ...ewexpression-0.4.0.sol-0.4.11-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.2-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.3-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.4-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.5-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.6-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.7-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.8-compact.json | 8 ----- ...newexpression-0.4.0.sol-0.4.9-compact.json | 8 ----- .../pragma-0.4.0.sol-0.4.0-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.1-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.10-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.11-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.2-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.3-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.4-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.5-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.6-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.7-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.8-compact.json | 3 -- .../pragma-0.4.0.sol-0.4.9-compact.json | 3 -- .../expected/push-all.sol-0.4.0-compact.json | 5 ---- .../expected/push-all.sol-0.4.1-compact.json | 5 ---- .../expected/push-all.sol-0.4.10-compact.json | 5 ---- .../expected/push-all.sol-0.4.11-compact.json | 5 ---- .../expected/push-all.sol-0.4.2-compact.json | 5 ---- .../expected/push-all.sol-0.4.3-compact.json | 5 ---- .../expected/push-all.sol-0.4.4-compact.json | 5 ---- .../expected/push-all.sol-0.4.5-compact.json | 5 ---- .../expected/push-all.sol-0.4.6-compact.json | 5 ---- .../expected/push-all.sol-0.4.7-compact.json | 5 ---- .../expected/push-all.sol-0.4.8-compact.json | 5 ---- .../expected/push-all.sol-0.4.9-compact.json | 5 ---- .../return-all.sol-0.4.0-compact.json | 9 ------ .../return-all.sol-0.4.1-compact.json | 9 ------ .../return-all.sol-0.4.10-compact.json | 9 ------ .../return-all.sol-0.4.11-compact.json | 9 ------ .../return-all.sol-0.4.2-compact.json | 9 ------ .../return-all.sol-0.4.3-compact.json | 9 ------ .../return-all.sol-0.4.4-compact.json | 9 ------ .../return-all.sol-0.4.5-compact.json | 9 ------ .../return-all.sol-0.4.6-compact.json | 9 ------ .../return-all.sol-0.4.7-compact.json | 9 ------ .../return-all.sol-0.4.8-compact.json | 9 ------ .../return-all.sol-0.4.9-compact.json | 9 ------ .../scope-0.4.0.sol-0.4.0-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.1-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.10-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.11-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.2-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.3-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.4-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.5-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.6-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.7-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.8-compact.json | 8 ----- .../scope-0.4.0.sol-0.4.9-compact.json | 8 ----- .../struct-0.4.0.sol-0.4.0-compact.json | 3 -- .../struct-0.4.0.sol-0.4.1-compact.json | 3 -- .../struct-0.4.0.sol-0.4.10-compact.json | 3 -- .../struct-0.4.0.sol-0.4.11-compact.json | 3 -- .../struct-0.4.0.sol-0.4.2-compact.json | 3 -- .../struct-0.4.0.sol-0.4.3-compact.json | 3 -- .../struct-0.4.0.sol-0.4.4-compact.json | 3 -- .../struct-0.4.0.sol-0.4.5-compact.json | 3 -- .../struct-0.4.0.sol-0.4.6-compact.json | 3 -- .../struct-0.4.0.sol-0.4.7-compact.json | 3 -- .../struct-0.4.0.sol-0.4.8-compact.json | 3 -- .../struct-0.4.0.sol-0.4.9-compact.json | 3 -- .../throw-0.4.0.sol-0.4.0-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.1-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.10-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.11-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.2-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.3-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.4-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.5-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.6-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.7-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.8-compact.json | 5 ---- .../throw-0.4.0.sol-0.4.9-compact.json | 5 ---- .../top-level-0.4.0.sol-0.4.0-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.1-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.10-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.11-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.2-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.3-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.4-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.5-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.6-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.7-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.8-compact.json | 3 -- .../top-level-0.4.0.sol-0.4.9-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.0-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.1-compact.json | 3 -- ...level-import-0.4.0.sol-0.4.10-compact.json | 3 -- ...level-import-0.4.0.sol-0.4.11-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.2-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.3-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.4-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.5-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.6-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.7-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.8-compact.json | 3 -- ...-level-import-0.4.0.sol-0.4.9-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.0-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.1-compact.json | 3 -- ...l-import-bis-0.4.0.sol-0.4.10-compact.json | 3 -- ...l-import-bis-0.4.0.sol-0.4.11-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.2-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.3-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.4-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.5-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.6-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.7-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.8-compact.json | 3 -- ...el-import-bis-0.4.0.sol-0.4.9-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.0-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.1-compact.json | 3 -- ...ested-import-0.4.0.sol-0.4.10-compact.json | 3 -- ...ested-import-0.4.0.sol-0.4.11-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.2-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.3-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.4-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.5-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.6-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.7-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.8-compact.json | 3 -- ...nested-import-0.4.0.sol-0.4.9-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.0-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.1-compact.json | 3 -- ...vel_variable-0.4.0.sol-0.4.10-compact.json | 3 -- ...vel_variable-0.4.0.sol-0.4.11-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.2-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.3-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.4-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.5-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.6-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.7-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.8-compact.json | 3 -- ...evel_variable-0.4.0.sol-0.4.9-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.0-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.1-compact.json | 3 -- ...el_variable2-0.4.0.sol-0.4.10-compact.json | 3 -- ...el_variable2-0.4.0.sol-0.4.11-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.2-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.3-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.4-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.5-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.6-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.7-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.8-compact.json | 3 -- ...vel_variable2-0.4.0.sol-0.4.9-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.0-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.1-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.10-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.11-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.2-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.3-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.4-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.5-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.6-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.7-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.8-compact.json | 3 -- .../trycatch-0.4.0.sol-0.4.9-compact.json | 3 -- ...pleexpression-0.4.0.sol-0.4.0-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.1-compact.json | 5 ---- ...leexpression-0.4.0.sol-0.4.10-compact.json | 5 ---- ...leexpression-0.4.0.sol-0.4.11-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.2-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.3-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.4-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.5-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.6-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.7-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.8-compact.json | 5 ---- ...pleexpression-0.4.0.sol-0.4.9-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.0-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.1-compact.json | 5 ---- ...ryexpression-0.4.0.sol-0.4.10-compact.json | 5 ---- ...ryexpression-0.4.0.sol-0.4.11-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.2-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.3-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.4-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.5-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.6-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.7-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.8-compact.json | 5 ---- ...aryexpression-0.4.0.sol-0.4.9-compact.json | 5 ---- .../unchecked-0.4.0.sol-0.4.0-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.1-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.10-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.11-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.2-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.3-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.4-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.5-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.6-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.7-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.8-compact.json | 3 -- .../unchecked-0.4.0.sol-0.4.9-compact.json | 3 -- ...bal_variables-0.4.0.sol-0.4.0-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.1-compact.json | 10 ------- ...al_variables-0.4.0.sol-0.4.10-compact.json | 10 ------- ...al_variables-0.4.0.sol-0.4.11-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.2-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.3-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.4-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.5-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.6-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.7-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.8-compact.json | 10 ------- ...bal_variables-0.4.0.sol-0.4.9-compact.json | 10 ------- ...user_defined_types.sol-0.8.10-compact.json | 10 ------- ...user_defined_types.sol-0.8.11-compact.json | 10 ------- ...user_defined_types.sol-0.8.12-compact.json | 10 ------- .../user_defined_types.sol-0.8.8-compact.json | 10 ------- .../top-level-0.8.8.sol-0.8.10-compact.json | 2 +- .../top-level-0.8.8.sol-0.8.11-compact.json | 2 +- .../top-level-0.8.8.sol-0.8.12-compact.json | 2 +- .../top-level-0.8.8.sol-0.8.13-compact.json | 2 +- .../top-level-0.8.8.sol-0.8.14-compact.json | 2 +- .../top-level-0.8.8.sol-0.8.15-compact.json | 2 +- .../top-level-0.8.8.sol-0.8.8-compact.json | 2 +- .../using-for-0.4.0.sol-0.4.0-compact.json | 3 -- .../using-for-0.4.1.sol-0.4.1-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.10-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.11-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.2-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.3-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.4-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.5-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.6-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.7-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.8-compact.json | 9 ------ .../using-for-0.4.1.sol-0.4.9-compact.json | 9 ------ .../variable-0.4.0.sol-0.4.0-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.1-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.10-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.11-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.2-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.3-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.4-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.5-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.6-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.7-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.8-compact.json | 6 ---- .../variable-0.4.0.sol-0.4.9-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.10-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.11-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.5-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.6-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.7-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.8-compact.json | 6 ---- .../variable-0.4.5.sol-0.4.9-compact.json | 6 ---- .../expected/while-all.sol-0.4.0-compact.json | 5 ---- .../expected/while-all.sol-0.4.1-compact.json | 5 ---- .../while-all.sol-0.4.10-compact.json | 5 ---- .../while-all.sol-0.4.11-compact.json | 5 ---- .../expected/while-all.sol-0.4.2-compact.json | 5 ---- .../expected/while-all.sol-0.4.3-compact.json | 5 ---- .../expected/while-all.sol-0.4.4-compact.json | 5 ---- .../expected/while-all.sol-0.4.5-compact.json | 5 ---- .../expected/while-all.sol-0.4.6-compact.json | 5 ---- .../expected/while-all.sol-0.4.7-compact.json | 5 ---- .../expected/while-all.sol-0.4.8-compact.json | 5 ---- .../expected/while-all.sol-0.4.9-compact.json | 5 ---- .../expected/yul-0.4.0.sol-0.4.0-compact.json | 5 ---- .../expected/yul-0.4.1.sol-0.4.1-compact.json | 6 ---- .../yul-0.4.1.sol-0.4.10-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.2-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.3-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.4-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.5-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.6-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.7-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.8-compact.json | 6 ---- .../expected/yul-0.4.1.sol-0.4.9-compact.json | 6 ---- .../yul-0.4.11.sol-0.4.11-compact.json | 6 ---- .../yul-0.4.11.sol-0.6.0-compact.json | 2 +- .../yul-0.4.11.sol-0.6.1-compact.json | 2 +- .../yul-0.4.11.sol-0.6.10-compact.json | 2 +- .../yul-0.4.11.sol-0.6.11-compact.json | 2 +- .../yul-0.4.11.sol-0.6.12-compact.json | 2 +- .../yul-0.4.11.sol-0.6.2-compact.json | 2 +- .../yul-0.4.11.sol-0.6.3-compact.json | 2 +- .../yul-0.4.11.sol-0.6.4-compact.json | 2 +- .../yul-0.4.11.sol-0.6.5-compact.json | 2 +- .../yul-0.4.11.sol-0.6.6-compact.json | 2 +- .../yul-0.4.11.sol-0.6.7-compact.json | 2 +- .../yul-0.4.11.sol-0.6.8-compact.json | 2 +- .../yul-0.4.11.sol-0.6.9-compact.json | 2 +- .../expected/yul-0.7.0.sol-0.7.0-compact.json | 2 +- .../expected/yul-0.7.0.sol-0.7.1-compact.json | 2 +- .../expected/yul-0.7.0.sol-0.7.2-compact.json | 2 +- .../expected/yul-0.7.0.sol-0.7.3-compact.json | 2 +- .../expected/yul-0.7.0.sol-0.7.4-compact.json | 2 +- .../expected/yul-0.7.5.sol-0.7.5-compact.json | 2 +- .../expected/yul-0.7.5.sol-0.7.6-compact.json | 2 +- .../expected/yul-0.8.0.sol-0.8.0-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.1-compact.json | 4 +-- .../yul-0.8.0.sol-0.8.10-compact.json | 4 +-- .../yul-0.8.0.sol-0.8.11-compact.json | 4 +-- .../yul-0.8.0.sol-0.8.12-compact.json | 4 +-- .../yul-0.8.0.sol-0.8.13-compact.json | 4 +-- .../yul-0.8.0.sol-0.8.14-compact.json | 4 +-- .../yul-0.8.0.sol-0.8.15-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.2-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.3-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.4-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.5-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.6-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.7-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.8-compact.json | 4 +-- .../expected/yul-0.8.0.sol-0.8.9-compact.json | 4 +-- ...te-constant-access.sol-0.8.16-compact.json | 4 +-- 699 files changed, 141 insertions(+), 3911 deletions(-) delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-legacy.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.12-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.13-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.14-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.15-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.12-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.11-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.0.sol-0.4.0-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.1-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.10-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.2-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.3-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.4-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.5-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.6-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.7-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.8-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.9-compact.json delete mode 100644 tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.4.11-compact.json diff --git a/slither/core/cfg/node.py b/slither/core/cfg/node.py index 2a48bd2358..596eb0e81a 100644 --- a/slither/core/cfg/node.py +++ b/slither/core/cfg/node.py @@ -74,6 +74,7 @@ class NodeType(Enum): IF = "IF" VARIABLE = "NEW VARIABLE" # Variable declaration ASSEMBLY = "INLINE ASM" + ENDASSEMBLY = "END INLINE ASM" IFLOOP = "IF_LOOP" # Nodes where control flow merges diff --git a/slither/solc_parsing/declarations/function.py b/slither/solc_parsing/declarations/function.py index 35ca51aebe..01a4d22386 100644 --- a/slither/solc_parsing/declarations/function.py +++ b/slither/solc_parsing/declarations/function.py @@ -983,7 +983,9 @@ def _parse_statement( # technically, entrypoint and exitpoint are YulNodes and we should be returning a NodeSolc here # but they both expose an underlying_node so oh well link_underlying_nodes(node, entrypoint) - node = exitpoint + end_assembly = self._new_node(NodeType.ENDASSEMBLY, statement["src"], scope) + link_underlying_nodes(exitpoint, end_assembly) + node = end_assembly else: asm_node = self._new_node(NodeType.ASSEMBLY, statement["src"], scope) self._function.contains_assembly = True diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.0-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.0-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.0-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.1-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.1-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.1-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.10-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.10-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.11-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.11-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.12-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.12-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.2-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.2-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.2-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.3-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.3-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.3-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.4-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.4-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.5-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.5-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.6-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.6-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.7-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.7-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.7-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.8-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.8-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.9-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.6.9-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.0-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.0-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.0-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.1-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.1-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.1-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.2-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.2-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.2-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.3-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.3-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.3-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.4-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.4-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.5-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.5-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.6-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.7.6-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.0-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.0-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.0-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.1-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.1-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.1-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.10-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.10-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.11-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.11-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.12-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.12-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.13-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.13-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.13-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.13-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.14-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.14-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.14-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.14-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.15-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.15-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.15-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.15-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.2-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.2-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.2-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.3-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.3-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.3-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.4-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.4-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.5-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.5-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.6-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.6-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.7-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.7-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.7-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.8-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.8-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.9-compact.json index 5bfb159c11..ff18e4e471 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-all.sol-0.8.9-compact.json @@ -1,6 +1,6 @@ { "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->7;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->1;\n}\n", - "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: _ 4\n\"];\n}\n" + "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->9;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: INLINE ASM 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: END INLINE ASM 8\n\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->1;\n}\n", + "a()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n4->5;\n5[label=\"Node Type: _ 5\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.6.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.6.9-compact.json index a48faa23d8..0c50d020c3 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.6.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.6.9-compact.json @@ -1,6 +1,6 @@ { "A": { - "foo()": "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", + "foo()": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n", "foo.asm_0.f()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "foo.asm_0.f.z()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "foo.asm_0.f.z.x()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.7.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.7.6-compact.json index a48faa23d8..0c50d020c3 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.7.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.7.6-compact.json @@ -1,6 +1,6 @@ { "A": { - "foo()": "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", + "foo()": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n", "foo.asm_0.f()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "foo.asm_0.f.z()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "foo.asm_0.f.z.x()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", diff --git a/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.8.16-compact.json b/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.8.16-compact.json index a48faa23d8..0c50d020c3 100644 --- a/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.8.16-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/assembly-functions.sol-0.8.16-compact.json @@ -1,6 +1,6 @@ { "A": { - "foo()": "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", + "foo()": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n", "foo.asm_0.f()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "foo.asm_0.f.z()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "foo.asm_0.f.z.x()": "digraph{\n0[label=\"Node Type: INLINE ASM 0\n\"];\n0->1;\n1[label=\"Node Type: ENTRY_POINT 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 8db75806e2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.7-compact.json deleted file mode 100644 index 8f9f9857b0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.8-compact.json deleted file mode 100644 index 8f9f9857b0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.9-compact.json deleted file mode 100644 index 8f9f9857b0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/assignment-0.4.7.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index f7313f2eb9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.7-compact.json deleted file mode 100644 index 8939b57f28..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.8-compact.json deleted file mode 100644 index 8939b57f28..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.9-compact.json deleted file mode 100644 index 8939b57f28..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/binaryoperation-0.4.7.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.0-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.1-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.10-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.11-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.2-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.3-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.4-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.5-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.6-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.7-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.8-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.9-compact.json deleted file mode 100644 index b9b7fc93ef..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/break-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: BREAK 7\n\"];\n7->3;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: BREAK 20\n\"];\n20->16;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.0-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.1-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.10-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.11-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.2-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.3-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.4-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.5-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.6-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.7-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.8-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.9-compact.json deleted file mode 100644 index 113bb5a149..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/call_to_variable-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": {}, - "D": { - "f(C)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.0-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.1-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.10-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.11-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.2-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.3-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.4-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.5-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.6-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.7-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.8-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.9-compact.json deleted file mode 100644 index a53745acd0..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/comment-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "A": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.0-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.1-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.10-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.11-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.2-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.3-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.4-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.5-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.6-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.7-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.8-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.9-compact.json deleted file mode 100644 index bba15d9bde..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/continue-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n3->13;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: IF 6\n\"];\n6->7[label=\"True\"];\n6->8[label=\"False\"];\n7[label=\"Node Type: CONTINUE 7\n\"];\n7->2;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->5;\n11[label=\"Node Type: BEGIN_LOOP 11\n\"];\n11->14;\n12[label=\"Node Type: END_LOOP 12\n\"];\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->11;\n14[label=\"Node Type: IF_LOOP 14\n\"];\n14->17[label=\"True\"];\n14->12[label=\"False\"];\n15[label=\"Node Type: BEGIN_LOOP 15\n\"];\n15->18;\n16[label=\"Node Type: END_LOOP 16\n\"];\n16->24;\n17[label=\"Node Type: NEW VARIABLE 17\n\"];\n17->15;\n18[label=\"Node Type: IF_LOOP 18\n\"];\n18->19[label=\"True\"];\n18->16[label=\"False\"];\n19[label=\"Node Type: IF 19\n\"];\n19->20[label=\"True\"];\n19->21[label=\"False\"];\n20[label=\"Node Type: CONTINUE 20\n\"];\n20->15;\n21[label=\"Node Type: END_IF 21\n\"];\n21->22;\n22[label=\"Node Type: EXPRESSION 22\n\"];\n22->23;\n23[label=\"Node Type: EXPRESSION 23\n\"];\n23->18;\n24[label=\"Node Type: EXPRESSION 24\n\"];\n24->14;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 5c911c175f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/contract-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "A": {}, - "B": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "D": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "D()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - }, - "E": { - "B(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "F": {}, - "G": {}, - "H": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.5-compact.json deleted file mode 100644 index 1cf3175751..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.6-compact.json deleted file mode 100644 index 1cf3175751..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.7-compact.json deleted file mode 100644 index 1cf3175751..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.8-compact.json deleted file mode 100644 index 1cf3175751..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.9-compact.json deleted file mode 100644 index 1cf3175751..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/dowhile-0.4.5.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->4;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->9;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-compact.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-compact.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-legacy.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.21-legacy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-compact.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-compact.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-legacy.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.22-legacy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-compact.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-compact.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-legacy.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.23-legacy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-compact.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-compact.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-legacy.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.24-legacy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-compact.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-compact.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-legacy.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.25-legacy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-compact.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-compact.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-legacy.json deleted file mode 100644 index c940f7b41c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.21.sol-0.4.26-legacy.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "emitWithKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-compact.json deleted file mode 100644 index a4e54d0eee..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-legacy.json deleted file mode 100644 index a4e54d0eee..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.8-legacy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-compact.json deleted file mode 100644 index a4e54d0eee..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-legacy.json b/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-legacy.json deleted file mode 100644 index a4e54d0eee..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/emit-0.4.8.sol-0.4.9-legacy.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "emitNoKeyword()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/enum-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/event-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.0-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.1-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.10-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.11-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.2-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.3-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.4-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.5-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.6-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.7-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.8-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.9-compact.json deleted file mode 100644 index fe24348d83..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/for-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "C": { - "normalLoopBlockBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopExprBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "normalLoopNoBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->5;\n}\n", - "loopNoPre()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoPreCond()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPrePost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->4[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n", - "loopNoCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->3;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->2;\n}\n", - "loopNoPreCondPost()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: BEGIN_LOOP 3\n\"];\n3->5;\n4[label=\"Node Type: END_LOOP 4\n\"];\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: BREAK 6\n\"];\n6->4;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->3;\n}\n", - "loopNoPreCondPostBody()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: BEGIN_LOOP 1\n\"];\n1->1;\n1->2;\n2[label=\"Node Type: END_LOOP 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 5406c6dd07..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/function-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "C1": { - "C1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C2": { - "C2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "fallback()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C3": { - "C3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", - "modifierNoArgs()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n", - "modifierWithArgs(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: _ 1\n\"];\n}\n" - }, - "C4": { - "hasArgs(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasReturns()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "hasArgsAndReturns(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C5": { - "constantFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "payableFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "externalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "publicFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "privateFunc()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "abstractFunc()": "digraph{\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 771efb1102..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.5-compact.json deleted file mode 100644 index b36758ed70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.5-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.6-compact.json deleted file mode 100644 index b36758ed70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.6-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.7-compact.json deleted file mode 100644 index b36758ed70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.7-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.8-compact.json deleted file mode 100644 index b36758ed70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.8-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.9-compact.json deleted file mode 100644 index b36758ed70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/functioncall-0.4.5.sol-0.4.9-compact.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "I": { - "I()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n}\n", - "publicTarget()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "internalTarget(uint256,uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "cursed()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/global_variables-0.8.18.sol-0.8.18-compact.json b/tests/e2e/solc_parsing/test_data/expected/global_variables-0.8.18.sol-0.8.18-compact.json index b74cf71158..5f42b943e7 100644 --- a/tests/e2e/solc_parsing/test_data/expected/global_variables-0.8.18.sol-0.8.18-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/global_variables-0.8.18.sol-0.8.18-compact.json @@ -1,6 +1,6 @@ { "C": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "g()": "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" + "g()": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.0-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.1-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.10-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.11-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.2-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.3-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.4-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.5-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.6-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.7-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.8-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.9-compact.json deleted file mode 100644 index c0c884b4e6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/if-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "C": { - "ifWithoutElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: END_IF 3\n\"];\n}\n", - "ifWithElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->4;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "ifWithElseIf()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->9;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->8;\n5[label=\"Node Type: IF 5\n\"];\n5->6[label=\"True\"];\n5->7[label=\"False\"];\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n7->8;\n8[label=\"Node Type: END_IF 8\n\"];\n8->9;\n9[label=\"Node Type: END_IF 9\n\"];\n}\n", - "ifWithElseIfElse()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->7;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->6;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: END_IF 6\n\"];\n6->7;\n7[label=\"Node Type: END_IF 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 9e26dfeeb6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/import_interface_with_struct_from_top_level-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.0-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.1-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.10-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.11-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.2-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.3-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.4-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.5-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.6-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.7-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.8-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.9-compact.json deleted file mode 100644 index 43190fcd6c..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexaccess-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/indexrangeaccess-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/library_implicit_conversion-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 141d16af31..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.10-compact.json deleted file mode 100644 index b29327c65b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: EXPRESSION 21\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.11-compact.json deleted file mode 100644 index b29327c65b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/literal-0.4.10.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n14->15;\n15[label=\"Node Type: EXPRESSION 15\n\"];\n15->16;\n16[label=\"Node Type: EXPRESSION 16\n\"];\n16->17;\n17[label=\"Node Type: EXPRESSION 17\n\"];\n17->18;\n18[label=\"Node Type: EXPRESSION 18\n\"];\n18->19;\n19[label=\"Node Type: EXPRESSION 19\n\"];\n19->20;\n20[label=\"Node Type: EXPRESSION 20\n\"];\n20->21;\n21[label=\"Node Type: EXPRESSION 21\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 2772fda535..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/memberaccess-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 228af371a7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/minmax-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.0-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.1-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.10-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.11-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.2-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.3-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.4-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.5-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.6-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.7-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.8-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.9-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.0-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.1-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.2-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.3-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.4-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.5-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-legacy.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-legacy.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.7.6-legacy.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.0-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.0-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.1-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.1-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.10-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.10-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.11-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.11-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.12-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.12-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.13-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.13-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.13-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.14-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.14-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.14-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.15-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.15-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.15-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.2-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.2-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.3-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.3-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.4-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.4-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.5-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.5-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.6-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.6-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.7-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.7-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.8-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.8-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.9-compact.json deleted file mode 100644 index 34aad8ef18..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/modifier-all.sol-0.8.9-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "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/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index cf3c4f4ea9..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/newexpression-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "B": { - "B()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n" - }, - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/pragma-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.0-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.1-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.10-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.11-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.2-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.3-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.4-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.5-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.6-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.7-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.8-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.9-compact.json deleted file mode 100644 index a1a35e654b..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/push-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.0-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.1-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.10-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.11-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.2-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.3-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.4-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.5-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.6-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.7-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.8-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.9-compact.json deleted file mode 100644 index 7eddd38f6f..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/return-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "C": { - "returnConstant()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "returnVariable()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: RETURN 2\n\"];\n}\n", - "returnTuple()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: RETURN 3\n\"];\n}\n", - "returnTernary()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->3;\n3[label=\"Node Type: IF 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: RETURN 4\n\"];\n5[label=\"Node Type: RETURN 5\n\"];\n}\n", - "returnDelete()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 00c3dbb1a2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/scope-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Scope": { - "nested_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n}\n", - "if_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->4;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: END_IF 4\n\"];\n}\n", - "while_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n}\n", - "for_scope()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->4;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->5;\n3[label=\"Node Type: END_LOOP 3\n\"];\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->2;\n5[label=\"Node Type: IF_LOOP 5\n\"];\n5->6[label=\"True\"];\n5->3[label=\"False\"];\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->5;\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/struct-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index a444e777e7..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/throw-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: IF 1\n\"];\n1->2[label=\"True\"];\n1->3[label=\"False\"];\n2[label=\"Node Type: THROW 2\n\"];\n3[label=\"Node Type: END_IF 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-import-bis-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top-level-nested-import-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 7caa60cf70..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/top_level_variable2-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "A": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/trycatch-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index b5912e6b8e..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/tupleexpression-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index b4c60f249a..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unaryexpression-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/unchecked-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index 94dd85fe06..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/units_and_global_variables-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Test": { - "ether_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n}\n", - "time_unit()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n}\n", - "block_and_transactions()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: EXPRESSION 7\n\"];\n7->8;\n8[label=\"Node Type: EXPRESSION 8\n\"];\n8->9;\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n10->11;\n11[label=\"Node Type: EXPRESSION 11\n\"];\n11->12;\n12[label=\"Node Type: EXPRESSION 12\n\"];\n12->13;\n13[label=\"Node Type: EXPRESSION 13\n\"];\n13->14;\n14[label=\"Node Type: EXPRESSION 14\n\"];\n}\n", - "math_and_crypto()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->5;\n5[label=\"Node Type: EXPRESSION 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: EXPRESSION 10\n\"];\n}\n", - "address_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", - "contract_related()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.10-compact.json deleted file mode 100644 index 06367c7cdb..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.10-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "B": { - "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - }, - "D": {}, - "C": { - "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.11-compact.json deleted file mode 100644 index 06367c7cdb..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.11-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "B": { - "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - }, - "D": {}, - "C": { - "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.12-compact.json deleted file mode 100644 index 06367c7cdb..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.12-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "B": { - "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - }, - "D": {}, - "C": { - "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.8-compact.json deleted file mode 100644 index 06367c7cdb..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_types.sol-0.8.8-compact.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "B": { - "u()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n}\n", - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" - }, - "D": {}, - "C": { - "f(Left[])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.10-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.10-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.11-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.11-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.12-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.12-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.13-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.13-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.13-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.13-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.14-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.14-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.14-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.14-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.15-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.15-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.15-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.15-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.8-compact.json index c8211c6366..6a50f34f74 100644 --- a/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/user_defined_value_type/top-level-0.8.8.sol-0.8.8-compact.json @@ -1,5 +1,5 @@ { "Test": { - "set(StackTop,uint256)": "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" + "set(StackTop,uint256)": "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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 0008a44692..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.1-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.1-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.10-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.10-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.11-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.11-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.2-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.2-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.3-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.3-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.4-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.4-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.5-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.5-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.6-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.6-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.7-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.7-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.8-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.8-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.9-compact.json deleted file mode 100644 index 27fa7c3238..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/using-for-0.4.1.sol-0.4.9-compact.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "L1": { - "f(uint256)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "L2": { - "f(bytes32)": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n" - }, - "C": {} -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.1-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.1-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.10-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.10-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.11-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.11-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.2-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.2-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.3-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.3-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.4-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.4-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.5-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.5-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.6-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.6-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.7-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.7-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.8-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.8-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.9-compact.json deleted file mode 100644 index cddfa6daed..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.0.sol-0.4.9-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.10-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.10-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.11-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.11-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.5-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.5-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.6-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.6-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.7-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.7-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.8-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.8-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.9-compact.json deleted file mode 100644 index 439c5ec122..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/variable-0.4.5.sol-0.4.9-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "C": { - "basic()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n9->10;\n10[label=\"Node Type: NEW VARIABLE 10\n\"];\n10->11;\n11[label=\"Node Type: NEW VARIABLE 11\n\"];\n11->12;\n12[label=\"Node Type: NEW VARIABLE 12\n\"];\n12->13;\n13[label=\"Node Type: NEW VARIABLE 13\n\"];\n13->14;\n14[label=\"Node Type: NEW VARIABLE 14\n\"];\n14->15;\n15[label=\"Node Type: NEW VARIABLE 15\n\"];\n15->16;\n16[label=\"Node Type: NEW VARIABLE 16\n\"];\n}\n", - "complex()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: NEW VARIABLE 2\n\"];\n2->3;\n3[label=\"Node Type: NEW VARIABLE 3\n\"];\n3->4;\n4[label=\"Node Type: NEW VARIABLE 4\n\"];\n4->5;\n5[label=\"Node Type: NEW VARIABLE 5\n\"];\n5->6;\n6[label=\"Node Type: NEW VARIABLE 6\n\"];\n6->7;\n7[label=\"Node Type: NEW VARIABLE 7\n\"];\n7->8;\n8[label=\"Node Type: NEW VARIABLE 8\n\"];\n8->9;\n9[label=\"Node Type: NEW VARIABLE 9\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.0-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.1-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.1-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.10-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.10-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.11-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.11-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.2-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.2-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.3-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.3-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.4-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.4-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.5-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.5-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.6-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.6-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.7-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.7-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.8-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.8-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.9-compact.json deleted file mode 100644 index 4d96573912..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/while-all.sol-0.4.9-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "C": { - "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: BEGIN_LOOP 2\n\"];\n2->3;\n3[label=\"Node Type: IF_LOOP 3\n\"];\n3->4[label=\"True\"];\n3->5[label=\"False\"];\n4[label=\"Node Type: EXPRESSION 4\n\"];\n4->3;\n5[label=\"Node Type: END_LOOP 5\n\"];\n5->6;\n6[label=\"Node Type: EXPRESSION 6\n\"];\n6->7;\n7[label=\"Node Type: BEGIN_LOOP 7\n\"];\n7->8;\n8[label=\"Node Type: IF_LOOP 8\n\"];\n8->9[label=\"True\"];\n8->10[label=\"False\"];\n9[label=\"Node Type: EXPRESSION 9\n\"];\n9->8;\n10[label=\"Node Type: END_LOOP 10\n\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.0.sol-0.4.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.0.sol-0.4.0-compact.json deleted file mode 100644 index 8f6ef922b6..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.0.sol-0.4.0-compact.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.1-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.1-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.10-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.10-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.2-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.2-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.3-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.3-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.4-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.4-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.5-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.5-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.6-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.6-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.7-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.7-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.8-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.8-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.9-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.1.sol-0.4.9-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.4.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.4.11-compact.json deleted file mode 100644 index a9569a2fb2..0000000000 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.4.11-compact.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "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\"];\n}\n" - } -} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.0-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.0-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.0-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.1-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.1-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.1-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.10-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.10-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.11-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.11-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.12-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.12-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.2-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.2-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.2-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.3-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.3-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.3-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.4-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.4-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.5-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.5-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.6-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.6-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.7-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.7-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.7-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.8-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.8-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.9-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.4.11.sol-0.6.9-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.0-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.0-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.0-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.1-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.1-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.1-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.2-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.2-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.2-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.3-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.3-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.3-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.4-compact.json index 04cb49aa8d..bb6d4d5622 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.0.sol-0.7.4-compact.json @@ -1,6 +1,6 @@ { "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: 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\"];\n29->30;\n30[label=\"Node Type: END INLINE ASM 30\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.5-compact.json index c180eeda72..55d59666c7 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.5-compact.json @@ -1,5 +1,5 @@ { "C": { - "f(bytes)": "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\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" + "f(bytes)": "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\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.6-compact.json index c180eeda72..55d59666c7 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.7.5.sol-0.7.6-compact.json @@ -1,5 +1,5 @@ { "C": { - "f(bytes)": "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\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n" + "f(bytes)": "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\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.0-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.0-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.0-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.0-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.1-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.1-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.1-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.1-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.10-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.10-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.11-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.11-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.12-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.12-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.13-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.13-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.13-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.13-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.14-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.14-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.14-compact.json +++ b/tests/e2e/solc_parsing/test_data/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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.15-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.15-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.15-compact.json +++ b/tests/e2e/solc_parsing/test_data/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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.2-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.2-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.2-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.2-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.3-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.3-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.3-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.3-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.4-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.4-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.5-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.5-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.6-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.6-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.7-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.7-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.7-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.8-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.8-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.9-compact.json index b58e03af77..6d58794c9d 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-0.8.0.sol-0.8.9-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: 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" + "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\"];\n31->32;\n32[label=\"Node Type: END INLINE ASM 32\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\"];\n2->3;\n3[label=\"Node Type: END INLINE ASM 3\n\"];\n}\n" } } \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/expected/yul-state-constant-access.sol-0.8.16-compact.json b/tests/e2e/solc_parsing/test_data/expected/yul-state-constant-access.sol-0.8.16-compact.json index 6c6bc93779..62a5f1a903 100644 --- a/tests/e2e/solc_parsing/test_data/expected/yul-state-constant-access.sol-0.8.16-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/yul-state-constant-access.sol-0.8.16-compact.json @@ -1,12 +1,12 @@ { "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "f2()": "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: INLINE ASM 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "f2()": "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: INLINE ASM 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n}\n", "f3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" }, "B": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: RETURN 1\n\"];\n}\n", - "f2()": "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: INLINE ASM 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n}\n", + "f2()": "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: INLINE ASM 2\n\"];\n2->3;\n3[label=\"Node Type: EXPRESSION 3\n\"];\n3->4;\n4[label=\"Node Type: END INLINE ASM 4\n\"];\n}\n", "f3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n" } } \ No newline at end of file From 47800850cc70bca405687c4ba184fb5321a66a9b Mon Sep 17 00:00:00 2001 From: webthethird Date: Mon, 7 Aug 2023 16:59:13 -0500 Subject: [PATCH 052/169] Black --- slither/utils/code_generation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/utils/code_generation.py b/slither/utils/code_generation.py index 907100239e..2157570101 100644 --- a/slither/utils/code_generation.py +++ b/slither/utils/code_generation.py @@ -12,7 +12,7 @@ MappingType, ArrayType, ElementaryType, - TypeAlias + TypeAlias, ) from slither.core.declarations import Structure, StructureContract, Enum, Contract From 73d8b7f2f2357c47cf42436b586d84314984a43b Mon Sep 17 00:00:00 2001 From: webthethird Date: Mon, 7 Aug 2023 17:12:31 -0500 Subject: [PATCH 053/169] Add regression test for handling external structs --- .../test_data/code_generation/CodeGeneration.sol | 13 +++++++++++-- tests/unit/utils/test_data/code_generation/IFee.sol | 5 +++++ .../code_generation/TEST_generated_code.sol | 4 ++++ .../TEST_generated_code_not_unrolled.sol | 4 ++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tests/unit/utils/test_data/code_generation/IFee.sol diff --git a/tests/unit/utils/test_data/code_generation/CodeGeneration.sol b/tests/unit/utils/test_data/code_generation/CodeGeneration.sol index 6f1f63c72f..292a4b43f7 100644 --- a/tests/unit/utils/test_data/code_generation/CodeGeneration.sol +++ b/tests/unit/utils/test_data/code_generation/CodeGeneration.sol @@ -1,7 +1,10 @@ pragma solidity ^0.8.4; + +import "./IFee.sol"; + interface I { - enum SomeEnum { ONE, TWO, THREE } - error ErrorWithEnum(SomeEnum e); + enum SomeEnum { ONE, TWO, THREE } + error ErrorWithEnum(SomeEnum e); } contract TestContract is I { @@ -62,4 +65,10 @@ contract TestContract is I { function setOtherI(I _i) public { otherI = _i; } + + function newFee(uint128 fee) public returns (IFee.Fee memory) { + IFee.Fee memory _fee; + _fee.fee = fee; + return _fee; + } } \ No newline at end of file diff --git a/tests/unit/utils/test_data/code_generation/IFee.sol b/tests/unit/utils/test_data/code_generation/IFee.sol new file mode 100644 index 0000000000..17560f60ce --- /dev/null +++ b/tests/unit/utils/test_data/code_generation/IFee.sol @@ -0,0 +1,5 @@ +interface IFee { + struct Fee { + uint128 fee; + } +} diff --git a/tests/unit/utils/test_data/code_generation/TEST_generated_code.sol b/tests/unit/utils/test_data/code_generation/TEST_generated_code.sol index 373fba9ca2..5240e10633 100644 --- a/tests/unit/utils/test_data/code_generation/TEST_generated_code.sol +++ b/tests/unit/utils/test_data/code_generation/TEST_generated_code.sol @@ -14,6 +14,9 @@ interface ITestContract { struct Nested { St st; } + struct Fee { + uint128 fee; + } function stateA() external returns (uint256); function owner() external returns (address); function structsMap(address,uint256) external returns (uint256); @@ -26,5 +29,6 @@ interface ITestContract { function getSt(uint256) external view returns (uint256); function removeSt(uint256) external; function setOtherI(address) external; + function newFee(uint128) external returns (uint128); } diff --git a/tests/unit/utils/test_data/code_generation/TEST_generated_code_not_unrolled.sol b/tests/unit/utils/test_data/code_generation/TEST_generated_code_not_unrolled.sol index 0cc4dc0404..1154ec4cc4 100644 --- a/tests/unit/utils/test_data/code_generation/TEST_generated_code_not_unrolled.sol +++ b/tests/unit/utils/test_data/code_generation/TEST_generated_code_not_unrolled.sol @@ -14,6 +14,9 @@ interface ITestContract { struct Nested { St st; } + struct Fee { + uint128 fee; + } function stateA() external returns (uint256); function owner() external returns (address); function structsMap(address,uint256) external returns (St memory); @@ -26,5 +29,6 @@ interface ITestContract { function getSt(uint256) external view returns (St memory); function removeSt(St memory) external; function setOtherI(address) external; + function newFee(uint128) external returns (Fee memory); } From 4b0482014dbf911f886a5f1221260ccb71a7cd22 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 8 Aug 2023 10:01:12 -0500 Subject: [PATCH 054/169] chore: bump sigstore to 2.0.0 (#2081) --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 24f04ee87b..977a92ab21 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -47,8 +47,7 @@ jobs: uses: pypa/gh-action-pypi-publish@v1.8.8 - name: sign - uses: sigstore/gh-action-sigstore-python@v1.2.3 + uses: sigstore/gh-action-sigstore-python@v2.0.0 with: inputs: ./dist/*.tar.gz ./dist/*.whl release-signing-artifacts: true - bundle-only: true From 2bc6a0f1a4349e2cb6a45bf7a078f65e050d7e28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:22:08 +0000 Subject: [PATCH 055/169] Bump pypa/gh-action-pypi-publish from 1.8.8 to 1.8.10 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.8 to 1.8.10. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.8...v1.8.10) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 977a92ab21..ed11178e37 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -44,7 +44,7 @@ jobs: path: dist/ - name: publish - uses: pypa/gh-action-pypi-publish@v1.8.8 + uses: pypa/gh-action-pypi-publish@v1.8.10 - name: sign uses: sigstore/gh-action-sigstore-python@v2.0.0 From 81c0c8cd88a437f39fa6aece06470f7e8c1b1a31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:22:13 +0000 Subject: [PATCH 056/169] Bump sigstore/gh-action-sigstore-python from 2.0.0 to 2.0.1 Bumps [sigstore/gh-action-sigstore-python](https://github.com/sigstore/gh-action-sigstore-python) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/sigstore/gh-action-sigstore-python/releases) - [Commits](https://github.com/sigstore/gh-action-sigstore-python/compare/v2.0.0...v2.0.1) --- updated-dependencies: - dependency-name: sigstore/gh-action-sigstore-python dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 977a92ab21..cd6feacceb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -47,7 +47,7 @@ jobs: uses: pypa/gh-action-pypi-publish@v1.8.8 - name: sign - uses: sigstore/gh-action-sigstore-python@v2.0.0 + uses: sigstore/gh-action-sigstore-python@v2.0.1 with: inputs: ./dist/*.tar.gz ./dist/*.whl release-signing-artifacts: true From 7b3e0645e33185c3081b26c8cfc9ff159808284f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 17 Aug 2023 22:22:48 -0500 Subject: [PATCH 057/169] WIP --- slither/__main__.py | 10 +- slither/core/compilation_unit.py | 24 ++ slither/core/declarations/contract.py | 2 +- slither/core/declarations/function.py | 6 +- slither/core/expressions/binary_operation.py | 2 +- slither/core/expressions/identifier.py | 2 +- slither/slither.py | 35 +- .../slither_compilation_unit_solc.py | 18 +- .../visitors/slithir/expression_to_slithir.py | 1 + slither/vyper_parsing/__init__.py | 0 slither/vyper_parsing/ast/__init__.py | 0 slither/vyper_parsing/ast/ast.py | 373 ++++++++++++++++++ slither/vyper_parsing/ast/types.py | 270 +++++++++++++ slither/vyper_parsing/cfg/__init__.py | 0 slither/vyper_parsing/cfg/node.py | 66 ++++ .../vyper_parsing/declarations/__init__.py | 0 .../vyper_parsing/declarations/contract.py | 176 +++++++++ slither/vyper_parsing/declarations/event.py | 43 ++ .../vyper_parsing/declarations/function.py | 340 ++++++++++++++++ .../vyper_parsing/declarations/modifier.py | 107 +++++ slither/vyper_parsing/declarations/struct.py | 35 ++ slither/vyper_parsing/expressions/__init__.py | 0 .../expressions/expression_parsing.py | 308 +++++++++++++++ .../expressions/find_variable.py | 240 +++++++++++ slither/vyper_parsing/type_parsing.py | 55 +++ slither/vyper_parsing/variables/__init__.py | 0 .../vyper_parsing/variables/event_variable.py | 21 + .../variables/function_type_variable.py | 13 + .../vyper_parsing/variables/local_variable.py | 32 ++ .../vyper_parsing/variables/state_variable.py | 30 ++ .../variables/structure_variable.py | 20 + .../variables/variable_declaration.py | 150 +++++++ .../vyper_parsing/vyper_compilation_unit.py | 94 +++++ 33 files changed, 2438 insertions(+), 35 deletions(-) create mode 100644 slither/vyper_parsing/__init__.py create mode 100644 slither/vyper_parsing/ast/__init__.py create mode 100644 slither/vyper_parsing/ast/ast.py create mode 100644 slither/vyper_parsing/ast/types.py create mode 100644 slither/vyper_parsing/cfg/__init__.py create mode 100644 slither/vyper_parsing/cfg/node.py create mode 100644 slither/vyper_parsing/declarations/__init__.py create mode 100644 slither/vyper_parsing/declarations/contract.py create mode 100644 slither/vyper_parsing/declarations/event.py create mode 100644 slither/vyper_parsing/declarations/function.py create mode 100644 slither/vyper_parsing/declarations/modifier.py create mode 100644 slither/vyper_parsing/declarations/struct.py create mode 100644 slither/vyper_parsing/expressions/__init__.py create mode 100644 slither/vyper_parsing/expressions/expression_parsing.py create mode 100644 slither/vyper_parsing/expressions/find_variable.py create mode 100644 slither/vyper_parsing/type_parsing.py create mode 100644 slither/vyper_parsing/variables/__init__.py create mode 100644 slither/vyper_parsing/variables/event_variable.py create mode 100644 slither/vyper_parsing/variables/function_type_variable.py create mode 100644 slither/vyper_parsing/variables/local_variable.py create mode 100644 slither/vyper_parsing/variables/state_variable.py create mode 100644 slither/vyper_parsing/variables/structure_variable.py create mode 100644 slither/vyper_parsing/variables/variable_declaration.py create mode 100644 slither/vyper_parsing/vyper_compilation_unit.py diff --git a/slither/__main__.py b/slither/__main__.py index d9201a90d9..e68f0b67f1 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -870,11 +870,11 @@ def main_impl( logging.error(red(output_error)) logging.error("Please report an issue to https://github.com/crytic/slither/issues") - except Exception: # pylint: disable=broad-except - output_error = traceback.format_exc() - traceback.print_exc() - logging.error(f"Error in {args.filename}") # pylint: disable=logging-fstring-interpolation - logging.error(output_error) + # except Exception: # pylint: disable=broad-except + # output_error = traceback.format_exc() + # traceback.print_exc() + # logging.error(f"Error in {args.filename}") # pylint: disable=logging-fstring-interpolation + # logging.error(output_error) # If we are outputting JSON, capture the redirected output and disable the redirect to output the final JSON. if outputting_json: diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index 6d24786eb1..8e801ea953 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -1,4 +1,5 @@ import math +from enum import Enum from typing import Optional, Dict, List, Set, Union, TYPE_CHECKING, Tuple from crytic_compile import CompilationUnit, CryticCompile @@ -29,6 +30,20 @@ from slither.core.slither_core import SlitherCore +class Language(Enum): + SOLIDITY = "solidity" + VYPER = "vyper" + + @staticmethod + def from_str(label: str): + if label == "solc": + return Language.SOLIDITY + elif label == "vyper": + return Language.VYPER + else: + raise ValueError(f"Unknown language: {label}") + + # pylint: disable=too-many-instance-attributes,too-many-public-methods class SlitherCompilationUnit(Context): def __init__(self, core: "SlitherCore", crytic_compilation_unit: CompilationUnit) -> None: @@ -36,6 +51,7 @@ def __init__(self, core: "SlitherCore", crytic_compilation_unit: CompilationUnit self._core = core self._crytic_compile_compilation_unit = crytic_compilation_unit + self._language = Language.from_str(crytic_compilation_unit.compiler_version.compiler) # Top level object self.contracts: List[Contract] = [] @@ -81,6 +97,13 @@ def source_units(self) -> Dict[int, str]: # region Compiler ################################################################################### ################################################################################### + @property + def is_vyper(self) -> bool: + return self._language == Language.VYPER + + @property + def is_solidity(self) -> bool: + return self._language == Language.SOLIDITY @property def compiler_version(self) -> CompilerVersion: @@ -259,6 +282,7 @@ def get_scope(self, filename_str: str) -> FileScope: ################################################################################### def compute_storage_layout(self) -> None: + assert self.is_solidity for contract in self.contracts_derived: self._storage_layouts[contract.name] = {} diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 9b1488db31..5e3ab4571e 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -136,7 +136,7 @@ def name(self, name: str) -> None: @property def id(self) -> int: """Unique id.""" - assert self._id + assert self._id is not None return self._id @id.setter diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index e778019617..d549c96159 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -106,7 +106,7 @@ def _filter_state_variables_written(expressions: List["Expression"]): ret.append(expression.expression_left) return ret - +#TODO replace class FunctionLanguage(Enum): Solidity = 0 Yul = 1 @@ -1521,6 +1521,7 @@ def is_reentrant(self) -> bool: def _analyze_read_write(self) -> None: """Compute variables read/written/...""" write_var = [x.variables_written_as_expression for x in self.nodes] + print(write_var) write_var = [x for x in write_var if x] write_var = [item for sublist in write_var for item in sublist] write_var = list(set(write_var)) @@ -1756,6 +1757,9 @@ def fix_phi( node.irs_ssa = [ir for ir in node.irs_ssa if not self._unchange_phi(ir)] def generate_slithir_and_analyze(self) -> None: + print("generate_slithir_and_analyze") + print(self.nodes) + for node in self.nodes: node.slithir_generation() diff --git a/slither/core/expressions/binary_operation.py b/slither/core/expressions/binary_operation.py index a395d07cf8..271975e775 100644 --- a/slither/core/expressions/binary_operation.py +++ b/slither/core/expressions/binary_operation.py @@ -42,7 +42,7 @@ class BinaryOperationType(Enum): # pylint: disable=too-many-branches @staticmethod def get_type( - operation_type: "BinaryOperation", + operation_type: "str", ) -> "BinaryOperationType": if operation_type == "**": return BinaryOperationType.POWER diff --git a/slither/core/expressions/identifier.py b/slither/core/expressions/identifier.py index 8ffabad894..d4c4261008 100644 --- a/slither/core/expressions/identifier.py +++ b/slither/core/expressions/identifier.py @@ -26,7 +26,7 @@ def __init__( ], ) -> None: super().__init__() - + assert value # pylint: disable=import-outside-toplevel from slither.core.declarations import Contract, SolidityVariable, SolidityFunction from slither.solc_parsing.yul.evm_functions import YulBuiltin diff --git a/slither/slither.py b/slither/slither.py index 85f852e1d5..07444c72f8 100644 --- a/slither/slither.py +++ b/slither/slither.py @@ -11,6 +11,7 @@ from slither.exceptions import SlitherError from slither.printers.abstract_printer import AbstractPrinter from slither.solc_parsing.slither_compilation_unit_solc import SlitherCompilationUnitSolc +from slither.vyper_parsing.vyper_compilation_unit import VyperCompilationUnit from slither.utils.output import Output logger = logging.getLogger("Slither") @@ -62,16 +63,6 @@ def __init__(self, target: Union[str, CryticCompile], **kwargs) -> None: triage_mode (bool): if true, switch to triage mode (default false) exclude_dependencies (bool): if true, exclude results that are only related to dependencies generate_patches (bool): if true, patches are generated (json output only) - - truffle_ignore (bool): ignore truffle.js presence (default false) - truffle_build_directory (str): build truffle directory (default 'build/contracts') - truffle_ignore_compile (bool): do not run truffle compile (default False) - truffle_version (str): use a specific truffle version (default None) - - embark_ignore (bool): ignore embark.js presence (default false) - embark_ignore_compile (bool): do not run embark build (default False) - embark_overwrite_config (bool): overwrite original config file (default false) - change_line_prefix (str): Change the line prefix (default #) for the displayed source codes (i.e. file.sol#1). @@ -108,13 +99,25 @@ def __init__(self, target: Union[str, CryticCompile], **kwargs) -> None: for compilation_unit in crytic_compile.compilation_units.values(): compilation_unit_slither = SlitherCompilationUnit(self, compilation_unit) self._compilation_units.append(compilation_unit_slither) - parser = SlitherCompilationUnitSolc(compilation_unit_slither) - self._parsers.append(parser) - for path, ast in compilation_unit.asts.items(): - parser.parse_top_level_from_loaded_json(ast, path) - self.add_source_code(path) - _update_file_scopes(compilation_unit_slither.scopes.values()) + if compilation_unit_slither.is_vyper: + vyper_parser = VyperCompilationUnit(compilation_unit_slither) + for path, ast in compilation_unit.asts.items(): + from slither.vyper_parsing.ast.ast import parse + + ast_nodes = parse(ast["ast"]) + vyper_parser.parse_module(ast_nodes, path) + self._parsers.append(vyper_parser) + else: + # Solidity specific + assert compilation_unit_slither.is_solidity + sol_parser = SlitherCompilationUnitSolc(compilation_unit_slither) + self._parsers.append(sol_parser) + for path, ast in compilation_unit.asts.items(): + sol_parser.parse_top_level_items(ast, path) + self.add_source_code(path) + + _update_file_scopes(compilation_unit_slither.scopes.values()) if kwargs.get("generate_patches", False): self.generate_patches = True diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index 00ac3a5192..cc61deb1f5 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -75,9 +75,12 @@ class SlitherCompilationUnitSolc(CallerContextExpression): def __init__(self, compilation_unit: SlitherCompilationUnit) -> None: super().__init__() + self._compilation_unit: SlitherCompilationUnit = compilation_unit + self._contracts_by_id: Dict[int, ContractSolc] = {} self._parsed = False self._analyzed = False + self._is_compact_ast = False self._underlying_contract_to_parser: Dict[Contract, ContractSolc] = {} self._structures_top_level_parser: List[StructureTopLevelSolc] = [] @@ -85,11 +88,6 @@ def __init__(self, compilation_unit: SlitherCompilationUnit) -> None: self._variables_top_level_parser: List[TopLevelVariableSolc] = [] self._functions_top_level_parser: List[FunctionSolc] = [] self._using_for_top_level_parser: List[UsingForTopLevelSolc] = [] - - self._is_compact_ast = False - # self._core: SlitherCore = core - self._compilation_unit = compilation_unit - self._all_functions_and_modifier_parser: List[FunctionSolc] = [] self._top_level_contracts_counter = 0 @@ -145,14 +143,14 @@ def parse_top_level_from_json(self, json_data: str) -> bool: data_loaded = json.loads(json_data) # Truffle AST if "ast" in data_loaded: - self.parse_top_level_from_loaded_json(data_loaded["ast"], data_loaded["sourcePath"]) + self.parse_top_level_items(data_loaded["ast"], data_loaded["sourcePath"]) return True # solc AST, where the non-json text was removed if "attributes" in data_loaded: filename = data_loaded["attributes"]["absolutePath"] else: filename = data_loaded["absolutePath"] - self.parse_top_level_from_loaded_json(data_loaded, filename) + self.parse_top_level_items(data_loaded, filename) return True except ValueError: @@ -163,7 +161,7 @@ def parse_top_level_from_json(self, json_data: str) -> bool: json_data = json_data[first:last] data_loaded = json.loads(json_data) - self.parse_top_level_from_loaded_json(data_loaded, filename) + self.parse_top_level_items(data_loaded, filename) return True return False @@ -197,7 +195,7 @@ def _parse_enum(self, top_level_data: Dict, filename: str) -> None: self._compilation_unit.enums_top_level.append(enum) # pylint: disable=too-many-branches,too-many-statements,too-many-locals - def parse_top_level_from_loaded_json(self, data_loaded: Dict, filename: str) -> None: + def parse_top_level_items(self, data_loaded: Dict, filename: str) -> None: if not data_loaded or data_loaded is None: logger.error( "crytic-compile returned an empty AST. " @@ -405,7 +403,7 @@ def analyzed(self) -> bool: def parse_contracts(self) -> None: # pylint: disable=too-many-statements,too-many-branches if not self._underlying_contract_to_parser: logger.info( - f"No contract were found in {self._compilation_unit.core.filename}, check the correct compilation" + f"No contracts were found in {self._compilation_unit.core.filename}, check the correct compilation" ) if self._parsed: raise Exception("Contract analysis can be run only once!") diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 005ad81a44..a99a6af863 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -434,6 +434,7 @@ def _post_index_access(self, expression: IndexAccess) -> None: def _post_literal(self, expression: Literal) -> None: expression_type = expression.type assert isinstance(expression_type, ElementaryType) + print(expression.value) cst = Constant(expression.value, expression_type, expression.subdenomination) set_val(expression, cst) diff --git a/slither/vyper_parsing/__init__.py b/slither/vyper_parsing/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/slither/vyper_parsing/ast/__init__.py b/slither/vyper_parsing/ast/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py new file mode 100644 index 0000000000..b0a687528a --- /dev/null +++ b/slither/vyper_parsing/ast/ast.py @@ -0,0 +1,373 @@ +from typing import Dict, Callable, List +from slither.vyper_parsing.ast.types import ASTNode +from slither.vyper_parsing.ast.types import * + + +class ParsingError(Exception): + pass + + +def _extract_base_props(raw: Dict) -> Dict: + return { + "src": raw["src"], + "node_id": raw["node_id"], + } + + +def _extract_decl_props(raw: Dict) -> Dict: + return { + "doc_string": parse_doc_str(raw["doc_string"]) if raw["doc_string"] else None, + **_extract_base_props(raw), + } + + +def parse_module(raw: Dict) -> Module: + nodes_parsed: List[ASTNode] = [] + + for node in raw["body"]: + nodes_parsed.append(parse(node)) + + return Module(name=raw["name"], body=nodes_parsed, **_extract_decl_props(raw)) + + +def parse_import_from(raw: Dict) -> ImportFrom: + return ImportFrom( + module=raw["module"], + name=raw["name"], + alias=raw["alias"], + **_extract_base_props(raw), + ) + + +def parse_event_def(raw: Dict) -> EventDef: + body_parsed: List[ASTNode] = [] + for node in raw["body"]: + body_parsed.append(parse(node)) + + return EventDef( + name=raw["name"], + body=body_parsed, + *_extract_base_props(raw), + ) + + +def parse_ann_assign(raw: Dict) -> AnnAssign: + return AnnAssign( + target=parse(raw["target"]), + annotation=parse(raw["annotation"]), + value=parse(raw["value"]) if raw["value"] else None, + **_extract_base_props(raw), + ) + + +def parse_name(raw: Dict) -> Name: + return Name( + id=raw["id"], + **_extract_base_props(raw), + ) + + +def parse_call(raw: Dict) -> Call: + return Call( + func=parse(raw["func"]), + args=[parse(arg) for arg in raw["args"]], + keyword=parse(raw["keyword"]) if raw["keyword"] else None, + keywords=[parse(keyword) for keyword in raw["keywords"]], + **_extract_base_props(raw), + ) + + +def parse_struct_def(raw: Dict) -> StructDef: + body_parsed: List[ASTNode] = [] + for node in raw["body"]: + body_parsed.append(parse(node)) + + return StructDef( + name=raw["name"], + body=body_parsed, + **_extract_base_props(raw), + ) + + +def parse_variable_decl(raw: Dict) -> VariableDecl: + return VariableDecl( + annotation=parse(raw["annotation"]), + value=parse(raw["value"]) if raw["value"] else None, + target=parse(raw["target"]), + is_constant=raw["is_constant"], + is_immutable=raw["is_immutable"], + is_public=raw["is_public"], + **_extract_base_props(raw), + ) + + +def parse_subscript(raw: Dict) -> Subscript: + return Subscript( + value=parse(raw["value"]), + slice=parse(raw["slice"]), + **_extract_base_props(raw), + ) + + +def parse_index(raw: Dict) -> Index: + return Index(value=parse(raw["value"]), **_extract_base_props(raw)) + + +def parse_bytes(raw: Dict) -> Bytes: + return Bytes(value=raw["value"], **_extract_base_props(raw)) + + +def parse_hex(raw: Dict) -> Hex: + return Hex(value=raw["value"], **_extract_base_props(raw)) + + +def parse_int(raw: Dict) -> Int: + return Int(value=raw["value"], **_extract_base_props(raw)) + + +def parse_str(raw: Dict) -> Str: + return Str(value=raw["value"], **_extract_base_props(raw)) + + +def parse_tuple(raw: Dict) -> ASTNode: + return Tuple(elements=[parse(elem) for elem in raw["elements"]], **_extract_base_props(raw)) + + +def parse_function_def(raw: Dict) -> FunctionDef: + body_parsed: List[ASTNode] = [] + for node in raw["body"]: + body_parsed.append(parse(node)) + + decorators_parsed: List[ASTNode] = [] + for node in raw["decorator_list"]: + decorators_parsed.append(parse(node)) + + return FunctionDef( + name=raw["name"], + args=parse_arguments(raw["args"]), + returns=parse(raw["returns"]) if raw["returns"] else None, + body=body_parsed, + pos=raw["pos"], + decorators=decorators_parsed, + **_extract_decl_props(raw), + ) + + +def parse_assign(raw: Dict) -> Assign: + return Assign( + target=parse(raw["target"]), + value=parse(raw["value"]), + **_extract_base_props(raw), + ) + + +def parse_attribute(raw: Dict) -> Attribute: + return Attribute( + value=parse(raw["value"]), + attr=raw["attr"], + **_extract_base_props(raw), + ) + + +def parse_arguments(raw: Dict) -> Arguments: + return Arguments( + args=[parse_arg(arg) for arg in raw["args"]], + default=parse(raw["default"]) if raw["default"] else None, + defaults=[parse(x) for x in raw["defaults"]], + **_extract_base_props(raw), + ) + + +def parse_arg(raw: Dict) -> Arg: + return Arg(arg=raw["arg"], annotation=parse(raw["annotation"]), **_extract_base_props(raw)) + + +def parse_assert(raw: Dict) -> Assert: + return Assert( + test=parse(raw["test"]), + msg=parse(raw["msg"]) if raw["msg"] else None, + **_extract_base_props(raw), + ) + + +def parse_raise(raw: Dict) -> Raise: + return Raise(exc=parse(raw["exc"]) if raw["exc"] else None, **_extract_base_props(raw)) + + +def parse_expr(raw: Dict) -> Expr: + return Expr(value=parse(raw["value"]), **_extract_base_props(raw)) + + +def parse_unary_op(raw: Dict) -> UnaryOp: + return UnaryOp(op=raw["op"], operand=parse(raw["operand"]), **_extract_base_props(raw)) + +binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "-", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>"} + +def parse_bin_op(raw: Dict) -> BinOp: + op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] + return BinOp( + left=parse(raw["left"]), op=op_str, right=parse(raw["right"]), **_extract_base_props(raw) + ) + + +def parse_keyword(raw: Dict) -> Keyword: + return Keyword(arg=raw["arg"], value=parse(raw["value"]), **_extract_base_props(raw)) + + +def parse_log(raw: Dict) -> Log: + return Log(value=parse(raw["value"]), **_extract_base_props(raw)) + + +def parse_return(raw: Dict) -> Return: + return Return(value=parse(raw["value"]) if raw["value"] else None, **_extract_base_props(raw)) + + +def parse_dict(raw: Dict) -> ASTNode: + return VyDict( + keys=[parse(x) for x in raw["keys"]], + values=[parse(x) for x in raw["values"]], + **_extract_base_props(raw), + ) + + +def parse_list(raw: Dict) -> VyList: + return VyList(elements=[parse(x) for x in raw["elements"]], **_extract_base_props(raw)) + + +def parse_name_constant(raw: Dict) -> NameConstant: + return NameConstant(value=raw["value"], **_extract_base_props(raw)) + + +def parse_doc_str(raw: Dict) -> str: + assert isinstance(raw["value"], str) + return raw["value"] + + +def parse_compare(raw: Dict) -> Compare: + return Compare( + left=parse(raw["left"]), op=raw["op"], right=parse(raw["right"]), **_extract_base_props(raw) + ) + + +def parse_if(raw: Dict) -> ASTNode: + return If( + test=parse(raw["test"]), + body=[parse(x) for x in raw["body"]], + orelse=[parse(x) for x in raw["orelse"]], + **_extract_base_props(raw), + ) + + +def parse_for(raw: Dict) -> For: + return For( + target=parse(raw["target"]), + iter=parse(raw["iter"]), + body=[parse(x) for x in raw["body"]], + **_extract_base_props(raw), + ) + + +def parse_break(raw: Dict) -> Break: + return Break(**_extract_base_props(raw)) + + +def parse_continue(raw: Dict) -> Continue: + return Continue(**_extract_base_props(raw)) + + +def parse_pass(raw: Dict) -> Pass: + return Pass( + **_extract_base_props(raw), + ) + + +def parse_interface_def(raw: Dict) -> InterfaceDef: + nodes_parsed: List[ASTNode] = [] + + for node in raw["body"]: + nodes_parsed.append(parse(node)) + return InterfaceDef(name=raw["name"], body=nodes_parsed, **_extract_base_props(raw)) + + +def parse_enum_def(raw: Dict) -> EnumDef: + nodes_parsed: List[ASTNode] = [] + + for node in raw["body"]: + nodes_parsed.append(parse(node)) + + return EnumDef(name=raw["name"], body=nodes_parsed, **_extract_base_props(raw)) + + +def parse_aug_assign(raw: Dict) -> AugAssign: + return AugAssign( + target=parse(raw["target"]), + op=raw["op"], + value=parse(raw["value"]), + **_extract_base_props(raw), + ) + + +def parse_unsupported(raw: Dict) -> ASTNode: + raise ParsingError("unsupported Vyper node", raw["ast_type"], raw.keys(), raw) + + +def parse_bool_op(raw: Dict) -> BoolOp: + return BoolOp( + op=raw["op"], values=[parse(x) for x in raw["values"]], **_extract_base_props(raw) + ) + + +def parse(raw: Dict) -> ASTNode: + try: + return PARSERS.get(raw["ast_type"], parse_unsupported)(raw) + except ParsingError as e: + raise e + except Exception as e: + raise e + # raise ParsingError("failed to parse Vyper node", raw["ast_type"], e, raw.keys(), raw) + + +PARSERS: Dict[str, Callable[[Dict], ASTNode]] = { + "Module": parse_module, + "ImportFrom": parse_import_from, + "EventDef": parse_event_def, + "AnnAssign": parse_ann_assign, + "Name": parse_name, + "Call": parse_call, + "Pass": parse_pass, + "StructDef": parse_struct_def, + "VariableDecl": parse_variable_decl, + "Subscript": parse_subscript, + "Index": parse_index, + "Hex": parse_hex, + "Int": parse_int, + "Str": parse_str, + "DocStr": parse_doc_str, + "Tuple": parse_tuple, + "FunctionDef": parse_function_def, + "Assign": parse_assign, + "Raise": parse_raise, + "Attribute": parse_attribute, + "Assert": parse_assert, + "keyword": parse_keyword, + "arguments": parse_arguments, + "arg": parse_arg, + "UnaryOp": parse_unary_op, + "BinOp": parse_bin_op, + "Expr": parse_expr, + "Log": parse_log, + "Return": parse_return, + "If": parse_if, + "Dict": parse_dict, + "List": parse_list, + "Compare": parse_compare, + "NameConstant": parse_name_constant, + "For": parse_for, + "Break": parse_break, + "Continue": parse_continue, + "InterfaceDef": parse_interface_def, + "EnumDef": parse_enum_def, + "Bytes": parse_bytes, + "AugAssign": parse_aug_assign, + "BoolOp": parse_bool_op, +} diff --git a/slither/vyper_parsing/ast/types.py b/slither/vyper_parsing/ast/types.py new file mode 100644 index 0000000000..619df4f147 --- /dev/null +++ b/slither/vyper_parsing/ast/types.py @@ -0,0 +1,270 @@ +from __future__ import annotations +from typing import List, Optional, Dict, Union, ForwardRef +from dataclasses import dataclass + + +@dataclass +class ASTNode: + src: str + node_id: int + + +@dataclass +class Definition(ASTNode): + doc_string: Optional[str] + + +@dataclass +class Module(Definition): + body: List[ASTNode] + name: str + + +@dataclass +class ImportFrom(ASTNode): + module: str + name: str + alias: Optional[str] + + +@dataclass +class EventDef(ASTNode): + name: str + body: List[AnnAssign] + + +@dataclass +class AnnAssign(ASTNode): + target: Name + annotation: Union[Subscript, Name, Call] + value: Optional[ASTNode] + + +@dataclass +class Name(ASTNode): # type or identifier + id: str + + +@dataclass +class Call(ASTNode): + func: ASTNode + args: List[ASTNode] + keyword: Optional[ASTNode] + keywords: List[ASTNode] + + +@dataclass +class Pass(ASTNode): + pass + + +@dataclass +class StructDef(ASTNode): + name: str + body: List[AnnAssign] + + +@dataclass +class VariableDecl(ASTNode): + annotation: ASTNode + target: ASTNode + value: Optional[ASTNode] + is_constant: bool + is_immutable: bool + is_public: bool + + +@dataclass +class Subscript(ASTNode): + value: ASTNode + slice: ASTNode + + +@dataclass +class Index(ASTNode): + value: ASTNode + + +# TODO CONSTANT? + + +@dataclass +class Bytes(ASTNode): + value: bytes + + +@dataclass +class Hex(ASTNode): + value: str + + +@dataclass +class Int(ASTNode): + value: int + + +@dataclass +class Str(ASTNode): + value: str + + +@dataclass +class VyList(ASTNode): + elements: List[ASTNode] + + +@dataclass +class VyDict(ASTNode): + keys: List[ASTNode] + values: List[ASTNode] + + +@dataclass +class Tuple(ASTNode): + elements: List[ASTNode] + + +@dataclass +class FunctionDef(Definition): + name: str + args: Optional[Arguments] + returns: Optional[List[ASTNode]] + body: List[ASTNode] + decorators: Optional[List[ASTNode]] + pos: Optional[any] # not sure what this is + + +@dataclass +class Assign(ASTNode): + target: ASTNode + value: ASTNode + + +@dataclass +class Attribute(ASTNode): + value: ASTNode + attr: str + + +@dataclass +class Arguments(ASTNode): + args: List[Arg] + default: Optional[ASTNode] + defaults: List[ASTNode] + + +@dataclass +class Arg(ASTNode): + arg: str + annotation: Optional[ASTNode] + + +@dataclass +class Assert(ASTNode): + test: ASTNode + msg: Optional[Str] + + +@dataclass +class Raise(ASTNode): + exc: ASTNode + + +from enum import Enum + + +@dataclass +class Expr(ASTNode): + value: ASTNode + + +@dataclass +class UnaryOp(ASTNode): + op: ASTNode + operand: ASTNode + + + + +@dataclass +class BinOp(ASTNode): + left: ASTNode + op: str + right: ASTNode + + +@dataclass +class Keyword(ASTNode): + arg: str + value: ASTNode + + +@dataclass +class Log(ASTNode): + value: ASTNode + + +@dataclass +class Return(ASTNode): + value: Optional[ASTNode] + + +@dataclass +class If(ASTNode): + test: ASTNode + body: List[ASTNode] + orelse: List[ASTNode] + + +@dataclass +class Compare(ASTNode): + left: ASTNode + op: ASTNode + right: ASTNode + + +@dataclass +class NameConstant(ASTNode): + value: bool + + +@dataclass +class For(ASTNode): + target: ASTNode + iter: ASTNode + body: List[ASTNode] + + +@dataclass +class Continue(ASTNode): + pass + + +@dataclass +class Break(ASTNode): + pass + + +@dataclass +class InterfaceDef(ASTNode): + name: str + body: List[ASTNode] + + +@dataclass +class EnumDef(ASTNode): + name: str + body: List[ASTNode] + + +@dataclass +class AugAssign(ASTNode): + target: ASTNode + op: ASTNode + value: ASTNode + + +@dataclass +class BoolOp(ASTNode): + op: ASTNode + values: List[ASTNode] diff --git a/slither/vyper_parsing/cfg/__init__.py b/slither/vyper_parsing/cfg/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/slither/vyper_parsing/cfg/node.py b/slither/vyper_parsing/cfg/node.py new file mode 100644 index 0000000000..cf8a8f160f --- /dev/null +++ b/slither/vyper_parsing/cfg/node.py @@ -0,0 +1,66 @@ +from typing import Union, Optional, Dict, TYPE_CHECKING + +from slither.core.cfg.node import Node +from slither.core.cfg.node import NodeType +from slither.core.expressions.assignment_operation import ( + AssignmentOperation, + AssignmentOperationType, +) +from slither.core.expressions.identifier import Identifier +from slither.vyper_parsing.expressions.expression_parsing import parse_expression +from slither.visitors.expression.find_calls import FindCalls +from slither.visitors.expression.read_var import ReadVar +from slither.visitors.expression.write_var import WriteVar + + +class NodeVyper: + def __init__(self, node: Node) -> None: + self._unparsed_expression: Optional[Dict] = None + self._node = node + + @property + def underlying_node(self) -> Node: + return self._node + + def add_unparsed_expression(self, expression: Dict) -> None: + assert self._unparsed_expression is None + self._unparsed_expression = expression + + def analyze_expressions(self, caller_context) -> None: + if self._node.type == NodeType.VARIABLE and not self._node.expression: + self._node.add_expression(self._node.variable_declaration.expression) + if self._unparsed_expression: + expression = parse_expression(self._unparsed_expression, caller_context) + self._node.add_expression(expression) + # self._unparsed_expression = None + + if self._node.expression: + + if self._node.type == NodeType.VARIABLE: + # Update the expression to be an assignement to the variable + _expression = AssignmentOperation( + Identifier(self._node.variable_declaration), + self._node.expression, + AssignmentOperationType.ASSIGN, + self._node.variable_declaration.type, + ) + # _expression.set_offset( + # self._node.expression.source_mapping, self._node.compilation_unit + # ) + self._node.add_expression(_expression, bypass_verif_empty=True) + + expression = self._node.expression + read_var = ReadVar(expression) + self._node.variables_read_as_expression = read_var.result() + + write_var = WriteVar(expression) + self._node.variables_written_as_expression = write_var.result() + + find_call = FindCalls(expression) + self._node.calls_as_expression = find_call.result() + self._node.external_calls_as_expressions = [ + c for c in self._node.calls_as_expression if not isinstance(c.called, Identifier) + ] + self._node.internal_calls_as_expressions = [ + c for c in self._node.calls_as_expression if isinstance(c.called, Identifier) + ] diff --git a/slither/vyper_parsing/declarations/__init__.py b/slither/vyper_parsing/declarations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py new file mode 100644 index 0000000000..3a01a22f7f --- /dev/null +++ b/slither/vyper_parsing/declarations/contract.py @@ -0,0 +1,176 @@ +import logging +from typing import List, TYPE_CHECKING +from slither.vyper_parsing.ast.types import ( + Module, + FunctionDef, + EventDef, + EnumDef, + StructDef, + VariableDecl, + ImportFrom, + InterfaceDef, + AnnAssign, +) + +from slither.vyper_parsing.declarations.event import EventVyper +from slither.vyper_parsing.declarations.struct import StructVyper +from slither.vyper_parsing.variables.state_variable import StateVariableVyper +from slither.vyper_parsing.declarations.function import FunctionVyper +from slither.core.declarations.function_contract import FunctionContract +from slither.core.declarations import Contract, StructureContract, EnumContract, Event + +from slither.core.variables.state_variable import StateVariable + +if TYPE_CHECKING: + from slither.vyper_parsing.vyper_compilation_unit import VyperCompilationUnit + + +class ContractVyper: + def __init__( + self, slither_parser: "VyperCompilationUnit", contract: Contract, module: Module + ) -> None: + + self._contract: Contract = contract + self._slither_parser: "VyperCompilationUnit" = slither_parser + self._data = module + self._contract.name = module.name + self._contract.id = module.node_id + self._is_analyzed: bool = False + + self._enumsNotParsed: List[EnumDef] = [] + self._structuresNotParsed: List[StructDef] = [] + self._variablesNotParsed: List[VariableDecl] = [] + self._eventsNotParsed: List[EventDef] = [] + self._functionsNotParsed: List[FunctionDef] = [] + + self._structures_parser: List[StructVyper] = [] + self._variables_parser: List[StateVariableVyper] = [] + self._events_parser: List[EventVyper] = [] + self._functions_parser: List[FunctionVyper] = [] + + self._parse_contract_items() + + @property + def is_analyzed(self) -> bool: + return self._is_analyzed + + def set_is_analyzed(self, is_analyzed: bool) -> None: + self._is_analyzed = is_analyzed + + @property + def underlying_contract(self) -> Contract: + return self._contract + + def _parse_contract_items(self) -> None: + for node in self._data.body: + if isinstance(node, FunctionDef): + self._functionsNotParsed.append(node) + elif isinstance(node, EventDef): + self._eventsNotParsed.append(node) + elif isinstance(node, VariableDecl): + self._variablesNotParsed.append(node) + elif isinstance(node, EnumDef): + self._enumsNotParsed.append(node) + elif isinstance(node, StructDef): + self._structuresNotParsed.append(node) + elif isinstance(node, ImportFrom): + # https://github.com/vyperlang/vyper/tree/master/vyper/builtins/interfaces + if node.module == "vyper.interfaces": + # TODO add functions + contract = Contract(self._contract.compilation_unit, self._contract.file_scope) + contract.set_offset("-1:-1:-1", self._contract.compilation_unit) + + contract.name = node.name + contract.is_interface = True + self._contract.file_scope.contracts[contract.name] = contract + + elif isinstance(node, InterfaceDef): + contract = Contract(self._contract.compilation_unit, self._contract.file_scope) + contract_parser = ContractVyper(self._slither_parser, contract, node) + contract.set_offset(node.src, self._contract.compilation_unit) + self._contract.file_scope.contracts[contract.name] = contract + self._slither_parser._underlying_contract_to_parser[contract] = contract_parser + + elif isinstance(node, AnnAssign): # implements: ERC20 + pass # TODO + else: + raise ValueError("Unknown contract node: ", node) + + def parse_enums(self) -> None: + for enum in self._enumsNotParsed: + name = enum.name + canonicalName = self._contract.name + "." + enum.name + values = [x.value.id for x in enum.body] + new_enum = EnumContract(name, canonicalName, values) + new_enum.set_contract(self._contract) + new_enum.set_offset(enum.src, self._contract.compilation_unit) + self._contract.enums_as_dict[name] = new_enum # TODO solidity using canonicalName + self._enumsNotParsed = [] + + def parse_structs(self) -> None: + for struct in self._structuresNotParsed: + st = StructureContract(self._contract.compilation_unit) + st.set_contract(self._contract) + st.set_offset(struct.src, self._contract.compilation_unit) + + st_parser = StructVyper(st, struct) + self._contract.structures_as_dict[st.name] = st + self._structures_parser.append(st_parser) + + self._structuresNotParsed = [] + + def parse_state_variables(self) -> None: + for varNotParsed in self._variablesNotParsed: + print(varNotParsed) + var = StateVariable() + var.set_contract(self._contract) + var.set_offset(varNotParsed.src, self._contract.compilation_unit) + + var_parser = StateVariableVyper(var, varNotParsed) + self._variables_parser.append(var_parser) + + assert var.name + self._contract.variables_as_dict[var.name] = var + self._contract.add_variables_ordered([var]) + + self._variablesNotParsed = [] + + def parse_events(self) -> None: + for event_to_parse in self._eventsNotParsed: + event = Event() + event.set_contract(self._contract) + event.set_offset(event_to_parse.src, self._contract.compilation_unit) + + event_parser = EventVyper(event, event_to_parse) + self._events_parser.append(event_parser) + self._contract.events_as_dict[event.full_name] = event + + def parse_functions(self) -> None: + + for function in self._functionsNotParsed: + func = FunctionContract(self._contract.compilation_unit) + func.set_offset(function.src, self._contract.compilation_unit) + func.set_contract(self._contract) + func.set_contract_declarer(self._contract) + + func_parser = FunctionVyper(func, function) + self._contract.add_function(func) + self._functions_parser.append(func_parser) + + self._functionsNotParsed = [] + + def analyze(self) -> None: + for p in self._structures_parser: + p.analyze(self._contract) + for p in self._variables_parser: + p.analyze(self._contract) + for p in self._events_parser: + p.analyze(self._contract) + + for function in self._functions_parser: + function.analyze_params() + for function in self._functions_parser: + function.analyze_content() + + def __hash__(self) -> int: + return self._contract.id diff --git a/slither/vyper_parsing/declarations/event.py b/slither/vyper_parsing/declarations/event.py new file mode 100644 index 0000000000..a0152ec0ec --- /dev/null +++ b/slither/vyper_parsing/declarations/event.py @@ -0,0 +1,43 @@ +""" + Event module +""" +from typing import TYPE_CHECKING, Dict + +from slither.core.variables.event_variable import EventVariable +from slither.vyper_parsing.variables.event_variable import EventVariableVyper +from slither.core.declarations.event import Event +from slither.vyper_parsing.ast.types import AnnAssign, Pass + + +from slither.vyper_parsing.ast.types import EventDef + + +class EventVyper: + """ + Event class + """ + + def __init__(self, event: Event, event_def: EventDef) -> None: + + self._event = event + self._event.name = event_def.name + self._elemsNotParsed = event_def.body + print(event_def) + # assert False + # self.analyze() # TODO create `VariableDecl` from `AnnAssign` from `event_def.body` (also for `StructDef`) + + def analyze(self, contract) -> None: + for elem_to_parse in self._elemsNotParsed: + if not isinstance(elem_to_parse, AnnAssign): + assert isinstance(elem_to_parse, Pass) + continue + + elem = EventVariable() + + elem.set_offset(elem_to_parse.src, self._event.contract.compilation_unit) + event_parser = EventVariableVyper(elem, elem_to_parse) + event_parser.analyze(contract) + + self._event.elems.append(elem) + + self._elemsNotParsed = [] diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py new file mode 100644 index 0000000000..b652efc5fc --- /dev/null +++ b/slither/vyper_parsing/declarations/function.py @@ -0,0 +1,340 @@ +import logging +from typing import Dict, Optional, Union, List, TYPE_CHECKING, Tuple, Set + +from slither.core.cfg.node import NodeType, link_nodes, insert_node, Node +from slither.core.cfg.scope import Scope +from slither.core.declarations.contract import Contract +from slither.core.declarations.function import ( + Function, + FunctionType, +) +from slither.core.declarations.function_contract import FunctionContract +from slither.core.expressions import AssignmentOperation +from slither.core.source_mapping.source_mapping import Source +from slither.core.variables.local_variable import LocalVariable +from slither.vyper_parsing.cfg.node import NodeVyper +from slither.solc_parsing.exceptions import ParsingError +from slither.vyper_parsing.variables.local_variable import LocalVariableVyper +from slither.vyper_parsing.ast.types import * + +if TYPE_CHECKING: + from slither.core.compilation_unit import SlitherCompilationUnit + + +def link_underlying_nodes(node1: NodeVyper, node2: NodeVyper): + link_nodes(node1.underlying_node, node2.underlying_node) + + +class FunctionVyper: + def __init__( + self, + function: Function, + function_data: Dict, + ) -> None: + self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} + + self._function = function + print(function_data.name) + print(function_data) + self._function.name = function_data.name + self._function.id = function_data.node_id + + self._local_variables_parser: List = [] + + for decorator in function_data.decorators: + if not hasattr(decorator, "id"): + continue # TODO isinstance Name + if decorator.id in ["external", "public", "internal"]: + self._function.visibility = decorator.id + elif decorator.id == "view": + self._function.view = True + elif decorator.id == "pure": + self._function.pure = True + elif decorator.id == "payable": + self._function.payable = True + else: + raise ValueError(f"Unknown decorator {decorator.id}") + # Interfaces do not have decorators and are external + if self._function._visibility is None: + self._function.visibility = "external" + self._functionNotParsed = function_data + self._params_was_analyzed = False + self._content_was_analyzed = False + + # self._counter_scope_local_variables = 0 + # # variable renamed will map the solc id + # # to the variable. It only works for compact format + # # Later if an expression provides the referencedDeclaration attr + # # we can retrieve the variable + # # It only matters if two variables have the same name in the function + # # which is only possible with solc > 0.5 + # self._variables_renamed: Dict[ + # int, Union[LocalVariableVyper, LocalVariableInitFromTupleSolc] + # ] = {} + + self._analyze_function_type() + + # self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} + # self._node_to_yulobject: Dict[Node, YulBlock] = {} + + # self._local_variables_parser: List[ + # Union[LocalVariableVyper, LocalVariableInitFromTupleSolc] + # ] = [] + + if function_data.doc_string is not None: + function.has_documentation = True + + @property + def underlying_function(self) -> Function: + return self._function + + @property + def compilation_unit(self) -> "SlitherCompilationUnit": + return self._function.compilation_unit + + ################################################################################### + ################################################################################### + # region Variables + ################################################################################### + ################################################################################### + + @property + def variables_renamed( + self, + ) -> Dict[int, LocalVariableVyper]: + return self._variables_renamed + + def _add_local_variable(self, local_var_parser: LocalVariableVyper) -> None: + # If two local variables have the same name + # We add a suffix to the new variable + # This is done to prevent collision during SSA translation + # Use of while in case of collision + # In the worst case, the name will be really long + # TODO no shadowing? + # if local_var_parser.underlying_variable.name: + # known_variables = [v.name for v in self._function.variables] + # while local_var_parser.underlying_variable.name in known_variables: + # local_var_parser.underlying_variable.name += ( + # f"_scope_{self._counter_scope_local_variables}" + # ) + # self._counter_scope_local_variables += 1 + # known_variables = [v.name for v in self._function.variables] + # TODO no reference ID + # if local_var_parser.reference_id is not None: + # self._variables_renamed[local_var_parser.reference_id] = local_var_parser + self._function.variables_as_dict[ + local_var_parser.underlying_variable.name + ] = local_var_parser.underlying_variable + self._local_variables_parser.append(local_var_parser) + + # endregion + ################################################################################### + ################################################################################### + # region Analyses + ################################################################################### + ################################################################################### + + @property + def function_not_parsed(self) -> Dict: + return self._functionNotParsed + + def _analyze_function_type(self) -> None: + if self._function.name == "__init__": + self._function.function_type = FunctionType.CONSTRUCTOR + elif self._function.name == "__default__": + self._function.function_type = FunctionType.FALLBACK + else: + self._function.function_type = FunctionType.NORMAL + + def analyze_params(self) -> None: + if self._params_was_analyzed: + return + + self._params_was_analyzed = True + + params = self._functionNotParsed.args + returns = self._functionNotParsed.returns + + if params: + self._parse_params(params) + if returns: + self._parse_returns(returns) + + def analyze_content(self) -> None: + if self._content_was_analyzed: + return + + self._content_was_analyzed = True + + body = self._functionNotParsed.body + + print(self._functionNotParsed) + if body: + self._function.is_implemented = True + self._parse_cfg(body) + + for local_var_parser in self._local_variables_parser: + local_var_parser.analyze(self._function.contract) + + for node_parser in self._node_to_NodeVyper.values(): + node_parser.analyze_expressions(self._function.contract) + + # endregion + ################################################################################### + ################################################################################### + # region Nodes + ################################################################################### + ################################################################################### + + def _new_node( + self, node_type: NodeType, src: Union[str, Source], scope: Union[Scope, "Function"] + ) -> NodeVyper: + node = self._function.new_node(node_type, src, scope) + node_parser = NodeVyper(node) + self._node_to_NodeVyper[node] = node_parser + return node_parser + + # endregion + ################################################################################### + ################################################################################### + # region Parsing function + ################################################################################### + ################################################################################### + + def _parse_cfg(self, cfg: Dict) -> None: + + + curr_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) + self._function.entry_point = curr_node.underlying_node + scope = None + + if cfg: + self._function.is_empty = False + for expr in cfg: + def parse_statement(curr_node, expr): + if isinstance(expr, AnnAssign): + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) + + local_var_parser = LocalVariableVyper(local_var, expr) + self._add_local_variable(local_var_parser) + + new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + if expr.value is not None: + new_node.add_unparsed_expression(expr.value) + new_node.underlying_node.add_variable_declaration(local_var) + link_underlying_nodes(curr_node, new_node) + + curr_node = new_node + + elif isinstance(expr, (Assign, AugAssign)): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr.value) + link_underlying_nodes(curr_node, new_node) + + elif isinstance(expr, For): + node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) + node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) + + node_condition = self._new_node(NodeType.IFLOOP, expr.iter.src, scope) + node_condition.add_unparsed_expression(expr.iter) + # link_underlying_nodes(node_startLoop, node_condition) + for stmt in expr.body: + parse_statement(curr_node, stmt) + + # link_underlying_nodes(curr_node, new_node) + + elif isinstance(expr, Continue): + pass + elif isinstance(expr, Break): + pass + elif isinstance(expr, Return): + node_parser = self._new_node(NodeType.RETURN, expr.src, scope) + if expr.value is not None: + node_parser.add_unparsed_expression(expr.value) + + pass + elif isinstance(expr, Assert): + print(expr) + assert False + pass + elif isinstance(expr, Log): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr.value) + pass + elif isinstance(expr, If): + new_node = self._new_node(NodeType.IF, expr.test.src, scope) + new_node.add_unparsed_expression(expr.test) + + for stmt in expr.body: + parse_statement(new_node, stmt) + + for stmt in expr.orelse: + parse_statement(new_node, stmt) + + pass + elif isinstance(expr, Expr): + pass + elif isinstance(expr, Pass): + pass + elif isinstance(expr, Raise): + print(expr) + assert False + pass + else: + print(f"isinstance(expr, {expr.__class__.__name__})") + assert False + return curr_node + curr_node = parse_statement(curr_node, expr) + # self._parse_block(cfg, node, self.underlying_function) + else: + self._function.is_empty = True + + # endregion + ################################################################################### + ################################################################################### + + def _add_param(self, param: Arg, initialized: bool = False) -> LocalVariableVyper: + + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(param.src, self._function.compilation_unit) + print("add_param", param) + local_var_parser = LocalVariableVyper(local_var, param) + + if initialized: + local_var.initialized = True + + # see https://solidity.readthedocs.io/en/v0.4.24/types.html?highlight=storage%20location#data-location + if local_var.location == "default": + local_var.set_location("memory") + + self._add_local_variable(local_var_parser) + return local_var_parser + + def _parse_params(self, params: Arguments): + + print(params) + self._function.parameters_src().set_offset(params.src, self._function.compilation_unit) + + for param in params.args: + local_var = self._add_param(param) + self._function.add_parameters(local_var.underlying_variable) + + def _parse_returns(self, returns: Union[Name, Tuple, Subscript]): + + print(returns) + self._function.returns_src().set_offset(returns.src, self._function.compilation_unit) + + if isinstance(returns, (Name, Subscript)): + local_var = self._add_param(returns) + self._function.add_return(local_var.underlying_variable) + else: + assert isinstance(returns, Tuple) + for ret in returns.elements: + local_var = self._add_param(ret) + self._function.add_return(local_var.underlying_variable) + + ################################################################################### + ################################################################################### diff --git a/slither/vyper_parsing/declarations/modifier.py b/slither/vyper_parsing/declarations/modifier.py new file mode 100644 index 0000000000..c4c5c71772 --- /dev/null +++ b/slither/vyper_parsing/declarations/modifier.py @@ -0,0 +1,107 @@ +""" + Event module +""" +from typing import Dict, TYPE_CHECKING, Union + +from slither.core.cfg.node import NodeType +from slither.core.cfg.node import link_nodes +from slither.core.cfg.scope import Scope +from slither.core.declarations.modifier import Modifier +from slither.solc_parsing.cfg.node import NodeSolc +from slither.solc_parsing.declarations.function import FunctionSolc + +if TYPE_CHECKING: + from slither.solc_parsing.declarations.contract import ContractSolc + from slither.solc_parsing.slither_compilation_unit_solc import SlitherCompilationUnitSolc + from slither.core.declarations import Function + + +class ModifierSolc(FunctionSolc): + def __init__( + self, + modifier: Modifier, + function_data: Dict, + contract_parser: "ContractSolc", + slither_parser: "SlitherCompilationUnitSolc", + ) -> None: + super().__init__(modifier, function_data, contract_parser, slither_parser) + # _modifier is equal to _function, but keep it here to prevent + # confusion for mypy in underlying_function + self._modifier = modifier + + @property + def underlying_function(self) -> Modifier: + return self._modifier + + def analyze_params(self) -> None: + # Can be re-analyzed due to inheritance + if self._params_was_analyzed: + return + + self._params_was_analyzed = True + + self._analyze_attributes() + + if self.is_compact_ast: + params = self._functionNotParsed["parameters"] + else: + children = self._functionNotParsed["children"] + # It uses to be + # params = children[0] + # But from Solidity 0.6.3 to 0.6.10 (included) + # Comment above a function might be added in the children + params = next(child for child in children if child[self.get_key()] == "ParameterList") + + if params: + self._parse_params(params) + + def analyze_content(self) -> None: + if self._content_was_analyzed: + return + + self._content_was_analyzed = True + + if self.is_compact_ast: + body = self._functionNotParsed.get("body", None) + + if body and body[self.get_key()] == "Block": + self._function.is_implemented = True + self._parse_cfg(body) + + else: + children = self._functionNotParsed["children"] + + self._function.is_implemented = False + if len(children) > 1: + # It uses to be + # params = children[1] + # But from Solidity 0.6.3 to 0.6.10 (included) + # Comment above a function might be added in the children + block = next(child for child in children if child[self.get_key()] == "Block") + self._function.is_implemented = True + self._parse_cfg(block) + + for local_var_parser in self._local_variables_parser: + local_var_parser.analyze(self) + + for node in self._node_to_nodesolc.values(): + node.analyze_expressions(self) + + for yul_parser in self._node_to_yulobject.values(): + yul_parser.analyze_expressions() + + self._rewrite_ternary_as_if_else() + self._remove_alone_endif() + + # self._analyze_read_write() + # self._analyze_calls() + + def _parse_statement( + self, statement: Dict, node: NodeSolc, scope: Union[Scope, "Function"] + ) -> NodeSolc: + name = statement[self.get_key()] + if name == "PlaceholderStatement": + placeholder_node = self._new_node(NodeType.PLACEHOLDER, statement["src"], scope) + link_nodes(node.underlying_node, placeholder_node.underlying_node) + return placeholder_node + return super()._parse_statement(statement, node, scope) diff --git a/slither/vyper_parsing/declarations/struct.py b/slither/vyper_parsing/declarations/struct.py new file mode 100644 index 0000000000..0da2c7fed0 --- /dev/null +++ b/slither/vyper_parsing/declarations/struct.py @@ -0,0 +1,35 @@ +from typing import TYPE_CHECKING, Dict, List + +from slither.core.declarations.structure import Structure +from slither.core.variables.structure_variable import StructureVariable +from slither.vyper_parsing.variables.structure_variable import StructureVariableVyper +from slither.vyper_parsing.ast.types import StructDef, AnnAssign + + +class StructVyper: + def __init__( # pylint: disable=too-many-arguments + self, + st: Structure, + struct: StructDef, + ) -> None: + + print(struct) + + self._structure = st + st.name = struct.name + # st.canonical_name = canonicalName + + self._elemsNotParsed: List[AnnAssign] = struct.body + + def analyze(self, contract) -> None: + for elem_to_parse in self._elemsNotParsed: + elem = StructureVariable() + elem.set_structure(self._structure) + elem.set_offset(elem_to_parse.src, self._structure.contract.compilation_unit) + + elem_parser = StructureVariableVyper(elem, elem_to_parse) + elem_parser.analyze(contract) + + self._structure.elems[elem.name] = elem + self._structure.add_elem_in_order(elem.name) + self._elemsNotParsed = [] diff --git a/slither/vyper_parsing/expressions/__init__.py b/slither/vyper_parsing/expressions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py new file mode 100644 index 0000000000..e745c2f7b4 --- /dev/null +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -0,0 +1,308 @@ +import logging +import re +from typing import Union, Dict, TYPE_CHECKING, List, Any + +import slither.core.expressions.type_conversion +from slither.core.declarations.solidity_variables import ( + SOLIDITY_VARIABLES_COMPOSED, + SolidityVariableComposed, +) +from slither.core.expressions import ( + CallExpression, + ConditionalExpression, + ElementaryTypeNameExpression, + Identifier, + IndexAccess, + Literal, + MemberAccess, + NewArray, + NewContract, + NewElementaryType, + SuperCallExpression, + SuperIdentifier, + TupleExpression, + TypeConversion, + UnaryOperation, + UnaryOperationType, +) +from slither.core.expressions.assignment_operation import ( + AssignmentOperation, + AssignmentOperationType, +) +from slither.core.expressions.binary_operation import ( + BinaryOperation, + BinaryOperationType, +) +from slither.core.solidity_types import ( + ArrayType, + ElementaryType, + UserDefinedType, +) +from slither.solc_parsing.declarations.caller_context import CallerContextExpression +from slither.solc_parsing.exceptions import ParsingError, VariableNotFound +from slither.vyper_parsing.expressions.find_variable import find_variable +from slither.solc_parsing.solidity_types.type_parsing import UnknownType, parse_type + + +if TYPE_CHECKING: + from slither.core.expressions.expression import Expression + +logger = logging.getLogger("ExpressionParsing") + +# pylint: disable=anomalous-backslash-in-string,import-outside-toplevel,too-many-branches,too-many-locals + +# region Filtering +################################################################################### +################################################################################### + + +def filter_name(value: str) -> str: + value = value.replace(" memory", "") + value = value.replace(" storage", "") + value = value.replace(" external", "") + value = value.replace(" internal", "") + value = value.replace("struct ", "") + value = value.replace("contract ", "") + value = value.replace("enum ", "") + value = value.replace(" ref", "") + value = value.replace(" pointer", "") + value = value.replace(" pure", "") + value = value.replace(" view", "") + value = value.replace(" constant", "") + value = value.replace(" payable", "") + value = value.replace("function (", "function(") + value = value.replace("returns (", "returns(") + value = value.replace(" calldata", "") + + # remove the text remaining after functio(...) + # which should only be ..returns(...) + # nested parenthesis so we use a system of counter on parenthesis + idx = value.find("(") + if idx: + counter = 1 + max_idx = len(value) + while counter: + assert idx < max_idx + idx = idx + 1 + if value[idx] == "(": + counter += 1 + elif value[idx] == ")": + counter -= 1 + value = value[: idx + 1] + return value + + +# endregion + +################################################################################### +################################################################################### +# region Parsing +################################################################################### +################################################################################### + +# pylint: disable=too-many-statements +def parse_call( + expression: Dict, caller_context +) -> Union[ + slither.core.expressions.call_expression.CallExpression, + slither.core.expressions.type_conversion.TypeConversion, +]: + src = expression["src"] + if caller_context.is_compact_ast: + attributes = expression + type_conversion = expression["kind"] == "typeConversion" + type_return = attributes["typeDescriptions"]["typeString"] + + else: + attributes = expression["attributes"] + type_conversion = attributes["type_conversion"] + type_return = attributes["type"] + + if type_conversion: + type_call = parse_type(UnknownType(type_return), caller_context) + if caller_context.is_compact_ast: + assert len(expression["arguments"]) == 1 + expression_to_parse = expression["arguments"][0] + else: + children = expression["children"] + assert len(children) == 2 + type_info = children[0] + expression_to_parse = children[1] + assert type_info["name"] in [ + "ElementaryTypenameExpression", + "ElementaryTypeNameExpression", + "Identifier", + "TupleExpression", + "IndexAccess", + "MemberAccess", + ] + + expression = parse_expression(expression_to_parse, caller_context) + t = TypeConversion(expression, type_call) + t.set_offset(src, caller_context.compilation_unit) + if isinstance(type_call, UserDefinedType): + type_call.type.references.append(t.source_mapping) + return t + + call_gas = None + call_value = None + call_salt = None + if caller_context.is_compact_ast: + called = parse_expression(expression["expression"], caller_context) + # If the next expression is a FunctionCallOptions + # We can here the gas/value information + # This is only available if the syntax is {gas: , value: } + # For the .gas().value(), the member are considered as function call + # And converted later to the correct info (convert.py) + if expression["expression"][caller_context.get_key()] == "FunctionCallOptions": + call_with_options = expression["expression"] + for idx, name in enumerate(call_with_options.get("names", [])): + option = parse_expression(call_with_options["options"][idx], caller_context) + if name == "value": + call_value = option + if name == "gas": + call_gas = option + if name == "salt": + call_salt = option + arguments = [] + if expression["arguments"]: + arguments = [parse_expression(a, caller_context) for a in expression["arguments"]] + else: + children = expression["children"] + called = parse_expression(children[0], caller_context) + arguments = [parse_expression(a, caller_context) for a in children[1::]] + + if isinstance(called, SuperCallExpression): + sp = SuperCallExpression(called, arguments, type_return) + sp.set_offset(expression["src"], caller_context.compilation_unit) + return sp + call_expression = CallExpression(called, arguments, type_return) + call_expression.set_offset(src, caller_context.compilation_unit) + + # Only available if the syntax {gas:, value:} was used + call_expression.call_gas = call_gas + call_expression.call_value = call_value + call_expression.call_salt = call_salt + return call_expression + + +def parse_super_name(expression: Dict, is_compact_ast: bool) -> str: + if is_compact_ast: + assert expression["nodeType"] == "MemberAccess" + base_name = expression["memberName"] + arguments = expression["typeDescriptions"]["typeString"] + else: + assert expression["name"] == "MemberAccess" + attributes = expression["attributes"] + base_name = attributes["member_name"] + arguments = attributes["type"] + + assert arguments.startswith("function ") + # remove function (...() + arguments = arguments[len("function ") :] + + arguments = filter_name(arguments) + if " " in arguments: + arguments = arguments[: arguments.find(" ")] + + return base_name + arguments + + +def _parse_elementary_type_name_expression( + expression: Dict, is_compact_ast: bool, caller_context: CallerContextExpression +) -> ElementaryTypeNameExpression: + # nop exression + # uint; + if is_compact_ast: + value = expression["typeName"] + else: + if "children" in expression: + value = expression["children"][0]["attributes"]["name"] + else: + value = expression["attributes"]["value"] + if isinstance(value, dict): + t = parse_type(value, caller_context) + else: + t = parse_type(UnknownType(value), caller_context) + e = ElementaryTypeNameExpression(t) + e.set_offset(expression["src"], caller_context.compilation_unit) + return e + + +if TYPE_CHECKING: + pass + + +def _user_defined_op_call( + caller_context: CallerContextExpression, src, function_id: int, args: List[Any], type_call: str +) -> CallExpression: + var, was_created = find_variable(None, caller_context, function_id) + + if was_created: + var.set_offset(src, caller_context.compilation_unit) + + identifier = Identifier(var) + identifier.set_offset(src, caller_context.compilation_unit) + + var.references.append(identifier.source_mapping) + + call = CallExpression(identifier, args, type_call) + call.set_offset(src, caller_context.compilation_unit) + return call + + +from slither.vyper_parsing.ast.types import Int, Call, Attribute, Name, Tuple, Hex, BinOp, Str + +def parse_expression(expression: Dict, caller_context) -> "Expression": + print("parse_expression") + print(expression, "\n") + # assert False + + if isinstance(expression, Int): + return Literal(str(expression.value), ElementaryType("uint256")) + + if isinstance(expression, Hex): + # TODO this is an implicit conversion and could potentially be bytes20 or other? + return Literal(str(expression.value), ElementaryType("address")) + + if isinstance(expression, Str): + return Literal(str(expression.value), ElementaryType("string")) + + + + if isinstance(expression, Call): + called = parse_expression(expression.func, caller_context) + arguments = [parse_expression(a, caller_context) for a in expression.args] + # Since the AST lacks the type of the return values, we recover it. + rets = called.value.returns + def get_type_str(x): + return str(x.type) + type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" + print(type_str) + + + return CallExpression(called, arguments, type_str) + + if isinstance(expression, Attribute): + var, was_created = find_variable(expression.attr, caller_context) + assert var + return Identifier(var) + + if isinstance(expression, Name): + var, was_created = find_variable(expression.id, caller_context) + assert var + return Identifier(var) + + if isinstance(expression, Tuple): + tuple_vars = [parse_expression(x, caller_context) for x in expression.elements] + return TupleExpression(tuple_vars) + + if isinstance(expression, BinOp): + lhs = parse_expression(expression.left, caller_context) + rhs = parse_expression(expression.right, caller_context) + + op = BinaryOperationType.get_type(expression.op) + return BinaryOperation(lhs, rhs, op) + + + raise ParsingError(f"Expression not parsed {expression}") diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py new file mode 100644 index 0000000000..9037af110c --- /dev/null +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -0,0 +1,240 @@ +from typing import TYPE_CHECKING, Optional, Union, List, Tuple + +from slither.core.declarations import Event, Enum, Structure +from slither.core.declarations.contract import Contract +from slither.core.declarations.custom_error import CustomError +from slither.core.declarations.function import Function +from slither.core.declarations.function_contract import FunctionContract +from slither.core.declarations.function_top_level import FunctionTopLevel +from slither.core.declarations.solidity_import_placeholder import SolidityImportPlaceHolder +from slither.core.declarations.solidity_variables import ( + SOLIDITY_FUNCTIONS, + SOLIDITY_VARIABLES, + SolidityFunction, + SolidityVariable, +) +from slither.core.scope.scope import FileScope +from slither.core.solidity_types import ( + ArrayType, + FunctionType, + MappingType, + TypeAlias, +) +from slither.core.variables.top_level_variable import TopLevelVariable +from slither.core.variables.variable import Variable +from slither.exceptions import SlitherError +from slither.solc_parsing.declarations.caller_context import CallerContextExpression +from slither.solc_parsing.exceptions import VariableNotFound + +if TYPE_CHECKING: + from slither.solc_parsing.declarations.function import FunctionSolc + from slither.solc_parsing.declarations.contract import ContractSolc + +# pylint: disable=import-outside-toplevel,too-many-branches,too-many-locals + + +# CallerContext =Union["ContractSolc", "FunctionSolc", "CustomErrorSolc", "StructureTopLevelSolc"] + + + +def _find_variable_in_function_parser( + var_name: str, + function_parser: Optional["FunctionSolc"], +) -> Optional[Variable]: + if function_parser is None: + return None + func_variables = function_parser.underlying_function.variables_as_dict + if var_name in func_variables: + return func_variables[var_name] + + return None + + + + +def _find_in_contract( + var_name: str, + contract: Optional[Contract], + contract_declarer: Optional[Contract], +) -> Optional[Union[Variable, Function, Contract, Event, Enum, Structure, CustomError]]: + if contract is None or contract_declarer is None: + return None + + # variable are looked from the contract declarer + print(contract) + contract_variables = contract.variables_as_dict + print(contract_variables) + if var_name in contract_variables: + return contract_variables[var_name] + + + + functions = {f.name: f for f in contract.functions if not f.is_shadowed} + print(functions) + if var_name in functions: + return functions[var_name] + + # structures are looked on the contract declarer + structures = contract.structures_as_dict + if var_name in structures: + return structures[var_name] + + events = contract.events_as_dict + if var_name in events: + return events[var_name] + + enums = contract.enums_as_dict + if var_name in enums: + return enums[var_name] + + # Note: contract.custom_errors_as_dict uses the name (not the sol sig) as key + # This is because when the dic is populated the underlying object is not yet parsed + # As a result, we need to iterate over all the custom errors here instead of using the dict + custom_errors = contract.custom_errors + try: + for custom_error in custom_errors: + if var_name in [custom_error.solidity_signature, custom_error.full_name]: + return custom_error + except ValueError: + # This can happen as custom error sol signature might not have been built + # when find_variable was called + # TODO refactor find_variable to prevent this from happening + pass + + # If the enum is refered as its name rather than its canonicalName + enums = {e.name: e for e in contract.enums} + if var_name in enums: + return enums[var_name] + + + return None + + +def _find_variable_init( + caller_context: CallerContextExpression, +) -> Tuple[List[Contract], List["Function"], FileScope,]: + from slither.vyper_parsing.declarations.contract import ContractVyper + from slither.vyper_parsing.declarations.function import FunctionVyper + + + direct_contracts: List[Contract] + direct_functions_parser: List[Function] + scope: FileScope + + if isinstance(caller_context, FileScope): + direct_contracts = [] + direct_functions_parser = [] + scope = caller_context + elif isinstance(caller_context, ContractVyper): + direct_contracts = [caller_context.underlying_contract] + direct_functions_parser = [ + f.underlying_function + for f in caller_context.functions_parser + caller_context.modifiers_parser + ] + scope = caller_context.underlying_contract.file_scope + elif isinstance(caller_context, FunctionVyper): + + direct_contracts = [caller_context.underlying_contract] + direct_functions_parser = [ + f.underlying_function + for f in caller_context.functions_parser + ] + + + scope = contract.file_scope + else: + raise SlitherError( + f"{type(caller_context)} ({caller_context} is not valid for find_variable" + ) + + return direct_contracts, direct_functions_parser, scope + + +def find_variable( + var_name: str, + caller_context: CallerContextExpression, +) -> Tuple[ + Union[ + Variable, + Function, + Contract, + SolidityVariable, + SolidityFunction, + Event, + Enum, + Structure, + CustomError, + TypeAlias, + ], + bool, +]: + """ + Return the variable found and a boolean indicating if the variable was created + If the variable was created, it has no source mapping, and it the caller must add it + + :param var_name: + :type var_name: + :param caller_context: + :type caller_context: + :param referenced_declaration: + :return: + :rtype: + """ + + # variable are looked from the contract declarer + # functions can be shadowed, but are looked from the contract instance, rather than the contract declarer + # the difference between function and variable come from the fact that an internal call, or an variable access + # in a function does not behave similariy, for example in: + # contract C{ + # function f(){ + # state_var = 1 + # f2() + # } + # state_var will refer to C.state_var, no mater if C is inherited + # while f2() will refer to the function definition of the inherited contract (C.f2() in the context of C, or + # the contract inheriting from C) + # for events it's unclear what should be the behavior, as they can be shadowed, but there is not impact + # structure/enums cannot be shadowed + + direct_contracts = [caller_context] + direct_functions = caller_context.functions_declared + print(direct_functions) + current_scope = caller_context.file_scope + + # Only look for reference declaration in the direct contract, see comment at the end + # Reference looked are split between direct and all + # Because functions are copied between contracts, two functions can have the same ref + # So we need to first look with respect to the direct context + + from slither.vyper_parsing.declarations.contract import ContractVyper + from slither.vyper_parsing.declarations.function import FunctionVyper + function_parser: Optional[FunctionSolc] = ( + caller_context if isinstance(caller_context, FunctionVyper) else None + ) + ret1 = _find_variable_in_function_parser(var_name, function_parser) + if ret1: + return ret1, False + + ret = _find_in_contract(var_name, caller_context, caller_context) + if ret: + return ret, False + + # Could refer to any enum + all_enumss = [c.enums_as_dict for c in current_scope.contracts.values()] + all_enums = {k: v for d in all_enumss for k, v in d.items()} + if var_name in all_enums: + return all_enums[var_name], False + + contracts = current_scope.contracts + if var_name in contracts: + return contracts[var_name], False + + if var_name in SOLIDITY_VARIABLES: + return SolidityVariable(var_name), False + + if var_name in SOLIDITY_FUNCTIONS: + return SolidityFunction(var_name), False + + + + raise VariableNotFound(f"Variable not found: {var_name} (context {caller_context})") diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py new file mode 100644 index 0000000000..e9a8555671 --- /dev/null +++ b/slither/vyper_parsing/type_parsing.py @@ -0,0 +1,55 @@ +from slither.core.solidity_types.elementary_type import ( + ElementaryType, + ElementaryTypeName, +) # TODO rename solidity type +from slither.core.solidity_types.array_type import ArrayType +from slither.vyper_parsing.expressions.expression_parsing import parse_expression +from slither.vyper_parsing.ast.types import Name, Subscript, Call, Index, Tuple +from typing import Union +from slither.core.solidity_types.user_defined_type import UserDefinedType + + +def parse_type(annotation: Union[Name, Subscript, Call], contract): + assert isinstance(annotation, (Name, Subscript, Call)) + print(annotation) + if isinstance(annotation, Name): + name = annotation.id + elif isinstance(annotation, Subscript): + assert isinstance(annotation.slice, Index) + + # This is also a strange construct... + if isinstance(annotation.slice.value, Tuple): + type_ = parse_type(annotation.slice.value.elements[0], contract) + length = parse_expression(annotation.slice.value.elements[1], contract) + else: + # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression + # so we grab the value + type_ = parse_type(annotation.value, contract) + length = parse_expression(annotation.slice.value, contract) + + # TODO this can also me `HashMaps` + return ArrayType(type_, length) + + elif isinstance(annotation, Call): + return parse_type(annotation.args[0], contract) + + else: + assert False + + lname = name.lower() # todo map String to string + if lname in ElementaryTypeName: + return ElementaryType(lname) + + print(contract.structures_as_dict) + + if name in contract.structures_as_dict: + return UserDefinedType(contract.structures_as_dict[name]) + + print(contract.enums_as_dict) + if name in contract.enums_as_dict: + return UserDefinedType(contract.enums_as_dict[name]) + + print(contract.file_scope.contracts) + if name in contract.file_scope.contracts: + return UserDefinedType(contract.file_scope.contracts[name]) + assert False diff --git a/slither/vyper_parsing/variables/__init__.py b/slither/vyper_parsing/variables/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/slither/vyper_parsing/variables/event_variable.py b/slither/vyper_parsing/variables/event_variable.py new file mode 100644 index 0000000000..10b8aa06cc --- /dev/null +++ b/slither/vyper_parsing/variables/event_variable.py @@ -0,0 +1,21 @@ +from typing import Dict + +from slither.core.variables.event_variable import EventVariable +from slither.vyper_parsing.type_parsing import parse_type +from slither.vyper_parsing.ast.types import AnnAssign + + +class EventVariableVyper: + def __init__(self, variable: EventVariable, variable_data: AnnAssign): + print(variable_data) + self._variable = variable + self._variable.name = variable_data.target.id + # TODO self._variable.indexed + self._elem_to_parse = variable_data.annotation + + @property + def underlying_variable(self) -> EventVariable: + return self._variable + + def analyze(self, contract) -> None: + self._variable.type = parse_type(self._elem_to_parse, contract) diff --git a/slither/vyper_parsing/variables/function_type_variable.py b/slither/vyper_parsing/variables/function_type_variable.py new file mode 100644 index 0000000000..309f4d8b7b --- /dev/null +++ b/slither/vyper_parsing/variables/function_type_variable.py @@ -0,0 +1,13 @@ +from typing import Dict + +from slither.solc_parsing.variables.variable_declaration import VariableDeclarationSolc +from slither.core.variables.function_type_variable import FunctionTypeVariable + + +class FunctionTypeVariableSolc(VariableDeclarationSolc): + def __init__(self, variable: FunctionTypeVariable, variable_data: Dict): + super().__init__(variable, variable_data) + + @property + def underlying_variable(self) -> FunctionTypeVariable: + return self._variable diff --git a/slither/vyper_parsing/variables/local_variable.py b/slither/vyper_parsing/variables/local_variable.py new file mode 100644 index 0000000000..45eb55351a --- /dev/null +++ b/slither/vyper_parsing/variables/local_variable.py @@ -0,0 +1,32 @@ +from typing import Union + +from slither.core.variables.local_variable import LocalVariable +from slither.vyper_parsing.ast.types import Arg, Name, AnnAssign, Subscript, Call +from slither.vyper_parsing.type_parsing import parse_type + + +class LocalVariableVyper: + def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> None: + self._variable: LocalVariable = variable + + if isinstance(variable_data, (Arg, )): + self._variable.name = variable_data.arg + self._elem_to_parse = variable_data.annotation + elif isinstance(variable_data, (AnnAssign, )): + self._variable.name = variable_data.target.id + self._elem_to_parse = variable_data.annotation + else: + self._variable.name = "" + self._elem_to_parse = variable_data + + assert isinstance(self._elem_to_parse, (Name, Subscript, Call)) + + self._variable.set_location("default") + + + @property + def underlying_variable(self) -> LocalVariable: + return self._variable + + def analyze(self, contract) -> None: + self._variable.type = parse_type(self._elem_to_parse, contract) diff --git a/slither/vyper_parsing/variables/state_variable.py b/slither/vyper_parsing/variables/state_variable.py new file mode 100644 index 0000000000..f17a4132ef --- /dev/null +++ b/slither/vyper_parsing/variables/state_variable.py @@ -0,0 +1,30 @@ +from typing import Dict + +from slither.core.variables.state_variable import StateVariable +from slither.vyper_parsing.ast.types import VariableDecl +from slither.vyper_parsing.type_parsing import parse_type +from slither.vyper_parsing.expressions.expression_parsing import parse_expression + +class StateVariableVyper: + def __init__(self, variable: StateVariable, variable_data: VariableDecl) -> None: + self._variable: StateVariable = variable + self._variable.name = variable_data.target.id + self._variable.is_constant = variable_data.is_constant + self._variable.is_immutable = variable_data.is_immutable + self._variable.visibility = "public" if variable_data.is_public else "internal" + self._elem_to_parse = variable_data.annotation + + if variable_data.value is not None: + self._variable.initialized = True + self._initializedNotParsed = variable_data.value + + @property + def underlying_variable(self) -> StateVariable: + return self._variable + + def analyze(self, contract) -> None: + self._variable.type = parse_type(self._elem_to_parse, contract) + + if self._variable.initialized: + self._variable.expression = parse_expression(self._initializedNotParsed, contract) + self._initializedNotParsed = None diff --git a/slither/vyper_parsing/variables/structure_variable.py b/slither/vyper_parsing/variables/structure_variable.py new file mode 100644 index 0000000000..eab7a71c4e --- /dev/null +++ b/slither/vyper_parsing/variables/structure_variable.py @@ -0,0 +1,20 @@ +from typing import Dict + + +from slither.core.variables.structure_variable import StructureVariable +from slither.vyper_parsing.type_parsing import parse_type +from slither.vyper_parsing.ast.types import AnnAssign + + +class StructureVariableVyper: + def __init__(self, variable: StructureVariable, variable_data: AnnAssign): + self._variable: StructureVariable = variable + self._variable.name = variable_data.target.id + self._elem_to_parse = variable_data.annotation + + @property + def underlying_variable(self) -> StructureVariable: + return self._variable + + def analyze(self, contract) -> None: + self._variable.type = parse_type(self._elem_to_parse, contract) diff --git a/slither/vyper_parsing/variables/variable_declaration.py b/slither/vyper_parsing/variables/variable_declaration.py new file mode 100644 index 0000000000..64878163cb --- /dev/null +++ b/slither/vyper_parsing/variables/variable_declaration.py @@ -0,0 +1,150 @@ +import logging +import re +from typing import Dict, Optional, Union + + +from slither.core.variables.variable import Variable +from slither.core.solidity_types.elementary_type import ( + ElementaryType, + NonElementaryType, +) +from slither.solc_parsing.exceptions import ParsingError + +from slither.vyper_parsing.ast.types import VariableDecl, Name, Subscript, ASTNode, Call, Arg +from slither.vyper_parsing.type_parsing import parse_type + + +class VariableDeclarationVyper: + # pylint: disable=too-many-branches + def __init__(self, variable: Variable, variable_data: VariableDecl) -> None: + """ + A variable can be declared through a statement, or directly. + If it is through a statement, the following children may contain + the init value. + It may be possible that the variable is declared through a statement, + but the init value is declared at the VariableDeclaration children level + """ + + self._variable = variable + if isinstance(variable_data, Arg): + self._variable.name = variable_data.arg + else: + self._variable.name = variable_data.target.id + self._was_analyzed: bool = False + self._initializedNotParsed: Optional[ASTNode] = None + + if isinstance(variable_data.annotation, Subscript): + self._elem_to_parse = variable_data.annotation.value.id + elif isinstance(variable_data.annotation, Name): + self._elem_to_parse = variable_data.annotation.id + else: # Event defs with indexed args + assert isinstance(variable_data.annotation, Call) + self._elem_to_parse = variable_data.annotation.args[0].id + self._init_from_declaration(variable_data) + # self._elem_to_parse: Optional[Union[Dict, UnknownType]] = None + # self._initializedNotParsed: Optional[Dict] = None + + # self._is_compact_ast = False + + # self._reference_id: Optional[int] = None + + @property + def underlying_variable(self) -> Variable: + return self._variable + + def _init_from_declaration(self, var: VariableDecl): + # Only state variables + + pass + + # self._handle_comment(attributes) + # Args do not have intial value + # print(var.value) + # assert var.value is None + # def _init_from_declaration( + # self, var: Dict, init: Optional[Dict] + # ) -> None: # pylint: disable=too-many-branches + # if self._is_compact_ast: + # attributes = var + # self._typeName = attributes["typeDescriptions"]["typeString"] + # else: + # assert len(var["children"]) <= 2 + # assert var["name"] == "VariableDeclaration" + + # attributes = var["attributes"] + # self._typeName = attributes["type"] + + # self._variable.name = attributes["name"] + # # self._arrayDepth = 0 + # # self._isMapping = False + # # self._mappingFrom = None + # # self._mappingTo = False + # # self._initial_expression = None + # # self._type = None + + # # Only for comapct ast format + # # the id can be used later if referencedDeclaration + # # is provided + # if "id" in var: + # self._reference_id = var["id"] + + # if "constant" in attributes: + # self._variable.is_constant = attributes["constant"] + + # if "mutability" in attributes: + # # Note: this checked is not needed if "constant" was already in attribute, but we keep it + # # for completion + # if attributes["mutability"] == "constant": + # self._variable.is_constant = True + # if attributes["mutability"] == "immutable": + # self._variable.is_immutable = True + + # self._analyze_variable_attributes(attributes) + + # if self._is_compact_ast: + # if var["typeName"]: + # self._elem_to_parse = var["typeName"] + # else: + # self._elem_to_parse = UnknownType(var["typeDescriptions"]["typeString"]) + # else: + # if not var["children"]: + # # It happens on variable declared inside loop declaration + # try: + # self._variable.type = ElementaryType(self._typeName) + # self._elem_to_parse = None + # except NonElementaryType: + # self._elem_to_parse = UnknownType(self._typeName) + # else: + # self._elem_to_parse = var["children"][0] + + # if self._is_compact_ast: + # self._initializedNotParsed = init + # if init: + # self._variable.initialized = True + # else: + # if init: # there are two way to init a var local in the AST + # assert len(var["children"]) <= 1 + # self._variable.initialized = True + # self._initializedNotParsed = init + # elif len(var["children"]) in [0, 1]: + # self._variable.initialized = False + # self._initializedNotParsed = None + # else: + # assert len(var["children"]) == 2 + # self._variable.initialized = True + # self._initializedNotParsed = var["children"][1] + + def analyze(self) -> None: + if self._was_analyzed: + return + self._was_analyzed = True + + if self._elem_to_parse is not None: + print(self._elem_to_parse) + # assert False + self._variable.type = parse_type(self._elem_to_parse) + self._elem_to_parse = None + + # if self._variable.initialized is not None: + # self._variable.expression = parse_expression(self._initializedNotParsed) + # self._initializedNotParsed = None diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py new file mode 100644 index 0000000000..78cb837483 --- /dev/null +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -0,0 +1,94 @@ +from typing import Dict +from dataclasses import dataclass, field +from slither.core.declarations import Contract +from slither.core.compilation_unit import SlitherCompilationUnit +from slither.vyper_parsing.declarations.contract import ContractVyper +from slither.analyses.data_dependency.data_dependency import compute_dependency +from slither.vyper_parsing.declarations.struct import Structure +from slither.core.variables.state_variable import StateVariable + +from slither.exceptions import SlitherException + + +@dataclass +class VyperCompilationUnit: + _compilation_unit: SlitherCompilationUnit + _parsed: bool = False + _analyzed: bool = False + _underlying_contract_to_parser: Dict[Contract, ContractVyper] = field(default_factory=dict) + _contracts_by_id: Dict[int, Contract] = field(default_factory=dict) + + def parse_module(self, data: Dict, filename: str): + scope = self._compilation_unit.get_scope(filename) + contract = Contract(self._compilation_unit, scope) + contract_parser = ContractVyper(self, contract, data) + contract.set_offset(data.src, self._compilation_unit) + + self._underlying_contract_to_parser[contract] = contract_parser + + def parse_contracts(self): + for contract, contract_parser in self._underlying_contract_to_parser.items(): + self._contracts_by_id[contract.id] = contract + self._compilation_unit.contracts.append(contract) + + contract_parser.parse_enums() + contract_parser.parse_structs() + contract_parser.parse_state_variables() + contract_parser.parse_events() + contract_parser.parse_functions() + + self._parsed = True + + def analyze_contracts(self) -> None: + if not self._parsed: + raise SlitherException("Parse the contract before running analyses") + for contract, contract_parser in self._underlying_contract_to_parser.items(): + contract_parser.analyze() + self._convert_to_slithir() + + compute_dependency(self._compilation_unit) + + self._analyzed = True + + def _convert_to_slithir(self) -> None: + + for contract in self._compilation_unit.contracts: + contract.add_constructor_variables() + for func in contract.functions: + func.generate_slithir_and_analyze() + + # def __init__(self, compilation_unit: SlitherCompilationUnit) -> None: + + # self._contracts_by_id: Dict[int, ContractSolc] = {} + # self._parsed = False + # self._analyzed = False + + # self._underlying_contract_to_parser: Dict[Contract, ContractSolc] = {} + # self._structures_top_level_parser: List[StructureTopLevelSolc] = [] + # self._custom_error_parser: List[CustomErrorSolc] = [] + # self._variables_top_level_parser: List[TopLevelVariableSolc] = [] + # self._functions_top_level_parser: List[FunctionSolc] = [] + # self._using_for_top_level_parser: List[UsingForTopLevelSolc] = [] + + # self._all_functions_and_modifier_parser: List[FunctionSolc] = [] + + # self._top_level_contracts_counter = 0 + + # @property + # def compilation_unit(self) -> SlitherCompilationUnit: + # return self._compilation_unit + + # @property + # def all_functions_and_modifiers_parser(self) -> List[FunctionSolc]: + # return self._all_functions_and_modifier_parser + + # def add_function_or_modifier_parser(self, f: FunctionSolc) -> None: + # self._all_functions_and_modifier_parser.append(f) + + # @property + # def underlying_contract_to_parser(self) -> Dict[Contract, ContractSolc]: + # return self._underlying_contract_to_parser + + # @property + # def slither_parser(self) -> "SlitherCompilationUnitSolc": + # return self From b264512509fef6f614b373fe98744cb4d4ee8bb0 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 18 Aug 2023 15:20:22 -0500 Subject: [PATCH 058/169] improve parse_types --- slither/vyper_parsing/ast/ast.py | 22 ++++++------ .../vyper_parsing/declarations/contract.py | 20 +++++++---- .../vyper_parsing/declarations/function.py | 9 ++--- .../expressions/expression_parsing.py | 27 ++++++++++++--- .../expressions/find_variable.py | 8 ++++- slither/vyper_parsing/type_parsing.py | 34 ++++++++++++++----- 6 files changed, 86 insertions(+), 34 deletions(-) diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index b0a687528a..1ea4f34106 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -197,16 +197,24 @@ def parse_raise(raw: Dict) -> Raise: def parse_expr(raw: Dict) -> Expr: return Expr(value=parse(raw["value"]), **_extract_base_props(raw)) +unop_ast_type_to_op_symbol = {"Not": "!", "USub": "-"} def parse_unary_op(raw: Dict) -> UnaryOp: - return UnaryOp(op=raw["op"], operand=parse(raw["operand"]), **_extract_base_props(raw)) + unop_str = unop_ast_type_to_op_symbol[raw["op"]["ast_type"]] + return UnaryOp(op=unop_str, operand=parse(raw["operand"]), **_extract_base_props(raw)) -binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "-", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>"} +binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "-", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>", "NotEq": "!=", "Eq": "==", "LtE": "<=", "GtE": ">=", "Lt": "<", "Gt": ">", "In": "In", "NotIn": "NotIn"} def parse_bin_op(raw: Dict) -> BinOp: - op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] + arith_op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] return BinOp( - left=parse(raw["left"]), op=op_str, right=parse(raw["right"]), **_extract_base_props(raw) + left=parse(raw["left"]), op=arith_op_str, right=parse(raw["right"]), **_extract_base_props(raw) + ) + +def parse_compare(raw: Dict) -> Compare: + logical_op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] + return Compare( + left=parse(raw["left"]), op=logical_op_str, right=parse(raw["right"]), **_extract_base_props(raw) ) @@ -243,12 +251,6 @@ def parse_doc_str(raw: Dict) -> str: return raw["value"] -def parse_compare(raw: Dict) -> Compare: - return Compare( - left=parse(raw["left"]), op=raw["op"], right=parse(raw["right"]), **_extract_base_props(raw) - ) - - def parse_if(raw: Dict) -> ASTNode: return If( test=parse(raw["test"]), diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index 3a01a22f7f..d95ae68559 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -85,6 +85,7 @@ def _parse_contract_items(self) -> None: self._contract.file_scope.contracts[contract.name] = contract elif isinstance(node, InterfaceDef): + # TODO This needs to be done lazily as interfaces can refer to constant state variables contract = Contract(self._contract.compilation_unit, self._contract.file_scope) contract_parser = ContractVyper(self._slither_parser, contract, node) contract.set_offset(node.src, self._contract.compilation_unit) @@ -132,6 +133,8 @@ def parse_state_variables(self) -> None: assert var.name self._contract.variables_as_dict[var.name] = var self._contract.add_variables_ordered([var]) + # Interfaces can refer to constants + self._contract.file_scope.variables[var.name] = var self._variablesNotParsed = [] @@ -160,15 +163,20 @@ def parse_functions(self) -> None: self._functionsNotParsed = [] def analyze(self) -> None: - for p in self._structures_parser: - p.analyze(self._contract) - for p in self._variables_parser: - p.analyze(self._contract) - for p in self._events_parser: - p.analyze(self._contract) + print("Analyze", self._contract._name) + # Struct defs can refer to constant state variables + for var_parser in self._variables_parser: + var_parser.analyze(self._contract) + + for struct_parser in self._structures_parser: + struct_parser.analyze(self._contract) + + for event_parser in self._events_parser: + event_parser.analyze(self._contract) for function in self._functions_parser: function.analyze_params() + for function in self._functions_parser: function.analyze_content() diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index b652efc5fc..7960e2ed8c 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -168,7 +168,6 @@ def analyze_content(self) -> None: body = self._functionNotParsed.body - print(self._functionNotParsed) if body: self._function.is_implemented = True self._parse_cfg(body) @@ -256,9 +255,11 @@ def parse_statement(curr_node, expr): pass elif isinstance(expr, Assert): - print(expr) - assert False - pass + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) + + + elif isinstance(expr, Log): new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) new_node.add_unparsed_expression(expr.value) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index e745c2f7b4..b874ddb1f1 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -7,6 +7,7 @@ SOLIDITY_VARIABLES_COMPOSED, SolidityVariableComposed, ) +from slither.core.declarations import SolidityFunction from slither.core.expressions import ( CallExpression, ConditionalExpression, @@ -251,7 +252,7 @@ def _user_defined_op_call( return call -from slither.vyper_parsing.ast.types import Int, Call, Attribute, Name, Tuple, Hex, BinOp, Str +from slither.vyper_parsing.ast.types import Int, Call, Attribute, Name, Tuple, Hex, BinOp, Str, Assert, Compare, UnaryOp def parse_expression(expression: Dict, caller_context) -> "Expression": print("parse_expression") @@ -275,11 +276,11 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": arguments = [parse_expression(a, caller_context) for a in expression.args] # Since the AST lacks the type of the return values, we recover it. rets = called.value.returns + def get_type_str(x): return str(x.type) + type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" - print(type_str) - return CallExpression(called, arguments, type_str) @@ -290,6 +291,8 @@ def get_type_str(x): if isinstance(expression, Name): var, was_created = find_variable(expression.id, caller_context) + print(var) + print(var.__class__) assert var return Identifier(var) @@ -297,12 +300,28 @@ def get_type_str(x): tuple_vars = [parse_expression(x, caller_context) for x in expression.elements] return TupleExpression(tuple_vars) - if isinstance(expression, BinOp): + if isinstance(expression, UnaryOp): + operand = parse_expression(expression.operand, caller_context) + op = UnaryOperationType.get_type(expression.op, isprefix=True) #TODO does vyper have postfix? + + return UnaryOperation(operand, op) + + if isinstance(expression, (BinOp, Compare)): lhs = parse_expression(expression.left, caller_context) rhs = parse_expression(expression.right, caller_context) op = BinaryOperationType.get_type(expression.op) return BinaryOperation(lhs, rhs, op) + if isinstance(expression, Assert): + type_str = "tuple()" + if expression.msg is None: + func = SolidityFunction("require(bool)") + args = [parse_expression(expression.test, caller_context)] + else: + func = SolidityFunction("require(bool,string)") + args = [parse_expression(expression.test, caller_context), parse_expression(expression.msg, caller_context)] + return CallExpression(Identifier(func), args, type_str) + raise ParsingError(f"Expression not parsed {expression}") diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index 9037af110c..4e0564a425 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -44,6 +44,7 @@ def _find_variable_in_function_parser( if function_parser is None: return None func_variables = function_parser.underlying_function.variables_as_dict + print("func_variables", func_variables) if var_name in func_variables: return func_variables[var_name] @@ -208,9 +209,10 @@ def find_variable( from slither.vyper_parsing.declarations.contract import ContractVyper from slither.vyper_parsing.declarations.function import FunctionVyper - function_parser: Optional[FunctionSolc] = ( + function_parser: Optional[FunctionVyper] = ( caller_context if isinstance(caller_context, FunctionVyper) else None ) + print("function_parser", function_parser) ret1 = _find_variable_in_function_parser(var_name, function_parser) if ret1: return ret1, False @@ -219,6 +221,10 @@ def find_variable( if ret: return ret, False + print(current_scope.variables) + if var_name in current_scope.variables: + return current_scope.variables[var_name], False + # Could refer to any enum all_enumss = [c.enums_as_dict for c in current_scope.contracts.values()] all_enums = {k: v for d in all_enumss for k, v in d.items()} diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index e9a8555671..49cfd6b2d3 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -3,6 +3,8 @@ ElementaryTypeName, ) # TODO rename solidity type from slither.core.solidity_types.array_type import ArrayType +from slither.core.solidity_types.mapping_type import MappingType + from slither.vyper_parsing.expressions.expression_parsing import parse_expression from slither.vyper_parsing.ast.types import Name, Subscript, Call, Index, Tuple from typing import Union @@ -16,19 +18,33 @@ def parse_type(annotation: Union[Name, Subscript, Call], contract): name = annotation.id elif isinstance(annotation, Subscript): assert isinstance(annotation.slice, Index) - # This is also a strange construct... if isinstance(annotation.slice.value, Tuple): - type_ = parse_type(annotation.slice.value.elements[0], contract) - length = parse_expression(annotation.slice.value.elements[1], contract) - else: - # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression - # so we grab the value - type_ = parse_type(annotation.value, contract) - length = parse_expression(annotation.slice.value, contract) + assert isinstance(annotation.value, Name) + if annotation.value.id == "DynArray": + type_ = parse_type(annotation.slice.value.elements[0], contract) + length = parse_expression(annotation.slice.value.elements[1], contract) + return ArrayType(type_, length) + else: + assert annotation.value.id == "HashMap" + type_from = parse_type(annotation.slice.value.elements[0], contract) + type_to = parse_type(annotation.slice.value.elements[1], contract) - # TODO this can also me `HashMaps` + return MappingType(type_from, type_to) + + elif isinstance(annotation.value, Subscript): + type_ = parse_type(annotation.value, contract) + + elif isinstance(annotation.value, Name): + # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression, so we grab the value. + # Subscript(src='13:10:0', node_id=7, value=Name(src='13:6:0', node_id=8, id='String'), slice=Index(src='13:10:0', node_id=12, value=Int(src='20:2:0', node_id=10, value=64))) + type_ = parse_type(annotation.value, contract) + if annotation.value.id == "String": + return type_ + + length = parse_expression(annotation.slice.value, contract) return ArrayType(type_, length) + elif isinstance(annotation, Call): return parse_type(annotation.args[0], contract) From 90dc42fafe8a5d03d60f33236fd93b037f165117 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Sat, 19 Aug 2023 19:38:41 -0500 Subject: [PATCH 059/169] fix interface referring to constants, plus comments --- slither/vyper_parsing/ast/ast.py | 2 ++ slither/vyper_parsing/declarations/contract.py | 12 +++++++++--- .../vyper_parsing/expressions/expression_parsing.py | 2 ++ slither/vyper_parsing/vyper_compilation_unit.py | 7 +++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index 1ea4f34106..2c2470c74c 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -197,12 +197,14 @@ def parse_raise(raw: Dict) -> Raise: def parse_expr(raw: Dict) -> Expr: return Expr(value=parse(raw["value"]), **_extract_base_props(raw)) +# This is done for convenience so we can call `UnaryOperationType.get_type` during expression parsing. unop_ast_type_to_op_symbol = {"Not": "!", "USub": "-"} def parse_unary_op(raw: Dict) -> UnaryOp: unop_str = unop_ast_type_to_op_symbol[raw["op"]["ast_type"]] return UnaryOp(op=unop_str, operand=parse(raw["operand"]), **_extract_base_props(raw)) +# This is done for convenience so we can call `BinaryOperationType.get_type` during expression parsing. binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "-", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>", "NotEq": "!=", "Eq": "==", "LtE": "<=", "GtE": ">=", "Lt": "<", "Gt": ">", "In": "In", "NotIn": "NotIn"} def parse_bin_op(raw: Dict) -> BinOp: diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index d95ae68559..d252c5bceb 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -87,8 +87,10 @@ def _parse_contract_items(self) -> None: elif isinstance(node, InterfaceDef): # TODO This needs to be done lazily as interfaces can refer to constant state variables contract = Contract(self._contract.compilation_unit, self._contract.file_scope) - contract_parser = ContractVyper(self._slither_parser, contract, node) contract.set_offset(node.src, self._contract.compilation_unit) + contract.is_interface = True + + contract_parser = ContractVyper(self._slither_parser, contract, node) self._contract.file_scope.contracts[contract.name] = contract self._slither_parser._underlying_contract_to_parser[contract] = contract_parser @@ -162,12 +164,16 @@ def parse_functions(self) -> None: self._functionsNotParsed = [] - def analyze(self) -> None: - print("Analyze", self._contract._name) + + def analyze_state_variables(self): # Struct defs can refer to constant state variables for var_parser in self._variables_parser: var_parser.analyze(self._contract) + + def analyze(self) -> None: + print("Analyze", self._contract._name) + for struct_parser in self._structures_parser: struct_parser.analyze(self._contract) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index b874ddb1f1..220e15520d 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -314,6 +314,8 @@ def get_type_str(x): return BinaryOperation(lhs, rhs, op) if isinstance(expression, Assert): + # Treat assert the same as a Solidity `require`. + # TODO rename from `SolidityFunction` to `Builtin`? type_str = "tuple()" if expression.msg is None: func = SolidityFunction("require(bool)") diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index 78cb837483..0a3bb7d3ef 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -42,8 +42,15 @@ def parse_contracts(self): def analyze_contracts(self) -> None: if not self._parsed: raise SlitherException("Parse the contract before running analyses") + + for contract, contract_parser in self._underlying_contract_to_parser.items(): + # State variables are analyzed for all contracts because interfaces may + # reference them, specifically, constants. + contract_parser.analyze_state_variables() + for contract, contract_parser in self._underlying_contract_to_parser.items(): contract_parser.analyze() + self._convert_to_slithir() compute_dependency(self._compilation_unit) From b142d236d731f02204198b1fbbf3c6b33a77ef86 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 22 Aug 2023 16:10:53 -0500 Subject: [PATCH 060/169] check in progress on comparison operators and builtins --- .../core/declarations/solidity_variables.py | 17 ++ .../vyper_parsing/declarations/function.py | 18 +- .../expressions/expression_parsing.py | 162 ++++++++++++++++-- .../expressions/find_variable.py | 50 ++++-- slither/vyper_parsing/type_parsing.py | 29 ++-- 5 files changed, 225 insertions(+), 51 deletions(-) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index f6a0f08390..76c28552ed 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -10,6 +10,7 @@ SOLIDITY_VARIABLES = { "now": "uint256", "this": "address", + "self": "address", "abi": "address", # to simplify the conversion, assume that abi return an address "msg": "", "tx": "", @@ -81,6 +82,22 @@ "balance(address)": ["uint256"], "code(address)": ["bytes"], "codehash(address)": ["bytes32"], + # Vyper + "create_from_blueprint()":[], + "empty()":[], + "convert()":[], # TODO make type conversion + "len()":[], + "method_id()":[], + "unsafe_sub()": [], + "unsafe_add()": [], + "unsafe_div()":[], + "unsafe_mul()":[], + "pow_mod256()":[], + "max_value()":[], + "min_value()":[], + "concat()":[], + "ecrecover()":[], + "isqrt()":[] } diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 7960e2ed8c..cf50fd41a2 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -173,10 +173,10 @@ def analyze_content(self) -> None: self._parse_cfg(body) for local_var_parser in self._local_variables_parser: - local_var_parser.analyze(self._function.contract) + local_var_parser.analyze(self._function) for node_parser in self._node_to_NodeVyper.values(): - node_parser.analyze_expressions(self._function.contract) + node_parser.analyze_expressions(self._function) # endregion ################################################################################### @@ -205,7 +205,7 @@ def _parse_cfg(self, cfg: Dict) -> None: curr_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) self._function.entry_point = curr_node.underlying_node - scope = None + scope = Scope(True, False, self.underlying_function) if cfg: self._function.is_empty = False @@ -227,11 +227,17 @@ def parse_statement(curr_node, expr): curr_node = new_node - elif isinstance(expr, (Assign, AugAssign)): + elif isinstance(expr, (AugAssign, Assign)): new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr.value) + new_node.add_unparsed_expression(expr) link_underlying_nodes(curr_node, new_node) + # elif isinstance(expr, Assign): + # new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + # new_node.add_unparsed_expression(expr.target) + # new_node.add_unparsed_expression(expr.value) + # link_underlying_nodes(curr_node, new_node) + elif isinstance(expr, For): node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) @@ -281,7 +287,7 @@ def parse_statement(curr_node, expr): pass elif isinstance(expr, Raise): print(expr) - assert False + # assert False pass else: print(f"isinstance(expr, {expr.__class__.__name__})") diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 220e15520d..ee6e1c9d18 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -7,7 +7,7 @@ SOLIDITY_VARIABLES_COMPOSED, SolidityVariableComposed, ) -from slither.core.declarations import SolidityFunction +from slither.core.declarations import SolidityFunction, Function from slither.core.expressions import ( CallExpression, ConditionalExpression, @@ -39,10 +39,11 @@ ElementaryType, UserDefinedType, ) +from slither.core.declarations.contract import Contract from slither.solc_parsing.declarations.caller_context import CallerContextExpression from slither.solc_parsing.exceptions import ParsingError, VariableNotFound from slither.vyper_parsing.expressions.find_variable import find_variable -from slither.solc_parsing.solidity_types.type_parsing import UnknownType, parse_type +from slither.vyper_parsing.type_parsing import parse_type if TYPE_CHECKING: @@ -252,7 +253,8 @@ def _user_defined_op_call( return call -from slither.vyper_parsing.ast.types import Int, Call, Attribute, Name, Tuple, Hex, BinOp, Str, Assert, Compare, UnaryOp +from collections import deque +from slither.vyper_parsing.ast.types import Int, Call, Attribute, Name, Tuple, Hex, BinOp, Str, Assert, Compare, UnaryOp, Subscript, NameConstant, VyDict, Bytes, BoolOp, Assign, AugAssign, VyList def parse_expression(expression: Dict, caller_context) -> "Expression": print("parse_expression") @@ -268,34 +270,111 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": if isinstance(expression, Str): return Literal(str(expression.value), ElementaryType("string")) + + if isinstance(expression, Bytes): + return Literal(str(expression.value), ElementaryType("bytes")) - + if isinstance(expression, NameConstant): + assert str(expression.value) in ["True", "False"] + return Literal(str(expression.value), ElementaryType("bool")) if isinstance(expression, Call): called = parse_expression(expression.func, caller_context) - arguments = [parse_expression(a, caller_context) for a in expression.args] - # Since the AST lacks the type of the return values, we recover it. - rets = called.value.returns + + if isinstance(called, Identifier) and isinstance(called.value, SolidityFunction): + if called.value.name == "convert()": + arg = parse_expression(expression.args[0], caller_context) + type_to = parse_type(expression.args[1], caller_context) + return TypeConversion(arg, type_to) + elif called.value.name== "min_value()": + type_to = parse_type(expression.args[0], caller_context) + member_type = str(type_to) + # TODO return Literal + return MemberAccess("min", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + elif called.value.name== "max_value()": + type_to = parse_type(expression.args[0], caller_context) + member_type = str(type_to) + x = MemberAccess("max", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + print(x) + return x + + + if expression.args and isinstance(expression.args[0], VyDict): + arguments = [] + for val in expression.args[0].values: + arguments.append(parse_expression(val, caller_context)) + else: + arguments = [parse_expression(a, caller_context) for a in expression.args] + + if isinstance(called, Identifier): + # Since the AST lacks the type of the return values, we recover it. + if isinstance(called.value, Function): + rets = called.value.returns + elif isinstance(called.value, SolidityFunction): + rets = called.value.return_type + elif isinstance(called.value, Contract): + # Type conversions are not explicitly represented in the AST e.g. converting address to contract/ interface, + # so we infer that a type conversion is occurring if `called` is a `Contract` type. + type_to = parse_type(expression.func, caller_context) + return TypeConversion(arguments[0], type_to) + + else: + rets = ["tuple()"] + + else: + rets = ["tuple()"] def get_type_str(x): + if isinstance(x, str): + return x return str(x.type) - + type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" return CallExpression(called, arguments, type_str) if isinstance(expression, Attribute): - var, was_created = find_variable(expression.attr, caller_context) - assert var - return Identifier(var) - + member_name = expression.attr + if isinstance(expression.value, Name): + + if expression.value.id == "self": + var, was_created = find_variable(member_name, caller_context) + # TODO replace with self + return SuperIdentifier(var) + + expr = parse_expression(expression.value, caller_context) + member_access = MemberAccess(member_name, None, expr) + # member_access.set_offset(src, caller_context.compilation_unit) + if str(member_access) in SOLIDITY_VARIABLES_COMPOSED: + id_idx = Identifier(SolidityVariableComposed(str(member_access))) + # id_idx.set_offset(src, caller_context.compilation_unit) + return id_idx + + else: + expr = parse_expression(expression.value, caller_context) + + member_access = MemberAccess(member_name, None, expr) + + return member_access + if isinstance(expression, Name): var, was_created = find_variable(expression.id, caller_context) - print(var) - print(var.__class__) + assert var return Identifier(var) + if isinstance(expression, Assign): + lhs = parse_expression(expression.target, caller_context) + rhs = parse_expression(expression.value, caller_context) + return AssignmentOperation(lhs, rhs, AssignmentOperationType.ASSIGN, None) + + if isinstance(expression, AugAssign): + lhs = parse_expression(expression.target, caller_context) + rhs = parse_expression(expression.value, caller_context) + + op = AssignmentOperationType.get_type(expression.op) + return BinaryOperation(lhs, rhs, op) + if isinstance(expression, Tuple): tuple_vars = [parse_expression(x, caller_context) for x in expression.elements] return TupleExpression(tuple_vars) @@ -306,7 +385,46 @@ def get_type_str(x): return UnaryOperation(operand, op) - if isinstance(expression, (BinOp, Compare)): + if isinstance(expression, Compare): + lhs = parse_expression(expression.left, caller_context) + + if expression.op in ["In", "NotIn"]: + # If we see a membership operator e.g. x in [foo(), bar()] we rewrite it as if-else: + # if (x == foo()) { + # return true + # } else { + # if (x == bar()) { + # return true + # } else { + # return false + # } + # } + # We assume left operand in membership comparison cannot be Array type + assert isinstance(expression.right, VyList) + conditions = deque() + inner_op = BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") + outer_op = BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") + for elem in expression.right.elements: + elem_expr = parse_expression(elem, caller_context) + + conditions.append(BinaryOperation(lhs, elem_expr, inner_op)) + + assert len(conditions) % 2 == 0 + while len(conditions) > 1: + lhs = conditions.pop() + rhs = conditions.pop() + + conditions.appendleft(BinaryOperation(lhs, rhs, outer_op)) + + return conditions.pop() + + else: + rhs = parse_expression(expression.right, caller_context) + + op = BinaryOperationType.get_type(expression.op) + return BinaryOperation(lhs, rhs, op) + + if isinstance(expression, BinOp): lhs = parse_expression(expression.left, caller_context) rhs = parse_expression(expression.right, caller_context) @@ -326,4 +444,18 @@ def get_type_str(x): return CallExpression(Identifier(func), args, type_str) + if isinstance(expression, Subscript): + left_expression = parse_expression(expression.value, caller_context) + right_expression = parse_expression(expression.slice.value, caller_context) + index = IndexAccess(left_expression, right_expression) + # index.set_offset(src, caller_context.compilation_unit) + return index + + if isinstance(expression, BoolOp): + lhs = parse_expression(expression.values[0], caller_context) + rhs = parse_expression(expression.values[1], caller_context) + + # op = BinaryOperationType.get_type(expression.op) TODO update BoolOp AST + return BinaryOperation(lhs, rhs,BinaryOperationType.ANDAND) + raise ParsingError(f"Expression not parsed {expression}") diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index 4e0564a425..daef44df84 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -43,8 +43,9 @@ def _find_variable_in_function_parser( ) -> Optional[Variable]: if function_parser is None: return None - func_variables = function_parser.underlying_function.variables_as_dict - print("func_variables", func_variables) + func_variables = function_parser.variables_as_dict + # print("func_variables", func_variables) + if var_name in func_variables: return func_variables[var_name] @@ -64,14 +65,14 @@ def _find_in_contract( # variable are looked from the contract declarer print(contract) contract_variables = contract.variables_as_dict - print(contract_variables) + # print(contract_variables) if var_name in contract_variables: return contract_variables[var_name] functions = {f.name: f for f in contract.functions if not f.is_shadowed} - print(functions) + # print(functions) if var_name in functions: return functions[var_name] @@ -196,32 +197,41 @@ def find_variable( # the contract inheriting from C) # for events it's unclear what should be the behavior, as they can be shadowed, but there is not impact # structure/enums cannot be shadowed - - direct_contracts = [caller_context] - direct_functions = caller_context.functions_declared - print(direct_functions) - current_scope = caller_context.file_scope + from slither.vyper_parsing.declarations.contract import ContractVyper + from slither.vyper_parsing.declarations.function import FunctionVyper + print("caller_context") + print(caller_context) + print(caller_context.__class__.__name__) + if isinstance(caller_context, Contract): + direct_contracts = [caller_context] + direct_functions = caller_context.functions_declared + current_scope = caller_context.file_scope + next_context = caller_context + else: + direct_contracts = [caller_context.contract] + direct_functions = caller_context.contract.functions_declared + current_scope = caller_context.contract.file_scope + next_context = caller_context.contract + # print(direct_functions) # Only look for reference declaration in the direct contract, see comment at the end # Reference looked are split between direct and all # Because functions are copied between contracts, two functions can have the same ref # So we need to first look with respect to the direct context - from slither.vyper_parsing.declarations.contract import ContractVyper - from slither.vyper_parsing.declarations.function import FunctionVyper function_parser: Optional[FunctionVyper] = ( - caller_context if isinstance(caller_context, FunctionVyper) else None + caller_context if isinstance(caller_context, FunctionContract) else None ) - print("function_parser", function_parser) + # print("function_parser", function_parser) ret1 = _find_variable_in_function_parser(var_name, function_parser) if ret1: return ret1, False - ret = _find_in_contract(var_name, caller_context, caller_context) + ret = _find_in_contract(var_name, next_context, caller_context) if ret: return ret, False - print(current_scope.variables) + # print(current_scope.variables) if var_name in current_scope.variables: return current_scope.variables[var_name], False @@ -238,9 +248,11 @@ def find_variable( if var_name in SOLIDITY_VARIABLES: return SolidityVariable(var_name), False - if var_name in SOLIDITY_FUNCTIONS: - return SolidityFunction(var_name), False - - + if f"{var_name}()" in SOLIDITY_FUNCTIONS: + return SolidityFunction(f"{var_name}()"), False + print(next_context.events_as_dict) + if f"{var_name}()" in next_context.events_as_dict: + return next_context.events_as_dict[f"{var_name}()"], False + raise VariableNotFound(f"Variable not found: {var_name} (context {caller_context})") diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index 49cfd6b2d3..15fc16df61 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -5,13 +5,20 @@ from slither.core.solidity_types.array_type import ArrayType from slither.core.solidity_types.mapping_type import MappingType -from slither.vyper_parsing.expressions.expression_parsing import parse_expression from slither.vyper_parsing.ast.types import Name, Subscript, Call, Index, Tuple from typing import Union from slither.core.solidity_types.user_defined_type import UserDefinedType +from slither.core.declarations.function_contract import FunctionContract + +def parse_type(annotation: Union[Name, Subscript, Call], caller_context): + from slither.vyper_parsing.expressions.expression_parsing import parse_expression + + if isinstance(caller_context, FunctionContract): + contract = caller_context.contract + else: + contract = caller_context -def parse_type(annotation: Union[Name, Subscript, Call], contract): assert isinstance(annotation, (Name, Subscript, Call)) print(annotation) if isinstance(annotation, Name): @@ -22,32 +29,32 @@ def parse_type(annotation: Union[Name, Subscript, Call], contract): if isinstance(annotation.slice.value, Tuple): assert isinstance(annotation.value, Name) if annotation.value.id == "DynArray": - type_ = parse_type(annotation.slice.value.elements[0], contract) - length = parse_expression(annotation.slice.value.elements[1], contract) + type_ = parse_type(annotation.slice.value.elements[0], caller_context) + length = parse_expression(annotation.slice.value.elements[1], caller_context) return ArrayType(type_, length) else: assert annotation.value.id == "HashMap" - type_from = parse_type(annotation.slice.value.elements[0], contract) - type_to = parse_type(annotation.slice.value.elements[1], contract) + type_from = parse_type(annotation.slice.value.elements[0], caller_context) + type_to = parse_type(annotation.slice.value.elements[1], caller_context) return MappingType(type_from, type_to) elif isinstance(annotation.value, Subscript): - type_ = parse_type(annotation.value, contract) + type_ = parse_type(annotation.value, caller_context) elif isinstance(annotation.value, Name): # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression, so we grab the value. # Subscript(src='13:10:0', node_id=7, value=Name(src='13:6:0', node_id=8, id='String'), slice=Index(src='13:10:0', node_id=12, value=Int(src='20:2:0', node_id=10, value=64))) - type_ = parse_type(annotation.value, contract) + type_ = parse_type(annotation.value, caller_context) if annotation.value.id == "String": return type_ - length = parse_expression(annotation.slice.value, contract) + length = parse_expression(annotation.slice.value, caller_context) return ArrayType(type_, length) elif isinstance(annotation, Call): - return parse_type(annotation.args[0], contract) + return parse_type(annotation.args[0], caller_context) else: assert False @@ -56,7 +63,7 @@ def parse_type(annotation: Union[Name, Subscript, Call], contract): if lname in ElementaryTypeName: return ElementaryType(lname) - print(contract.structures_as_dict) + if name in contract.structures_as_dict: return UserDefinedType(contract.structures_as_dict[name]) From 6fd82fee5887cc4e17fa796babf79bd5fbb4e893 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 22 Aug 2023 20:34:21 -0500 Subject: [PATCH 061/169] aug assign op --- slither/vyper_parsing/ast/ast.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index 2c2470c74c..f562c7cae3 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -301,11 +301,13 @@ def parse_enum_def(raw: Dict) -> EnumDef: return EnumDef(name=raw["name"], body=nodes_parsed, **_extract_base_props(raw)) +aug_assign_ast_type_to_op_symbol = {"Add": "+=", "Mult": "*=", "Sub": "-=", "Div": "-=", "Pow": "**=", "Mod": "%=", "BitAnd": "&=", "BitOr": "|=", "Shr": "<<=", "Shl": ">>="} def parse_aug_assign(raw: Dict) -> AugAssign: + op_str = aug_assign_ast_type_to_op_symbol[raw["op"]["ast_type"]] return AugAssign( target=parse(raw["target"]), - op=raw["op"], + op=op_str, value=parse(raw["value"]), **_extract_base_props(raw), ) From 75c3389ace991a3c05a5fca6436c0d4d43c4ccdb Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 24 Aug 2023 09:39:18 -0500 Subject: [PATCH 062/169] wip rewrite of for loops --- .../vyper_parsing/declarations/function.py | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index cf50fd41a2..c16bf16b3a 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -178,6 +178,8 @@ def analyze_content(self) -> None: for node_parser in self._node_to_NodeVyper.values(): node_parser.analyze_expressions(self._function) + + # endregion ################################################################################### ################################################################################### @@ -239,11 +241,63 @@ def parse_statement(curr_node, expr): # link_underlying_nodes(curr_node, new_node) elif isinstance(expr, For): + node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) + + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) + + counter_var = AnnAssign(expr.target.src, expr.target.node_id, target=Name("-1:-1:-1", -1, "counter_var"), annotation=Name("-1:-1:-1", -1, "uint256"), value=Int("-1:-1:-1", -1, 0)) + local_var_parser = LocalVariableVyper(local_var, counter_var) + self._add_local_variable(local_var_parser) + new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + new_node.add_unparsed_expression(counter_var.value) + new_node.underlying_node.add_variable_declaration(local_var) + + if isinstance(expr.iter, Name): + # TODO use expr.src instead of -1:-1:1? + cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=Call("-1:-1:-1", -1, func=Name("-1:-1:-1", -1, "len"), args=[expr.iter], keywords=[], keyword=None)) + node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) + node_condition.add_unparsed_expression(cond_expr) + + # HACK + # The loop variable is not annotated so we infer its type by looking at the type of the iterator + loop_iterator = list(filter(lambda x: x._variable.name == expr.iter.id, self._local_variables_parser))[0] + # Assumes `Subscript` + # TODO this should go in the body of the loop: expr.body.insert(0, ...) + loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[0] + value = Subscript("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, loop_iterator._variable.name), slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var"))) + loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=loop_var_annotation, value=value) + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) + local_var_parser = LocalVariableVyper(local_var, loop_var) + self._add_local_variable(local_var_parser) + new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + new_node.add_unparsed_expression(loop_var.value) + new_node.underlying_node.add_variable_declaration(local_var) + + elif isinstance(expr.iter, Call): + range_val = expr.iter.args[0] + cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=range_val) + loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=Name("-1:-1:-1", -1, "uint256"), value=Name("-1:-1:-1", -1, "counter_var")) + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) + local_var_parser = LocalVariableVyper(local_var, loop_var) + self._add_local_variable(local_var_parser) + new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + new_node.add_unparsed_expression(loop_var.value) + new_node.underlying_node.add_variable_declaration(local_var) + else: + print(expr) + raise NotImplementedError + # assert False node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) - node_condition = self._new_node(NodeType.IFLOOP, expr.iter.src, scope) - node_condition.add_unparsed_expression(expr.iter) + + # link_underlying_nodes(node_startLoop, node_condition) for stmt in expr.body: parse_statement(curr_node, stmt) From 2f94d1c2517cdd010b2c02d432a8d7c7b11c337b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 24 Aug 2023 13:57:48 -0500 Subject: [PATCH 063/169] more builtins; support params, state vars in loop iterators --- .../core/declarations/solidity_variables.py | 13 +++++- .../vyper_parsing/declarations/contract.py | 4 +- .../vyper_parsing/declarations/function.py | 26 ++++++++--- .../expressions/expression_parsing.py | 43 ++++++++++++++----- .../vyper_parsing/variables/local_variable.py | 8 +++- 5 files changed, 71 insertions(+), 23 deletions(-) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index 76c28552ed..c14efef77b 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -16,6 +16,7 @@ "tx": "", "block": "", "super": "", + "chain": "", } SOLIDITY_VARIABLES_COMPOSED = { @@ -86,7 +87,7 @@ "create_from_blueprint()":[], "empty()":[], "convert()":[], # TODO make type conversion - "len()":[], + "len()":["uint256"], "method_id()":[], "unsafe_sub()": [], "unsafe_add()": [], @@ -97,7 +98,15 @@ "min_value()":[], "concat()":[], "ecrecover()":[], - "isqrt()":[] + "isqrt()":[], + "range()":[], + "min()":[], + "max()":[], + "shift()":[], + "abs()":[], + "raw_call()":[], + "_abi_encode()":[], + "slice()":[], } diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index d252c5bceb..6ad98296e2 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -85,7 +85,7 @@ def _parse_contract_items(self) -> None: self._contract.file_scope.contracts[contract.name] = contract elif isinstance(node, InterfaceDef): - # TODO This needs to be done lazily as interfaces can refer to constant state variables + # This needs to be done lazily as interfaces can refer to constant state variables contract = Contract(self._contract.compilation_unit, self._contract.file_scope) contract.set_offset(node.src, self._contract.compilation_unit) contract.is_interface = True @@ -158,7 +158,7 @@ def parse_functions(self) -> None: func.set_contract(self._contract) func.set_contract_declarer(self._contract) - func_parser = FunctionVyper(func, function) + func_parser = FunctionVyper(func, function, self) self._contract.add_function(func) self._functions_parser.append(func_parser) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index c16bf16b3a..5541f86dfb 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -30,6 +30,7 @@ def __init__( self, function: Function, function_data: Dict, + contract_parser: "ContractVyper", ) -> None: self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} @@ -40,6 +41,7 @@ def __init__( self._function.id = function_data.node_id self._local_variables_parser: List = [] + self._contract_parser = contract_parser for decorator in function_data.decorators: if not hasattr(decorator, "id"): @@ -255,18 +257,28 @@ def parse_statement(curr_node, expr): new_node.add_unparsed_expression(counter_var.value) new_node.underlying_node.add_variable_declaration(local_var) - if isinstance(expr.iter, Name): + if isinstance(expr.iter, (Attribute,Name)): + # HACK + # The loop variable is not annotated so we infer its type by looking at the type of the iterator + if isinstance(expr.iter, Attribute): # state + iter_expr = expr.iter + loop_iterator = list(filter(lambda x: x._variable.name == iter_expr.attr, self._contract_parser._variables_parser))[0] + + else: # local + iter_expr = expr.iter + loop_iterator = list(filter(lambda x: x._variable.name == iter_expr.id, self._local_variables_parser))[0] + # TODO use expr.src instead of -1:-1:1? - cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=Call("-1:-1:-1", -1, func=Name("-1:-1:-1", -1, "len"), args=[expr.iter], keywords=[], keyword=None)) + cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=Call("-1:-1:-1", -1, func=Name("-1:-1:-1", -1, "len"), args=[iter_expr], keywords=[], keyword=None)) node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) node_condition.add_unparsed_expression(cond_expr) - # HACK - # The loop variable is not annotated so we infer its type by looking at the type of the iterator - loop_iterator = list(filter(lambda x: x._variable.name == expr.iter.id, self._local_variables_parser))[0] - # Assumes `Subscript` # TODO this should go in the body of the loop: expr.body.insert(0, ...) - loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[0] + if loop_iterator._elem_to_parse.value.id == "DynArray": + loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[0] + else: + loop_var_annotation = loop_iterator._elem_to_parse.value + value = Subscript("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, loop_iterator._variable.name), slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var"))) loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=loop_var_annotation, value=value) local_var = LocalVariable() diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index ee6e1c9d18..544dcbf65f 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -282,7 +282,10 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": called = parse_expression(expression.func, caller_context) if isinstance(called, Identifier) and isinstance(called.value, SolidityFunction): - if called.value.name == "convert()": + if called.value.name == "empty()": + type_to = parse_type(expression.args[0], caller_context) + return CallExpression(called, [], str(type_to)) + elif called.value.name == "convert()": arg = parse_expression(expression.args[0], caller_context) type_to = parse_type(expression.args[1], caller_context) return TypeConversion(arg, type_to) @@ -294,9 +297,8 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": elif called.value.name== "max_value()": type_to = parse_type(expression.args[0], caller_context) member_type = str(type_to) - x = MemberAccess("max", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) - print(x) - return x + # TODO return Literal + return MemberAccess("max", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) if expression.args and isinstance(expression.args[0], VyDict): @@ -320,7 +322,10 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": else: rets = ["tuple()"] - + elif isinstance(called, MemberAccess) and called.type is not None: + # (recover_type_2) Propagate the type collected to the `CallExpression` + # see recover_type_1 + rets = called.type else: rets = ["tuple()"] @@ -330,7 +335,8 @@ def get_type_str(x): return str(x.type) type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" - + print(CallExpression(called, arguments, type_str)) + print(type_str) return CallExpression(called, arguments, type_str) if isinstance(expression, Attribute): @@ -352,8 +358,25 @@ def get_type_str(x): else: expr = parse_expression(expression.value, caller_context) - - member_access = MemberAccess(member_name, None, expr) + member_name_ret_type = None + # (recover_type_1) This may be a call to an interface and we don't have the return types, + # so we see if there's a function identifier with `member_name` and propagate the type to + # its enclosing `CallExpression` + # try: TODO this is using the wrong caller_context and needs to be interface instead of self namespace + # var, was_created = find_variable(member_name, caller_context) + # if isinstance(var, Function): + # rets = var.returns + # def get_type_str(x): + # if isinstance(x, str): + # return x + # return str(x.type) + + # type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" + # member_name_ret_type = type_str + # except: + # pass + + member_access = MemberAccess(member_name, member_name_ret_type, expr) return member_access @@ -373,9 +396,9 @@ def get_type_str(x): rhs = parse_expression(expression.value, caller_context) op = AssignmentOperationType.get_type(expression.op) - return BinaryOperation(lhs, rhs, op) + return AssignmentOperation(lhs, rhs, op, None) - if isinstance(expression, Tuple): + if isinstance(expression, (Tuple, VyList)): tuple_vars = [parse_expression(x, caller_context) for x in expression.elements] return TupleExpression(tuple_vars) diff --git a/slither/vyper_parsing/variables/local_variable.py b/slither/vyper_parsing/variables/local_variable.py index 45eb55351a..3651b701fd 100644 --- a/slither/vyper_parsing/variables/local_variable.py +++ b/slither/vyper_parsing/variables/local_variable.py @@ -9,13 +9,17 @@ class LocalVariableVyper: def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> None: self._variable: LocalVariable = variable - if isinstance(variable_data, (Arg, )): + if isinstance(variable_data, Arg): self._variable.name = variable_data.arg self._elem_to_parse = variable_data.annotation - elif isinstance(variable_data, (AnnAssign, )): + elif isinstance(variable_data, AnnAssign): self._variable.name = variable_data.target.id self._elem_to_parse = variable_data.annotation + elif isinstance(variable_data, Name): + self._variable.name = variable_data.id + self._elem_to_parse = variable_data else: + # param Subscript self._variable.name = "" self._elem_to_parse = variable_data From 872d9b59b0c6a37cdc31c5d87d385a7cb40d0f8d Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 24 Aug 2023 17:10:05 -0500 Subject: [PATCH 064/169] support enum bitwise comparison operations --- .../expressions/expression_parsing.py | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 544dcbf65f..d3c0dd126c 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -423,16 +423,34 @@ def get_type_str(x): # } # } # We assume left operand in membership comparison cannot be Array type - assert isinstance(expression.right, VyList) conditions = deque() - inner_op = BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") - outer_op = BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") - for elem in expression.right.elements: - elem_expr = parse_expression(elem, caller_context) + if isinstance(expression.right, VyList): + inner_op = BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") + outer_op = BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") - conditions.append(BinaryOperation(lhs, elem_expr, inner_op)) + for elem in expression.right.elements: + elem_expr = parse_expression(elem, caller_context) + print("elem", repr(elem_expr)) + conditions.append(BinaryOperation(lhs, elem_expr, inner_op)) + else: + inner_op = BinaryOperationType.get_type("|") #if expression.op == "NotIn" else BinaryOperationType.get_type("==") + outer_op = BinaryOperationType.get_type("&") #if expression.op == "NotIn" else BinaryOperationType.get_type("||") - assert len(conditions) % 2 == 0 + x, _ = find_variable(expression.right.value.attr, caller_context) + print(x) + print(x.type.type_to) + print(x.type.type_to.__class__) + enum_members = x.type.type_to.type.values + # for each value, create a literal with value = 2 ^ n (0 indexed) + # and then translate to bitmasking + enum_values = [Literal(2 ** n, ElementaryType("uint256")) for n in range(len(enum_members))] + inner_lhs = enum_values[0] + for expr in enum_values[1:]: + inner_lhs = BinaryOperation(inner_lhs, expr, inner_op) + conditions.append(inner_lhs) + print(conditions) + return BinaryOperation(lhs, conditions[0], outer_op) + while len(conditions) > 1: lhs = conditions.pop() rhs = conditions.pop() From 7549341c66c992e19ad6aae2a6ab23e7657188e2 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 10:53:22 -0500 Subject: [PATCH 065/169] add some builtin variables for vyper --- slither/core/declarations/solidity_variables.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index c14efef77b..85844508eb 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -36,6 +36,10 @@ "msg.value": "uint256", "tx.gasprice": "uint256", "tx.origin": "address", + # Vyper + "chain.id": "uint256", + "block.prevhash": "bytes32", + } SOLIDITY_FUNCTIONS: Dict[str, List[str]] = { From fd7c130d3903918050476bc301a1c1a9f8cfdece Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 10:53:47 -0500 Subject: [PATCH 066/169] allow type conversion to array type for vyper --- slither/slithir/operations/type_conversion.py | 5 +++-- slither/visitors/slithir/expression_to_slithir.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/slither/slithir/operations/type_conversion.py b/slither/slithir/operations/type_conversion.py index e9998bc65b..08b87ab49a 100644 --- a/slither/slithir/operations/type_conversion.py +++ b/slither/slithir/operations/type_conversion.py @@ -4,6 +4,7 @@ from slither.core.solidity_types.elementary_type import ElementaryType from slither.core.solidity_types.type_alias import TypeAlias from slither.core.solidity_types.user_defined_type import UserDefinedType +from slither.core.solidity_types.array_type import ArrayType from slither.core.source_mapping.source_mapping import SourceMapping from slither.slithir.operations.lvalue import OperationWithLValue from slither.slithir.utils.utils import is_valid_lvalue, is_valid_rvalue @@ -21,10 +22,10 @@ def __init__( super().__init__() assert is_valid_rvalue(variable) or isinstance(variable, Contract) assert is_valid_lvalue(result) - assert isinstance(variable_type, (TypeAlias, UserDefinedType, ElementaryType)) + assert isinstance(variable_type, (TypeAlias, UserDefinedType, ElementaryType, ArrayType)) self._variable = variable - self._type: Union[TypeAlias, UserDefinedType, ElementaryType] = variable_type + self._type: Union[TypeAlias, UserDefinedType, ElementaryType, ArrayType] = variable_type self._lvalue = result @property diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index a99a6af863..5a6c7de598 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -573,7 +573,7 @@ def _post_type_conversion(self, expression: expressions.TypeConversion) -> None: expr = get(expression.expression) val = TemporaryVariable(self._node) expression_type = expression.type - assert isinstance(expression_type, (TypeAlias, UserDefinedType, ElementaryType)) + assert isinstance(expression_type, (TypeAlias, UserDefinedType, ElementaryType, ArrayType)) operation = TypeConversion(val, expr, expression_type) val.set_type(expression.type) operation.set_expression(expression) From a8641d244fb58ee5cf1fd246a9fa79de5daa633a Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 10:55:47 -0500 Subject: [PATCH 067/169] add anon. local for return signature --- slither/vyper_parsing/declarations/function.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 5541f86dfb..0cce65d045 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -399,14 +399,16 @@ def _parse_returns(self, returns: Union[Name, Tuple, Subscript]): print(returns) self._function.returns_src().set_offset(returns.src, self._function.compilation_unit) - + # Only the type of the arg is given, not a name. We create an an `Arg` with an empty name + # so that the function has the correct return type in its signature but doesn't clash with + # other identifiers during name resolution (`find_variable`). if isinstance(returns, (Name, Subscript)): - local_var = self._add_param(returns) + local_var = self._add_param(Arg(returns.src, returns.node_id, "", annotation=returns)) self._function.add_return(local_var.underlying_variable) else: assert isinstance(returns, Tuple) for ret in returns.elements: - local_var = self._add_param(ret) + local_var = self._add_param(Arg(ret.src, ret.node_id, "", annotation=ret)) self._function.add_return(local_var.underlying_variable) ################################################################################### From 4c78fe00c4f9367228502f33b3ffadda55c4775b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 10:57:48 -0500 Subject: [PATCH 068/169] support conversion of interface to address, lookup interface funcs --- .../expressions/expression_parsing.py | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index d3c0dd126c..86913ea7bf 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -309,6 +309,8 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": arguments = [parse_expression(a, caller_context) for a in expression.args] if isinstance(called, Identifier): + print("called", called) + print("called.value", called.value.__class__.__name__) # Since the AST lacks the type of the return values, we recover it. if isinstance(called.value, Function): rets = called.value.returns @@ -325,7 +327,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": elif isinstance(called, MemberAccess) and called.type is not None: # (recover_type_2) Propagate the type collected to the `CallExpression` # see recover_type_1 - rets = called.type + rets = [called.type] else: rets = ["tuple()"] @@ -333,7 +335,7 @@ def get_type_str(x): if isinstance(x, str): return x return str(x.type) - + print(rets) type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" print(CallExpression(called, arguments, type_str)) print(type_str) @@ -347,8 +349,10 @@ def get_type_str(x): var, was_created = find_variable(member_name, caller_context) # TODO replace with self return SuperIdentifier(var) - expr = parse_expression(expression.value, caller_context) + # TODO this is ambiguous because it could be a type conversion of an interface or a member access + if expression.attr == "address": + return TypeConversion(expr, ElementaryType("address")) member_access = MemberAccess(member_name, None, expr) # member_access.set_offset(src, caller_context.compilation_unit) if str(member_access) in SOLIDITY_VARIABLES_COMPOSED: @@ -362,17 +366,22 @@ def get_type_str(x): # (recover_type_1) This may be a call to an interface and we don't have the return types, # so we see if there's a function identifier with `member_name` and propagate the type to # its enclosing `CallExpression` - # try: TODO this is using the wrong caller_context and needs to be interface instead of self namespace - # var, was_created = find_variable(member_name, caller_context) - # if isinstance(var, Function): - # rets = var.returns - # def get_type_str(x): - # if isinstance(x, str): - # return x - # return str(x.type) - - # type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" - # member_name_ret_type = type_str + # TODO this is using the wrong caller_context and needs to be interface instead of self namespace + print(expr) + print(expr.__class__.__name__) + + if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType): + # try: + var, was_created = find_variable(member_name, expr.type.type) + if isinstance(var, Function): + rets = var.returns + def get_type_str(x): + if isinstance(x, str): + return x + return str(x.type) + + type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" + member_name_ret_type = type_str # except: # pass From cff917f99a36585ca96ccb8ae2c21768daa33ebe Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 20:51:26 -0500 Subject: [PATCH 069/169] handle stldib interfaces --- .../vyper_parsing/declarations/contract.py | 119 ++++++++++++++++-- 1 file changed, 110 insertions(+), 9 deletions(-) diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index 6ad98296e2..fde720340a 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -10,6 +10,13 @@ ImportFrom, InterfaceDef, AnnAssign, + Expr, + Name, + Arguments, + Index, + Subscript, + Int, + Arg, ) from slither.vyper_parsing.declarations.event import EventVyper @@ -74,15 +81,111 @@ def _parse_contract_items(self) -> None: elif isinstance(node, StructDef): self._structuresNotParsed.append(node) elif isinstance(node, ImportFrom): + # TOOD aliases + # We create an `InterfaceDef` sense the compilatuion unit does not contain the actual interface # https://github.com/vyperlang/vyper/tree/master/vyper/builtins/interfaces if node.module == "vyper.interfaces": - # TODO add functions - contract = Contract(self._contract.compilation_unit, self._contract.file_scope) - contract.set_offset("-1:-1:-1", self._contract.compilation_unit) - - contract.name = node.name - contract.is_interface = True - self._contract.file_scope.contracts[contract.name] = contract + interfaces = { + "ERC20Detailed": InterfaceDef( + src="-1:-1:-1", + node_id=-1, + name="ERC20Detailed", + body=[ + FunctionDef( + src="-1:-1:-1", + node_id=-1, + doc_string=None, + name="name", + args=Arguments( + src="-1:-1:-1", + node_id=-1, + args=[], + default=None, + defaults=[], + ), + returns=Subscript( + src="-1:-1:-1", + node_id=-1, + value=Name(src="-1:-1:-1", node_id=-1, id="String"), + slice=Index( + src="-1:-1:-1", + node_id=-1, + value=Int(src="-1:-1:-1", node_id=-1, value=1), + ), + ), + body=[ + Expr( + src="-1:-1:-1", + node_id=-1, + value=Name(src="-1:-1:-1", node_id=-1, id="view"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=-1, + doc_string=None, + name="symbol", + args=Arguments( + src="-1:-1:-1", + node_id=-1, + args=[], + default=None, + defaults=[], + ), + returns=Subscript( + src="-1:-1:-1", + node_id=-1, + value=Name(src="-1:-1:-1", node_id=-1, id="String"), + slice=Index( + src="-1:-1:-1", + node_id=-1, + value=Int(src="-1:-1:-1", node_id=-1, value=1), + ), + ), + body=[ + Expr( + src="-1:-1:-1", + node_id=-1, + value=Name(src="-1:-1:-1", node_id=-1, id="view"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=-1, + doc_string=None, + name="decimals", + args=Arguments( + src="-1:-1:-1", + node_id=-1, + args=[], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=-1, id="uint8"), + body=[ + Expr( + src="-1:-1:-1", + node_id=-1, + value=Name(src="-1:-1:-1", node_id=-1, id="view"), + ) + ], + decorators=[], + pos=None, + ), + ], + ), + "ERC20": InterfaceDef(src="-1:-1:-1", node_id=1, name='ERC20', body=[FunctionDef(src="-1:-1:-1", node_id=2, doc_string=None, name='totalSupply', args=Arguments(src="-1:-1:-1", node_id=3, args=[], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=7, id='uint256'), body=[Expr(src="-1:-1:-1", node_id=4, value=Name(src="-1:-1:-1", node_id=5, id='view'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=9, doc_string=None, name='balanceOf', args=Arguments(src="-1:-1:-1", node_id=10, args=[Arg(src="-1:-1:-1", node_id=11, arg='_owner', annotation=Name(src="-1:-1:-1", node_id=12, id='address'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=17, id='uint256'), body=[Expr(src="-1:-1:-1", node_id=14, value=Name(src="-1:-1:-1", node_id=15, id='view'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=19, doc_string=None, name='allowance', args=Arguments(src="-1:-1:-1", node_id=20, args=[Arg(src="-1:-1:-1", node_id=21, arg='_owner', annotation=Name(src="-1:-1:-1", node_id=22, id='address')), Arg(src="-1:-1:-1", node_id=24, arg='_spender', annotation=Name(src="-1:-1:-1", node_id=25, id='address'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=30, id='uint256'), body=[Expr(src="-1:-1:-1", node_id=27, value=Name(src="-1:-1:-1", node_id=28, id='view'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=32, doc_string=None, name='transfer', args=Arguments(src="-1:-1:-1", node_id=33, args=[Arg(src="-1:-1:-1", node_id=34, arg='_to', annotation=Name(src="-1:-1:-1", node_id=35, id='address')), Arg(src="-1:-1:-1", node_id=37, arg='_value', annotation=Name(src="-1:-1:-1", node_id=38, id='uint256'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=43, id='bool'), body=[Expr(src="-1:-1:-1", node_id=40, value=Name(src="-1:-1:-1", node_id=41, id='nonpayable'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=45, doc_string=None, name='transferFrom', args=Arguments(src="-1:-1:-1", node_id=46, args=[Arg(src="-1:-1:-1", node_id=47, arg='_from', annotation=Name(src="-1:-1:-1", node_id=48, id='address')), Arg(src="-1:-1:-1", node_id=50, arg='_to', annotation=Name(src="-1:-1:-1", node_id=51, id='address')), Arg(src="-1:-1:-1", node_id=53, arg='_value', annotation=Name(src="-1:-1:-1", node_id=54, id='uint256'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=59, id='bool'), body=[Expr(src="-1:-1:-1", node_id=56, value=Name(src="-1:-1:-1", node_id=57, id='nonpayable'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=61, doc_string=None, name='approve', args=Arguments(src="-1:-1:-1", node_id=62, args=[Arg(src="-1:-1:-1", node_id=63, arg='_spender', annotation=Name(src="-1:-1:-1", node_id=64, id='address')), Arg(src="-1:-1:-1", node_id=66, arg='_value', annotation=Name(src="-1:-1:-1", node_id=67, id='uint256'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=72, id='bool'), body=[Expr(src="-1:-1:-1", node_id=69, value=Name(src="-1:-1:-1", node_id=70, id='nonpayable'))], decorators=[], pos=None)]), + "ERC165": [], + "ERC721": [], + "ERC4626": [], + } + self._data.body.append(interfaces[node.name]) elif isinstance(node, InterfaceDef): # This needs to be done lazily as interfaces can refer to constant state variables @@ -164,13 +267,11 @@ def parse_functions(self) -> None: self._functionsNotParsed = [] - def analyze_state_variables(self): # Struct defs can refer to constant state variables for var_parser in self._variables_parser: var_parser.analyze(self._contract) - def analyze(self) -> None: print("Analyze", self._contract._name) From 3e461ca59c08eca81f7cd7c35f648a56cd92b0f2 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 20:56:14 -0500 Subject: [PATCH 070/169] initialized vars with expr --- slither/vyper_parsing/declarations/function.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 0cce65d045..d1b075864a 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -225,6 +225,7 @@ def parse_statement(curr_node, expr): new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) if expr.value is not None: + local_var.initialized = True new_node.add_unparsed_expression(expr.value) new_node.underlying_node.add_variable_declaration(local_var) link_underlying_nodes(curr_node, new_node) @@ -254,6 +255,7 @@ def parse_statement(curr_node, expr): local_var_parser = LocalVariableVyper(local_var, counter_var) self._add_local_variable(local_var_parser) new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + local_var.initialized = True new_node.add_unparsed_expression(counter_var.value) new_node.underlying_node.add_variable_declaration(local_var) @@ -287,6 +289,7 @@ def parse_statement(curr_node, expr): local_var_parser = LocalVariableVyper(local_var, loop_var) self._add_local_variable(local_var_parser) new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + local_var.initialized = True new_node.add_unparsed_expression(loop_var.value) new_node.underlying_node.add_variable_declaration(local_var) @@ -300,6 +303,7 @@ def parse_statement(curr_node, expr): local_var_parser = LocalVariableVyper(local_var, loop_var) self._add_local_variable(local_var_parser) new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + local_var.initialized = True new_node.add_unparsed_expression(loop_var.value) new_node.underlying_node.add_variable_declaration(local_var) else: From 71894bad7ae0458d442b5f03ebda24d36f74909c Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 20:59:54 -0500 Subject: [PATCH 071/169] perform ssa conversion and analysis --- slither/vyper_parsing/vyper_compilation_unit.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index 0a3bb7d3ef..f8a2ca216d 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -58,12 +58,18 @@ def analyze_contracts(self) -> None: self._analyzed = True def _convert_to_slithir(self) -> None: - for contract in self._compilation_unit.contracts: contract.add_constructor_variables() for func in contract.functions: func.generate_slithir_and_analyze() + contract.convert_expression_to_slithir_ssa() + + self._compilation_unit.propagate_function_calls() + for contract in self._compilation_unit.contracts: + contract.fix_phi() + contract.update_read_write_using_ssa() + # def __init__(self, compilation_unit: SlitherCompilationUnit) -> None: # self._contracts_by_id: Dict[int, ContractSolc] = {} From b1cb181dea19cb968bf7f1e5fe0cbe28bb4a1b4b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 28 Aug 2023 21:02:48 -0500 Subject: [PATCH 072/169] remove unused code --- .../vyper_parsing/declarations/modifier.py | 107 ------------- .../expressions/find_variable.py | 50 +----- .../variables/variable_declaration.py | 150 ------------------ 3 files changed, 2 insertions(+), 305 deletions(-) delete mode 100644 slither/vyper_parsing/declarations/modifier.py delete mode 100644 slither/vyper_parsing/variables/variable_declaration.py diff --git a/slither/vyper_parsing/declarations/modifier.py b/slither/vyper_parsing/declarations/modifier.py deleted file mode 100644 index c4c5c71772..0000000000 --- a/slither/vyper_parsing/declarations/modifier.py +++ /dev/null @@ -1,107 +0,0 @@ -""" - Event module -""" -from typing import Dict, TYPE_CHECKING, Union - -from slither.core.cfg.node import NodeType -from slither.core.cfg.node import link_nodes -from slither.core.cfg.scope import Scope -from slither.core.declarations.modifier import Modifier -from slither.solc_parsing.cfg.node import NodeSolc -from slither.solc_parsing.declarations.function import FunctionSolc - -if TYPE_CHECKING: - from slither.solc_parsing.declarations.contract import ContractSolc - from slither.solc_parsing.slither_compilation_unit_solc import SlitherCompilationUnitSolc - from slither.core.declarations import Function - - -class ModifierSolc(FunctionSolc): - def __init__( - self, - modifier: Modifier, - function_data: Dict, - contract_parser: "ContractSolc", - slither_parser: "SlitherCompilationUnitSolc", - ) -> None: - super().__init__(modifier, function_data, contract_parser, slither_parser) - # _modifier is equal to _function, but keep it here to prevent - # confusion for mypy in underlying_function - self._modifier = modifier - - @property - def underlying_function(self) -> Modifier: - return self._modifier - - def analyze_params(self) -> None: - # Can be re-analyzed due to inheritance - if self._params_was_analyzed: - return - - self._params_was_analyzed = True - - self._analyze_attributes() - - if self.is_compact_ast: - params = self._functionNotParsed["parameters"] - else: - children = self._functionNotParsed["children"] - # It uses to be - # params = children[0] - # But from Solidity 0.6.3 to 0.6.10 (included) - # Comment above a function might be added in the children - params = next(child for child in children if child[self.get_key()] == "ParameterList") - - if params: - self._parse_params(params) - - def analyze_content(self) -> None: - if self._content_was_analyzed: - return - - self._content_was_analyzed = True - - if self.is_compact_ast: - body = self._functionNotParsed.get("body", None) - - if body and body[self.get_key()] == "Block": - self._function.is_implemented = True - self._parse_cfg(body) - - else: - children = self._functionNotParsed["children"] - - self._function.is_implemented = False - if len(children) > 1: - # It uses to be - # params = children[1] - # But from Solidity 0.6.3 to 0.6.10 (included) - # Comment above a function might be added in the children - block = next(child for child in children if child[self.get_key()] == "Block") - self._function.is_implemented = True - self._parse_cfg(block) - - for local_var_parser in self._local_variables_parser: - local_var_parser.analyze(self) - - for node in self._node_to_nodesolc.values(): - node.analyze_expressions(self) - - for yul_parser in self._node_to_yulobject.values(): - yul_parser.analyze_expressions() - - self._rewrite_ternary_as_if_else() - self._remove_alone_endif() - - # self._analyze_read_write() - # self._analyze_calls() - - def _parse_statement( - self, statement: Dict, node: NodeSolc, scope: Union[Scope, "Function"] - ) -> NodeSolc: - name = statement[self.get_key()] - if name == "PlaceholderStatement": - placeholder_node = self._new_node(NodeType.PLACEHOLDER, statement["src"], scope) - link_nodes(node.underlying_node, placeholder_node.underlying_node) - return placeholder_node - return super()._parse_statement(statement, node, scope) diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index daef44df84..b75b688db9 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -44,8 +44,7 @@ def _find_variable_in_function_parser( if function_parser is None: return None func_variables = function_parser.variables_as_dict - # print("func_variables", func_variables) - + print("func_variables", func_variables) if var_name in func_variables: return func_variables[var_name] @@ -65,7 +64,6 @@ def _find_in_contract( # variable are looked from the contract declarer print(contract) contract_variables = contract.variables_as_dict - # print(contract_variables) if var_name in contract_variables: return contract_variables[var_name] @@ -112,46 +110,6 @@ def _find_in_contract( return None -def _find_variable_init( - caller_context: CallerContextExpression, -) -> Tuple[List[Contract], List["Function"], FileScope,]: - from slither.vyper_parsing.declarations.contract import ContractVyper - from slither.vyper_parsing.declarations.function import FunctionVyper - - - direct_contracts: List[Contract] - direct_functions_parser: List[Function] - scope: FileScope - - if isinstance(caller_context, FileScope): - direct_contracts = [] - direct_functions_parser = [] - scope = caller_context - elif isinstance(caller_context, ContractVyper): - direct_contracts = [caller_context.underlying_contract] - direct_functions_parser = [ - f.underlying_function - for f in caller_context.functions_parser + caller_context.modifiers_parser - ] - scope = caller_context.underlying_contract.file_scope - elif isinstance(caller_context, FunctionVyper): - - direct_contracts = [caller_context.underlying_contract] - direct_functions_parser = [ - f.underlying_function - for f in caller_context.functions_parser - ] - - - scope = contract.file_scope - else: - raise SlitherError( - f"{type(caller_context)} ({caller_context} is not valid for find_variable" - ) - - return direct_contracts, direct_functions_parser, scope - - def find_variable( var_name: str, caller_context: CallerContextExpression, @@ -202,6 +160,7 @@ def find_variable( print("caller_context") print(caller_context) print(caller_context.__class__.__name__) + print("var", var_name) if isinstance(caller_context, Contract): direct_contracts = [caller_context] direct_functions = caller_context.functions_declared @@ -214,11 +173,6 @@ def find_variable( next_context = caller_context.contract # print(direct_functions) - # Only look for reference declaration in the direct contract, see comment at the end - # Reference looked are split between direct and all - # Because functions are copied between contracts, two functions can have the same ref - # So we need to first look with respect to the direct context - function_parser: Optional[FunctionVyper] = ( caller_context if isinstance(caller_context, FunctionContract) else None ) diff --git a/slither/vyper_parsing/variables/variable_declaration.py b/slither/vyper_parsing/variables/variable_declaration.py deleted file mode 100644 index 64878163cb..0000000000 --- a/slither/vyper_parsing/variables/variable_declaration.py +++ /dev/null @@ -1,150 +0,0 @@ -import logging -import re -from typing import Dict, Optional, Union - - -from slither.core.variables.variable import Variable -from slither.core.solidity_types.elementary_type import ( - ElementaryType, - NonElementaryType, -) -from slither.solc_parsing.exceptions import ParsingError - -from slither.vyper_parsing.ast.types import VariableDecl, Name, Subscript, ASTNode, Call, Arg -from slither.vyper_parsing.type_parsing import parse_type - - -class VariableDeclarationVyper: - # pylint: disable=too-many-branches - def __init__(self, variable: Variable, variable_data: VariableDecl) -> None: - """ - A variable can be declared through a statement, or directly. - If it is through a statement, the following children may contain - the init value. - It may be possible that the variable is declared through a statement, - but the init value is declared at the VariableDeclaration children level - """ - - self._variable = variable - if isinstance(variable_data, Arg): - self._variable.name = variable_data.arg - else: - self._variable.name = variable_data.target.id - self._was_analyzed: bool = False - self._initializedNotParsed: Optional[ASTNode] = None - - if isinstance(variable_data.annotation, Subscript): - self._elem_to_parse = variable_data.annotation.value.id - elif isinstance(variable_data.annotation, Name): - self._elem_to_parse = variable_data.annotation.id - else: # Event defs with indexed args - assert isinstance(variable_data.annotation, Call) - self._elem_to_parse = variable_data.annotation.args[0].id - self._init_from_declaration(variable_data) - # self._elem_to_parse: Optional[Union[Dict, UnknownType]] = None - # self._initializedNotParsed: Optional[Dict] = None - - # self._is_compact_ast = False - - # self._reference_id: Optional[int] = None - - @property - def underlying_variable(self) -> Variable: - return self._variable - - def _init_from_declaration(self, var: VariableDecl): - # Only state variables - - pass - - # self._handle_comment(attributes) - # Args do not have intial value - # print(var.value) - # assert var.value is None - # def _init_from_declaration( - # self, var: Dict, init: Optional[Dict] - # ) -> None: # pylint: disable=too-many-branches - # if self._is_compact_ast: - # attributes = var - # self._typeName = attributes["typeDescriptions"]["typeString"] - # else: - # assert len(var["children"]) <= 2 - # assert var["name"] == "VariableDeclaration" - - # attributes = var["attributes"] - # self._typeName = attributes["type"] - - # self._variable.name = attributes["name"] - # # self._arrayDepth = 0 - # # self._isMapping = False - # # self._mappingFrom = None - # # self._mappingTo = False - # # self._initial_expression = None - # # self._type = None - - # # Only for comapct ast format - # # the id can be used later if referencedDeclaration - # # is provided - # if "id" in var: - # self._reference_id = var["id"] - - # if "constant" in attributes: - # self._variable.is_constant = attributes["constant"] - - # if "mutability" in attributes: - # # Note: this checked is not needed if "constant" was already in attribute, but we keep it - # # for completion - # if attributes["mutability"] == "constant": - # self._variable.is_constant = True - # if attributes["mutability"] == "immutable": - # self._variable.is_immutable = True - - # self._analyze_variable_attributes(attributes) - - # if self._is_compact_ast: - # if var["typeName"]: - # self._elem_to_parse = var["typeName"] - # else: - # self._elem_to_parse = UnknownType(var["typeDescriptions"]["typeString"]) - # else: - # if not var["children"]: - # # It happens on variable declared inside loop declaration - # try: - # self._variable.type = ElementaryType(self._typeName) - # self._elem_to_parse = None - # except NonElementaryType: - # self._elem_to_parse = UnknownType(self._typeName) - # else: - # self._elem_to_parse = var["children"][0] - - # if self._is_compact_ast: - # self._initializedNotParsed = init - # if init: - # self._variable.initialized = True - # else: - # if init: # there are two way to init a var local in the AST - # assert len(var["children"]) <= 1 - # self._variable.initialized = True - # self._initializedNotParsed = init - # elif len(var["children"]) in [0, 1]: - # self._variable.initialized = False - # self._initializedNotParsed = None - # else: - # assert len(var["children"]) == 2 - # self._variable.initialized = True - # self._initializedNotParsed = var["children"][1] - - def analyze(self) -> None: - if self._was_analyzed: - return - self._was_analyzed = True - - if self._elem_to_parse is not None: - print(self._elem_to_parse) - # assert False - self._variable.type = parse_type(self._elem_to_parse) - self._elem_to_parse = None - - # if self._variable.initialized is not None: - # self._variable.expression = parse_expression(self._initializedNotParsed) - # self._initializedNotParsed = None From 5d79bc8c4097006157e7957f641fe61f4338df6c Mon Sep 17 00:00:00 2001 From: Simone Date: Tue, 29 Aug 2023 17:43:21 +0200 Subject: [PATCH 073/169] Improve constants extraction of ReferenceVariable --- slither/printers/guidance/echidna.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/slither/printers/guidance/echidna.py b/slither/printers/guidance/echidna.py index 25e0968cdb..1d1c6657a1 100644 --- a/slither/printers/guidance/echidna.py +++ b/slither/printers/guidance/echidna.py @@ -30,7 +30,7 @@ TypeConversion, ) from slither.slithir.operations.binary import Binary -from slither.slithir.variables import Constant +from slither.slithir.variables import Constant, ReferenceVariable from slither.utils.output import Output from slither.visitors.expression.constants_folding import ConstantFolding, NotConstant @@ -208,19 +208,20 @@ def _extract_constants_from_irs( # pylint: disable=too-many-branches,too-many-n except ValueError: # index could fail; should never happen in working solidity code pass for r in ir.read: + var_read = r.points_to_origin if isinstance(r, ReferenceVariable) else r # Do not report struct_name in a.struct_name if isinstance(ir, Member): continue - if isinstance(r, Constant): - all_cst_used.append(ConstantValue(str(r.value), str(r.type))) - if isinstance(r, StateVariable): - if r.node_initialization: - if r.node_initialization.irs: - if r.node_initialization in context_explored: + if isinstance(var_read, Constant): + all_cst_used.append(ConstantValue(str(var_read.value), str(var_read.type))) + if isinstance(var_read, StateVariable): + if var_read.node_initialization: + if var_read.node_initialization.irs: + if var_read.node_initialization in context_explored: continue - context_explored.add(r.node_initialization) + context_explored.add(var_read.node_initialization) _extract_constants_from_irs( - r.node_initialization.irs, + var_read.node_initialization.irs, all_cst_used, all_cst_used_in_binary, context_explored, From b537b70ef724d8af8c93bc9d62ff84a872ca6c77 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 15:31:24 -0500 Subject: [PATCH 074/169] fix type --- slither/slithir/variables/constant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/slithir/variables/constant.py b/slither/slithir/variables/constant.py index 5321e52500..19aaaa893e 100644 --- a/slither/slithir/variables/constant.py +++ b/slither/slithir/variables/constant.py @@ -11,7 +11,7 @@ class Constant(SlithIRVariable): def __init__( self, - val: Union[int, str], + val: str, constant_type: Optional[ElementaryType] = None, subdenomination: Optional[str] = None, ) -> None: # pylint: disable=too-many-branches From 8a3fb6ad99a5ddd474d89dcd20e9e3c927062a2e Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 15:31:41 -0500 Subject: [PATCH 075/169] fix div symbol --- slither/vyper_parsing/ast/ast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index f562c7cae3..ca748954a1 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -205,7 +205,7 @@ def parse_unary_op(raw: Dict) -> UnaryOp: return UnaryOp(op=unop_str, operand=parse(raw["operand"]), **_extract_base_props(raw)) # This is done for convenience so we can call `BinaryOperationType.get_type` during expression parsing. -binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "-", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>", "NotEq": "!=", "Eq": "==", "LtE": "<=", "GtE": ">=", "Lt": "<", "Gt": ">", "In": "In", "NotIn": "NotIn"} +binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "/", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>", "NotEq": "!=", "Eq": "==", "LtE": "<=", "GtE": ">=", "Lt": "<", "Gt": ">", "In": "In", "NotIn": "NotIn"} def parse_bin_op(raw: Dict) -> BinOp: arith_op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] From 472efb9cda4e9a81ee9eae9de837310bf6ba3ac0 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 15:33:02 -0500 Subject: [PATCH 076/169] improve comparison operator support, set_offset of expressions --- slither/vyper_parsing/cfg/node.py | 8 +- .../expressions/expression_parsing.py | 186 +++++++++++++----- 2 files changed, 137 insertions(+), 57 deletions(-) diff --git a/slither/vyper_parsing/cfg/node.py b/slither/vyper_parsing/cfg/node.py index cf8a8f160f..3d5ffee91e 100644 --- a/slither/vyper_parsing/cfg/node.py +++ b/slither/vyper_parsing/cfg/node.py @@ -32,7 +32,7 @@ def analyze_expressions(self, caller_context) -> None: if self._unparsed_expression: expression = parse_expression(self._unparsed_expression, caller_context) self._node.add_expression(expression) - # self._unparsed_expression = None + self._unparsed_expression = None if self._node.expression: @@ -44,9 +44,9 @@ def analyze_expressions(self, caller_context) -> None: AssignmentOperationType.ASSIGN, self._node.variable_declaration.type, ) - # _expression.set_offset( - # self._node.expression.source_mapping, self._node.compilation_unit - # ) + _expression.set_offset( + self._node.expression.source_mapping, self._node.compilation_unit + ) self._node.add_expression(_expression, bypass_verif_empty=True) expression = self._node.expression diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 86913ea7bf..8ce7577326 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -262,21 +262,31 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # assert False if isinstance(expression, Int): - return Literal(str(expression.value), ElementaryType("uint256")) + literal = Literal(str(expression.value), ElementaryType("uint256")) + literal.set_offset(expression.src, caller_context.compilation_unit) + return literal if isinstance(expression, Hex): # TODO this is an implicit conversion and could potentially be bytes20 or other? - return Literal(str(expression.value), ElementaryType("address")) + literal = Literal(str(expression.value), ElementaryType("address")) + literal.set_offset(expression.src, caller_context.compilation_unit) + return literal if isinstance(expression, Str): - return Literal(str(expression.value), ElementaryType("string")) + literal = Literal(str(expression.value), ElementaryType("string")) + literal.set_offset(expression.src, caller_context.compilation_unit) + return literal if isinstance(expression, Bytes): - return Literal(str(expression.value), ElementaryType("bytes")) + literal = Literal(str(expression.value), ElementaryType("bytes")) + literal.set_offset(expression.src, caller_context.compilation_unit) + return literal if isinstance(expression, NameConstant): assert str(expression.value) in ["True", "False"] - return Literal(str(expression.value), ElementaryType("bool")) + literal = Literal(str(expression.value), ElementaryType("bool")) + literal.set_offset(expression.src, caller_context.compilation_unit) + return literal if isinstance(expression, Call): called = parse_expression(expression.func, caller_context) @@ -284,21 +294,30 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": if isinstance(called, Identifier) and isinstance(called.value, SolidityFunction): if called.value.name == "empty()": type_to = parse_type(expression.args[0], caller_context) - return CallExpression(called, [], str(type_to)) + parsed_expr = CallExpression(called, [], str(type_to)) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr + elif called.value.name == "convert()": arg = parse_expression(expression.args[0], caller_context) type_to = parse_type(expression.args[1], caller_context) - return TypeConversion(arg, type_to) + parsed_expr = TypeConversion(arg, type_to) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr + elif called.value.name== "min_value()": type_to = parse_type(expression.args[0], caller_context) member_type = str(type_to) # TODO return Literal - return MemberAccess("min", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + parsed_expr = MemberAccess("min", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + return parsed_expr + elif called.value.name== "max_value()": type_to = parse_type(expression.args[0], caller_context) member_type = str(type_to) # TODO return Literal - return MemberAccess("max", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + parsed_expr = MemberAccess("max", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + return parsed_expr if expression.args and isinstance(expression.args[0], VyDict): @@ -320,10 +339,13 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # Type conversions are not explicitly represented in the AST e.g. converting address to contract/ interface, # so we infer that a type conversion is occurring if `called` is a `Contract` type. type_to = parse_type(expression.func, caller_context) - return TypeConversion(arguments[0], type_to) + parsed_expr = TypeConversion(arguments[0], type_to) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr else: rets = ["tuple()"] + elif isinstance(called, MemberAccess) and called.type is not None: # (recover_type_2) Propagate the type collected to the `CallExpression` # see recover_type_1 @@ -337,9 +359,10 @@ def get_type_str(x): return str(x.type) print(rets) type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" - print(CallExpression(called, arguments, type_str)) - print(type_str) - return CallExpression(called, arguments, type_str) + + parsed_expr = CallExpression(called, arguments, type_str) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, Attribute): member_name = expression.attr @@ -348,17 +371,25 @@ def get_type_str(x): if expression.value.id == "self": var, was_created = find_variable(member_name, caller_context) # TODO replace with self - return SuperIdentifier(var) + if was_created: + var.set_offset(expression.src, caller_context.compilation_unit) + parsed_expr = SuperIdentifier(var) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr + expr = parse_expression(expression.value, caller_context) # TODO this is ambiguous because it could be a type conversion of an interface or a member access if expression.attr == "address": - return TypeConversion(expr, ElementaryType("address")) + parsed_expr = TypeConversion(expr, ElementaryType("address")) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr + member_access = MemberAccess(member_name, None, expr) - # member_access.set_offset(src, caller_context.compilation_unit) + if str(member_access) in SOLIDITY_VARIABLES_COMPOSED: - id_idx = Identifier(SolidityVariableComposed(str(member_access))) - # id_idx.set_offset(src, caller_context.compilation_unit) - return id_idx + parsed_expr = Identifier(SolidityVariableComposed(str(member_access))) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr else: expr = parse_expression(expression.value, caller_context) @@ -387,35 +418,46 @@ def get_type_str(x): member_access = MemberAccess(member_name, member_name_ret_type, expr) + member_access.set_offset(expression.src, caller_context.compilation_unit) return member_access if isinstance(expression, Name): var, was_created = find_variable(expression.id, caller_context) - - assert var - return Identifier(var) + if was_created: + var.set_offset(expression.src, caller_context.compilation_unit) + parsed_expr = Identifier(var) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, Assign): lhs = parse_expression(expression.target, caller_context) rhs = parse_expression(expression.value, caller_context) - return AssignmentOperation(lhs, rhs, AssignmentOperationType.ASSIGN, None) + parsed_expr = AssignmentOperation(lhs, rhs, AssignmentOperationType.ASSIGN, None) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, AugAssign): lhs = parse_expression(expression.target, caller_context) rhs = parse_expression(expression.value, caller_context) op = AssignmentOperationType.get_type(expression.op) - return AssignmentOperation(lhs, rhs, op, None) + parsed_expr = AssignmentOperation(lhs, rhs, op, None) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, (Tuple, VyList)): tuple_vars = [parse_expression(x, caller_context) for x in expression.elements] - return TupleExpression(tuple_vars) + parsed_expr = TupleExpression(tuple_vars) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, UnaryOp): operand = parse_expression(expression.operand, caller_context) op = UnaryOperationType.get_type(expression.op, isprefix=True) #TODO does vyper have postfix? - return UnaryOperation(operand, op) + parsed_expr = UnaryOperation(operand, op) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, Compare): lhs = parse_expression(expression.left, caller_context) @@ -440,25 +482,55 @@ def get_type_str(x): for elem in expression.right.elements: elem_expr = parse_expression(elem, caller_context) print("elem", repr(elem_expr)) - conditions.append(BinaryOperation(lhs, elem_expr, inner_op)) + parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + conditions.append(parsed_expr) else: - inner_op = BinaryOperationType.get_type("|") #if expression.op == "NotIn" else BinaryOperationType.get_type("==") - outer_op = BinaryOperationType.get_type("&") #if expression.op == "NotIn" else BinaryOperationType.get_type("||") - - x, _ = find_variable(expression.right.value.attr, caller_context) - print(x) - print(x.type.type_to) - print(x.type.type_to.__class__) - enum_members = x.type.type_to.type.values - # for each value, create a literal with value = 2 ^ n (0 indexed) - # and then translate to bitmasking - enum_values = [Literal(2 ** n, ElementaryType("uint256")) for n in range(len(enum_members))] - inner_lhs = enum_values[0] - for expr in enum_values[1:]: - inner_lhs = BinaryOperation(inner_lhs, expr, inner_op) - conditions.append(inner_lhs) - print(conditions) - return BinaryOperation(lhs, conditions[0], outer_op) + rhs = parse_expression(expression.right, caller_context) + print(rhs) + print(rhs.__class__.__name__) + if isinstance(rhs, Identifier): + if isinstance(rhs.value.type, ArrayType): + inner_op = BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") + outer_op = BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") + + enum_members = rhs.value.type.length_value.value + for i in range(enum_members): + elem_expr = IndexAccess(rhs, Literal(str(i), ElementaryType("uint256"))) + elem_expr.set_offset(rhs.source_mapping, caller_context.compilation_unit) + parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) + parsed_expr.set_offset(lhs.source_mapping, caller_context.compilation_unit) + conditions.append(parsed_expr) + # elif isinstance(rhs.value.type, UserDefinedType): + + else: + assert False + else: + # This is an indexaccess like hashmap[address, Roles] + inner_op = BinaryOperationType.get_type("|") #if expression.op == "NotIn" else BinaryOperationType.get_type("==") + outer_op = BinaryOperationType.get_type("&") #if expression.op == "NotIn" else BinaryOperationType.get_type("||") + + # x, _ = find_variable(expression.right.value.attr, caller_context) + # print(x) + # print(x.type.type_to) + # print(x.type.type_to.__class__) + print(repr(rhs)) + print(rhs) + + enum_members = rhs.expression_left.value.type.type_to.type.values + # for each value, create a literal with value = 2 ^ n (0 indexed) + # and then translate to bitmasking + enum_values = [Literal(str(2 ** n), ElementaryType("uint256")) for n in range(len(enum_members))] + inner_lhs = enum_values[0] + for expr in enum_values[1:]: + inner_lhs = BinaryOperation(inner_lhs, expr, inner_op) + conditions.append(inner_lhs) + + parsed_expr = BinaryOperation(lhs, conditions[0], outer_op) + parsed_expr.set_offset(lhs.source_mapping, caller_context.compilation_unit) + return parsed_expr + + while len(conditions) > 1: lhs = conditions.pop() @@ -470,16 +542,20 @@ def get_type_str(x): else: rhs = parse_expression(expression.right, caller_context) - - op = BinaryOperationType.get_type(expression.op) - return BinaryOperation(lhs, rhs, op) + op = BinaryOperationType.get_type(expression.op) + + parsed_expr = BinaryOperation(lhs, rhs, op) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, BinOp): lhs = parse_expression(expression.left, caller_context) rhs = parse_expression(expression.right, caller_context) op = BinaryOperationType.get_type(expression.op) - return BinaryOperation(lhs, rhs, op) + parsed_expr = BinaryOperation(lhs, rhs, op) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, Assert): # Treat assert the same as a Solidity `require`. @@ -492,20 +568,24 @@ def get_type_str(x): func = SolidityFunction("require(bool,string)") args = [parse_expression(expression.test, caller_context), parse_expression(expression.msg, caller_context)] - return CallExpression(Identifier(func), args, type_str) + parsed_expr = CallExpression(Identifier(func), args, type_str) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, Subscript): left_expression = parse_expression(expression.value, caller_context) right_expression = parse_expression(expression.slice.value, caller_context) - index = IndexAccess(left_expression, right_expression) - # index.set_offset(src, caller_context.compilation_unit) - return index + parsed_expr = IndexAccess(left_expression, right_expression) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, BoolOp): lhs = parse_expression(expression.values[0], caller_context) rhs = parse_expression(expression.values[1], caller_context) # op = BinaryOperationType.get_type(expression.op) TODO update BoolOp AST - return BinaryOperation(lhs, rhs,BinaryOperationType.ANDAND) + parsed_expr = BinaryOperation(lhs, rhs,BinaryOperationType.ANDAND) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr raise ParsingError(f"Expression not parsed {expression}") From 011c03a3de1f3b69437c9d2ea7e81ec96e4f4371 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 15:33:59 -0500 Subject: [PATCH 077/169] control flow graph (loops and ifs) --- .../vyper_parsing/declarations/function.py | 147 +++++++++++------- 1 file changed, 90 insertions(+), 57 deletions(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index d1b075864a..db32ac6adb 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -63,7 +63,7 @@ def __init__( self._params_was_analyzed = False self._content_was_analyzed = False - # self._counter_scope_local_variables = 0 + self._counter_scope_local_variables = 0 # # variable renamed will map the solc id # # to the variable. It only works for compact format # # Later if an expression provides the referencedDeclaration attr @@ -113,14 +113,14 @@ def _add_local_variable(self, local_var_parser: LocalVariableVyper) -> None: # Use of while in case of collision # In the worst case, the name will be really long # TODO no shadowing? - # if local_var_parser.underlying_variable.name: - # known_variables = [v.name for v in self._function.variables] - # while local_var_parser.underlying_variable.name in known_variables: - # local_var_parser.underlying_variable.name += ( - # f"_scope_{self._counter_scope_local_variables}" - # ) - # self._counter_scope_local_variables += 1 - # known_variables = [v.name for v in self._function.variables] + if local_var_parser.underlying_variable.name: + known_variables = [v.name for v in self._function.variables] + while local_var_parser.underlying_variable.name in known_variables: + local_var_parser.underlying_variable.name += ( + f"_scope_{self._counter_scope_local_variables}" + ) + self._counter_scope_local_variables += 1 + known_variables = [v.name for v in self._function.variables] # TODO no reference ID # if local_var_parser.reference_id is not None: # self._variables_renamed[local_var_parser.reference_id] = local_var_parser @@ -207,12 +207,13 @@ def _new_node( def _parse_cfg(self, cfg: Dict) -> None: - curr_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) - self._function.entry_point = curr_node.underlying_node + entry_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) + self._function.entry_point = entry_node.underlying_node scope = Scope(True, False, self.underlying_function) if cfg: self._function.is_empty = False + curr_node = entry_node for expr in cfg: def parse_statement(curr_node, expr): if isinstance(expr, AnnAssign): @@ -237,6 +238,9 @@ def parse_statement(curr_node, expr): new_node.add_unparsed_expression(expr) link_underlying_nodes(curr_node, new_node) + curr_node = new_node + + # elif isinstance(expr, Assign): # new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) # new_node.add_unparsed_expression(expr.target) @@ -246,6 +250,7 @@ def parse_statement(curr_node, expr): elif isinstance(expr, For): node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) + link_underlying_nodes(curr_node, node_startLoop) local_var = LocalVariable() local_var.set_function(self._function) @@ -254,19 +259,22 @@ def parse_statement(curr_node, expr): counter_var = AnnAssign(expr.target.src, expr.target.node_id, target=Name("-1:-1:-1", -1, "counter_var"), annotation=Name("-1:-1:-1", -1, "uint256"), value=Int("-1:-1:-1", -1, 0)) local_var_parser = LocalVariableVyper(local_var, counter_var) self._add_local_variable(local_var_parser) - new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + counter_node = self._new_node(NodeType.VARIABLE, expr.src, scope) local_var.initialized = True - new_node.add_unparsed_expression(counter_var.value) - new_node.underlying_node.add_variable_declaration(local_var) + counter_node.add_unparsed_expression(counter_var.value) + counter_node.underlying_node.add_variable_declaration(local_var) + link_underlying_nodes(node_startLoop, counter_node) + + node_condition = None if isinstance(expr.iter, (Attribute,Name)): # HACK # The loop variable is not annotated so we infer its type by looking at the type of the iterator - if isinstance(expr.iter, Attribute): # state + if isinstance(expr.iter, Attribute): # state variable iter_expr = expr.iter loop_iterator = list(filter(lambda x: x._variable.name == iter_expr.attr, self._contract_parser._variables_parser))[0] - else: # local + else: # local variable iter_expr = expr.iter loop_iterator = list(filter(lambda x: x._variable.name == iter_expr.id, self._local_variables_parser))[0] @@ -275,7 +283,7 @@ def parse_statement(curr_node, expr): node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) node_condition.add_unparsed_expression(cond_expr) - # TODO this should go in the body of the loop: expr.body.insert(0, ...) + if loop_iterator._elem_to_parse.value.id == "DynArray": loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[0] else: @@ -283,74 +291,99 @@ def parse_statement(curr_node, expr): value = Subscript("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, loop_iterator._variable.name), slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var"))) loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=loop_var_annotation, value=value) - local_var = LocalVariable() - local_var.set_function(self._function) - local_var.set_offset(expr.src, self._function.compilation_unit) - local_var_parser = LocalVariableVyper(local_var, loop_var) - self._add_local_variable(local_var_parser) - new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) - local_var.initialized = True - new_node.add_unparsed_expression(loop_var.value) - new_node.underlying_node.add_variable_declaration(local_var) - elif isinstance(expr.iter, Call): + elif isinstance(expr.iter, Call): # range range_val = expr.iter.args[0] cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=range_val) + node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) + node_condition.add_unparsed_expression(cond_expr) loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=Name("-1:-1:-1", -1, "uint256"), value=Name("-1:-1:-1", -1, "counter_var")) - local_var = LocalVariable() - local_var.set_function(self._function) - local_var.set_offset(expr.src, self._function.compilation_unit) - local_var_parser = LocalVariableVyper(local_var, loop_var) - self._add_local_variable(local_var_parser) - new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) - local_var.initialized = True - new_node.add_unparsed_expression(loop_var.value) - new_node.underlying_node.add_variable_declaration(local_var) + else: - print(expr) raise NotImplementedError - # assert False - node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) - - - - # link_underlying_nodes(node_startLoop, node_condition) + + # link + link_underlying_nodes(counter_node, node_condition) + + + # We update the index variable or range variable in the loop body + expr.body.insert(0, loop_var) + body_node = None + new_node = node_condition for stmt in expr.body: - parse_statement(curr_node, stmt) - - # link_underlying_nodes(curr_node, new_node) + body_node = parse_statement(new_node, stmt) + new_node = body_node + + node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) + + loop_increment = AugAssign("-1:-1:-1", -1, target=Name("-1:-1:-1", -1, "counter_var"), op="+=", value=Int("-1:-1:-1", -1, 1)) + node_increment = self._new_node(NodeType.EXPRESSION, expr.src, scope) + node_increment.add_unparsed_expression(loop_increment) + link_underlying_nodes(node_increment, node_condition) + + if body_node is not None: + link_underlying_nodes(body_node, node_increment) + + link_underlying_nodes(node_condition, node_endLoop) + + curr_node = node_endLoop elif isinstance(expr, Continue): pass elif isinstance(expr, Break): pass elif isinstance(expr, Return): - node_parser = self._new_node(NodeType.RETURN, expr.src, scope) + new_node = self._new_node(NodeType.RETURN, expr.src, scope) if expr.value is not None: - node_parser.add_unparsed_expression(expr.value) + new_node.add_unparsed_expression(expr.value) + + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - pass elif isinstance(expr, Assert): new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) new_node.add_unparsed_expression(expr) - + link_underlying_nodes(curr_node, new_node) + curr_node = new_node elif isinstance(expr, Log): new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) new_node.add_unparsed_expression(expr.value) - pass + + link_underlying_nodes(curr_node, new_node) + curr_node = new_node + elif isinstance(expr, If): - new_node = self._new_node(NodeType.IF, expr.test.src, scope) - new_node.add_unparsed_expression(expr.test) + condition_node = self._new_node(NodeType.IF, expr.test.src, scope) + condition_node.add_unparsed_expression(expr.test) + + endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) + true_node = None + new_node = condition_node for stmt in expr.body: - parse_statement(new_node, stmt) - + true_node = parse_statement(new_node, stmt) + new_node = true_node + # link_underlying_nodes(condition_node, true_node) + link_underlying_nodes(true_node, endIf_node) + + false_node = None + new_node = condition_node for stmt in expr.orelse: - parse_statement(new_node, stmt) + false_node = parse_statement(new_node, stmt) + new_node = false_node + + if false_node is not None: + # link_underlying_nodes(condition_node, false_node) + link_underlying_nodes(false_node, endIf_node) + + else: + link_underlying_nodes(condition_node, endIf_node) + + link_underlying_nodes(curr_node, condition_node) + curr_node = endIf_node - pass elif isinstance(expr, Expr): pass elif isinstance(expr, Pass): From 6bd52fac0edfa1fa406c563e3bb92335c14f13f6 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 15:34:25 -0500 Subject: [PATCH 078/169] more builtins --- slither/core/declarations/solidity_variables.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index 85844508eb..ec8321ee5f 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -108,9 +108,10 @@ "max()":[], "shift()":[], "abs()":[], - "raw_call()":[], + "raw_call()":["bool", "bytes32"], "_abi_encode()":[], "slice()":[], + "uint2str()":["string"], } From 5443132c2b3151c39d0e602fa24af0a607cee38a Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 16:20:21 -0500 Subject: [PATCH 079/169] fix source mapping, set source code and source unit --- slither/vyper_parsing/vyper_compilation_unit.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index f8a2ca216d..f43d85d00b 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -1,12 +1,12 @@ from typing import Dict +import os +import re from dataclasses import dataclass, field from slither.core.declarations import Contract from slither.core.compilation_unit import SlitherCompilationUnit from slither.vyper_parsing.declarations.contract import ContractVyper from slither.analyses.data_dependency.data_dependency import compute_dependency -from slither.vyper_parsing.declarations.struct import Structure -from slither.core.variables.state_variable import StateVariable - +from slither.vyper_parsing.ast.types import Module from slither.exceptions import SlitherException @@ -18,7 +18,16 @@ class VyperCompilationUnit: _underlying_contract_to_parser: Dict[Contract, ContractVyper] = field(default_factory=dict) _contracts_by_id: Dict[int, Contract] = field(default_factory=dict) - def parse_module(self, data: Dict, filename: str): + def parse_module(self, data: Module, filename: str): + + sourceUnit_candidates = re.findall("[0-9]*:[0-9]*:([0-9]*)", data.src) + assert len(sourceUnit_candidates) == 1, "Source unit not found" + sourceUnit = int(sourceUnit_candidates[0]) + + self._compilation_unit.source_units[sourceUnit] = filename + if os.path.isfile(filename) and not filename in self._compilation_unit.core.source_code: + self._compilation_unit.core.add_source_code(filename) + scope = self._compilation_unit.get_scope(filename) contract = Contract(self._compilation_unit, scope) contract_parser = ContractVyper(self, contract, data) From a61ca34226cc14148a6eb647283f818e02f26acd Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 16:45:01 -0500 Subject: [PATCH 080/169] parse bool op symbol --- slither/vyper_parsing/ast/ast.py | 4 +++- slither/vyper_parsing/expressions/expression_parsing.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index ca748954a1..5c7eb24897 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -316,10 +316,12 @@ def parse_aug_assign(raw: Dict) -> AugAssign: def parse_unsupported(raw: Dict) -> ASTNode: raise ParsingError("unsupported Vyper node", raw["ast_type"], raw.keys(), raw) +bool_op_ast_type_to_op_symbol = {"And": "&&", "Or": "||"} def parse_bool_op(raw: Dict) -> BoolOp: + op_str = bool_op_ast_type_to_op_symbol[raw["op"]["ast_type"]] return BoolOp( - op=raw["op"], values=[parse(x) for x in raw["values"]], **_extract_base_props(raw) + op=op_str, values=[parse(x) for x in raw["values"]], **_extract_base_props(raw) ) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 8ce7577326..a84eacb2f5 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -583,8 +583,8 @@ def get_type_str(x): lhs = parse_expression(expression.values[0], caller_context) rhs = parse_expression(expression.values[1], caller_context) - # op = BinaryOperationType.get_type(expression.op) TODO update BoolOp AST - parsed_expr = BinaryOperation(lhs, rhs,BinaryOperationType.ANDAND) + op = BinaryOperationType.get_type(expression.op) + parsed_expr = BinaryOperation(lhs, op) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr From 4b07cbbc56ce0483cd5047ef489b19a7897fff37 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 20:07:57 -0500 Subject: [PATCH 081/169] add support for self.balance --- slither/core/declarations/solidity_variables.py | 1 + slither/vyper_parsing/expressions/expression_parsing.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index ec8321ee5f..03fd81f041 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -39,6 +39,7 @@ # Vyper "chain.id": "uint256", "block.prevhash": "bytes32", + "self.balance": "uint256", } diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index a84eacb2f5..441c078eeb 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -368,7 +368,7 @@ def get_type_str(x): member_name = expression.attr if isinstance(expression.value, Name): - if expression.value.id == "self": + if expression.value.id == "self" and member_name != "balance": var, was_created = find_variable(member_name, caller_context) # TODO replace with self if was_created: From db88cd5855b1dd7e97b9ea6374be9942c4723403 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 20:15:17 -0500 Subject: [PATCH 082/169] fmt --- slither/vyper_parsing/ast/ast.py | 57 ++++- slither/vyper_parsing/ast/types.py | 2 - .../vyper_parsing/declarations/contract.py | 231 +++++++++++++++++- .../vyper_parsing/declarations/function.py | 130 +++++++--- .../expressions/expression_parsing.py | 174 +++++++++---- .../expressions/find_variable.py | 9 +- slither/vyper_parsing/type_parsing.py | 10 +- .../vyper_parsing/variables/local_variable.py | 1 - .../vyper_parsing/variables/state_variable.py | 5 +- .../vyper_parsing/vyper_compilation_unit.py | 6 +- 10 files changed, 511 insertions(+), 114 deletions(-) diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index 5c7eb24897..228805c895 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -197,26 +197,56 @@ def parse_raise(raw: Dict) -> Raise: def parse_expr(raw: Dict) -> Expr: return Expr(value=parse(raw["value"]), **_extract_base_props(raw)) + # This is done for convenience so we can call `UnaryOperationType.get_type` during expression parsing. unop_ast_type_to_op_symbol = {"Not": "!", "USub": "-"} + def parse_unary_op(raw: Dict) -> UnaryOp: unop_str = unop_ast_type_to_op_symbol[raw["op"]["ast_type"]] return UnaryOp(op=unop_str, operand=parse(raw["operand"]), **_extract_base_props(raw)) + # This is done for convenience so we can call `BinaryOperationType.get_type` during expression parsing. -binop_ast_type_to_op_symbol = {"Add": "+", "Mult": "*", "Sub": "-", "Div": "/", "Pow": "**", "Mod": "%", "BitAnd": "&", "BitOr": "|", "Shr": "<<", "Shl": ">>", "NotEq": "!=", "Eq": "==", "LtE": "<=", "GtE": ">=", "Lt": "<", "Gt": ">", "In": "In", "NotIn": "NotIn"} +binop_ast_type_to_op_symbol = { + "Add": "+", + "Mult": "*", + "Sub": "-", + "Div": "/", + "Pow": "**", + "Mod": "%", + "BitAnd": "&", + "BitOr": "|", + "Shr": "<<", + "Shl": ">>", + "NotEq": "!=", + "Eq": "==", + "LtE": "<=", + "GtE": ">=", + "Lt": "<", + "Gt": ">", + "In": "In", + "NotIn": "NotIn", +} + def parse_bin_op(raw: Dict) -> BinOp: arith_op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] return BinOp( - left=parse(raw["left"]), op=arith_op_str, right=parse(raw["right"]), **_extract_base_props(raw) + left=parse(raw["left"]), + op=arith_op_str, + right=parse(raw["right"]), + **_extract_base_props(raw), ) + def parse_compare(raw: Dict) -> Compare: logical_op_str = binop_ast_type_to_op_symbol[raw["op"]["ast_type"]] return Compare( - left=parse(raw["left"]), op=logical_op_str, right=parse(raw["right"]), **_extract_base_props(raw) + left=parse(raw["left"]), + op=logical_op_str, + right=parse(raw["right"]), + **_extract_base_props(raw), ) @@ -301,7 +331,20 @@ def parse_enum_def(raw: Dict) -> EnumDef: return EnumDef(name=raw["name"], body=nodes_parsed, **_extract_base_props(raw)) -aug_assign_ast_type_to_op_symbol = {"Add": "+=", "Mult": "*=", "Sub": "-=", "Div": "-=", "Pow": "**=", "Mod": "%=", "BitAnd": "&=", "BitOr": "|=", "Shr": "<<=", "Shl": ">>="} + +aug_assign_ast_type_to_op_symbol = { + "Add": "+=", + "Mult": "*=", + "Sub": "-=", + "Div": "-=", + "Pow": "**=", + "Mod": "%=", + "BitAnd": "&=", + "BitOr": "|=", + "Shr": "<<=", + "Shl": ">>=", +} + def parse_aug_assign(raw: Dict) -> AugAssign: op_str = aug_assign_ast_type_to_op_symbol[raw["op"]["ast_type"]] @@ -316,13 +359,13 @@ def parse_aug_assign(raw: Dict) -> AugAssign: def parse_unsupported(raw: Dict) -> ASTNode: raise ParsingError("unsupported Vyper node", raw["ast_type"], raw.keys(), raw) + bool_op_ast_type_to_op_symbol = {"And": "&&", "Or": "||"} + def parse_bool_op(raw: Dict) -> BoolOp: op_str = bool_op_ast_type_to_op_symbol[raw["op"]["ast_type"]] - return BoolOp( - op=op_str, values=[parse(x) for x in raw["values"]], **_extract_base_props(raw) - ) + return BoolOp(op=op_str, values=[parse(x) for x in raw["values"]], **_extract_base_props(raw)) def parse(raw: Dict) -> ASTNode: diff --git a/slither/vyper_parsing/ast/types.py b/slither/vyper_parsing/ast/types.py index 619df4f147..e07e6d2132 100644 --- a/slither/vyper_parsing/ast/types.py +++ b/slither/vyper_parsing/ast/types.py @@ -184,8 +184,6 @@ class UnaryOp(ASTNode): operand: ASTNode - - @dataclass class BinOp(ASTNode): left: ASTNode diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index fde720340a..ed61bda1b7 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -180,7 +180,236 @@ def _parse_contract_items(self) -> None: ), ], ), - "ERC20": InterfaceDef(src="-1:-1:-1", node_id=1, name='ERC20', body=[FunctionDef(src="-1:-1:-1", node_id=2, doc_string=None, name='totalSupply', args=Arguments(src="-1:-1:-1", node_id=3, args=[], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=7, id='uint256'), body=[Expr(src="-1:-1:-1", node_id=4, value=Name(src="-1:-1:-1", node_id=5, id='view'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=9, doc_string=None, name='balanceOf', args=Arguments(src="-1:-1:-1", node_id=10, args=[Arg(src="-1:-1:-1", node_id=11, arg='_owner', annotation=Name(src="-1:-1:-1", node_id=12, id='address'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=17, id='uint256'), body=[Expr(src="-1:-1:-1", node_id=14, value=Name(src="-1:-1:-1", node_id=15, id='view'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=19, doc_string=None, name='allowance', args=Arguments(src="-1:-1:-1", node_id=20, args=[Arg(src="-1:-1:-1", node_id=21, arg='_owner', annotation=Name(src="-1:-1:-1", node_id=22, id='address')), Arg(src="-1:-1:-1", node_id=24, arg='_spender', annotation=Name(src="-1:-1:-1", node_id=25, id='address'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=30, id='uint256'), body=[Expr(src="-1:-1:-1", node_id=27, value=Name(src="-1:-1:-1", node_id=28, id='view'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=32, doc_string=None, name='transfer', args=Arguments(src="-1:-1:-1", node_id=33, args=[Arg(src="-1:-1:-1", node_id=34, arg='_to', annotation=Name(src="-1:-1:-1", node_id=35, id='address')), Arg(src="-1:-1:-1", node_id=37, arg='_value', annotation=Name(src="-1:-1:-1", node_id=38, id='uint256'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=43, id='bool'), body=[Expr(src="-1:-1:-1", node_id=40, value=Name(src="-1:-1:-1", node_id=41, id='nonpayable'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=45, doc_string=None, name='transferFrom', args=Arguments(src="-1:-1:-1", node_id=46, args=[Arg(src="-1:-1:-1", node_id=47, arg='_from', annotation=Name(src="-1:-1:-1", node_id=48, id='address')), Arg(src="-1:-1:-1", node_id=50, arg='_to', annotation=Name(src="-1:-1:-1", node_id=51, id='address')), Arg(src="-1:-1:-1", node_id=53, arg='_value', annotation=Name(src="-1:-1:-1", node_id=54, id='uint256'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=59, id='bool'), body=[Expr(src="-1:-1:-1", node_id=56, value=Name(src="-1:-1:-1", node_id=57, id='nonpayable'))], decorators=[], pos=None), FunctionDef(src="-1:-1:-1", node_id=61, doc_string=None, name='approve', args=Arguments(src="-1:-1:-1", node_id=62, args=[Arg(src="-1:-1:-1", node_id=63, arg='_spender', annotation=Name(src="-1:-1:-1", node_id=64, id='address')), Arg(src="-1:-1:-1", node_id=66, arg='_value', annotation=Name(src="-1:-1:-1", node_id=67, id='uint256'))], default=None, defaults=[]), returns=Name(src="-1:-1:-1", node_id=72, id='bool'), body=[Expr(src="-1:-1:-1", node_id=69, value=Name(src="-1:-1:-1", node_id=70, id='nonpayable'))], decorators=[], pos=None)]), + "ERC20": InterfaceDef( + src="-1:-1:-1", + node_id=1, + name="ERC20", + body=[ + FunctionDef( + src="-1:-1:-1", + node_id=2, + doc_string=None, + name="totalSupply", + args=Arguments( + src="-1:-1:-1", + node_id=3, + args=[], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=7, id="uint256"), + body=[ + Expr( + src="-1:-1:-1", + node_id=4, + value=Name(src="-1:-1:-1", node_id=5, id="view"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=9, + doc_string=None, + name="balanceOf", + args=Arguments( + src="-1:-1:-1", + node_id=10, + args=[ + Arg( + src="-1:-1:-1", + node_id=11, + arg="_owner", + annotation=Name( + src="-1:-1:-1", node_id=12, id="address" + ), + ) + ], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=17, id="uint256"), + body=[ + Expr( + src="-1:-1:-1", + node_id=14, + value=Name(src="-1:-1:-1", node_id=15, id="view"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=19, + doc_string=None, + name="allowance", + args=Arguments( + src="-1:-1:-1", + node_id=20, + args=[ + Arg( + src="-1:-1:-1", + node_id=21, + arg="_owner", + annotation=Name( + src="-1:-1:-1", node_id=22, id="address" + ), + ), + Arg( + src="-1:-1:-1", + node_id=24, + arg="_spender", + annotation=Name( + src="-1:-1:-1", node_id=25, id="address" + ), + ), + ], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=30, id="uint256"), + body=[ + Expr( + src="-1:-1:-1", + node_id=27, + value=Name(src="-1:-1:-1", node_id=28, id="view"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=32, + doc_string=None, + name="transfer", + args=Arguments( + src="-1:-1:-1", + node_id=33, + args=[ + Arg( + src="-1:-1:-1", + node_id=34, + arg="_to", + annotation=Name( + src="-1:-1:-1", node_id=35, id="address" + ), + ), + Arg( + src="-1:-1:-1", + node_id=37, + arg="_value", + annotation=Name( + src="-1:-1:-1", node_id=38, id="uint256" + ), + ), + ], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=43, id="bool"), + body=[ + Expr( + src="-1:-1:-1", + node_id=40, + value=Name(src="-1:-1:-1", node_id=41, id="nonpayable"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=45, + doc_string=None, + name="transferFrom", + args=Arguments( + src="-1:-1:-1", + node_id=46, + args=[ + Arg( + src="-1:-1:-1", + node_id=47, + arg="_from", + annotation=Name( + src="-1:-1:-1", node_id=48, id="address" + ), + ), + Arg( + src="-1:-1:-1", + node_id=50, + arg="_to", + annotation=Name( + src="-1:-1:-1", node_id=51, id="address" + ), + ), + Arg( + src="-1:-1:-1", + node_id=53, + arg="_value", + annotation=Name( + src="-1:-1:-1", node_id=54, id="uint256" + ), + ), + ], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=59, id="bool"), + body=[ + Expr( + src="-1:-1:-1", + node_id=56, + value=Name(src="-1:-1:-1", node_id=57, id="nonpayable"), + ) + ], + decorators=[], + pos=None, + ), + FunctionDef( + src="-1:-1:-1", + node_id=61, + doc_string=None, + name="approve", + args=Arguments( + src="-1:-1:-1", + node_id=62, + args=[ + Arg( + src="-1:-1:-1", + node_id=63, + arg="_spender", + annotation=Name( + src="-1:-1:-1", node_id=64, id="address" + ), + ), + Arg( + src="-1:-1:-1", + node_id=66, + arg="_value", + annotation=Name( + src="-1:-1:-1", node_id=67, id="uint256" + ), + ), + ], + default=None, + defaults=[], + ), + returns=Name(src="-1:-1:-1", node_id=72, id="bool"), + body=[ + Expr( + src="-1:-1:-1", + node_id=69, + value=Name(src="-1:-1:-1", node_id=70, id="nonpayable"), + ) + ], + decorators=[], + pos=None, + ), + ], + ), "ERC165": [], "ERC721": [], "ERC4626": [], diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index db32ac6adb..9e57b6c66d 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -180,8 +180,6 @@ def analyze_content(self) -> None: for node_parser in self._node_to_NodeVyper.values(): node_parser.analyze_expressions(self._function) - - # endregion ################################################################################### ################################################################################### @@ -206,7 +204,6 @@ def _new_node( def _parse_cfg(self, cfg: Dict) -> None: - entry_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) self._function.entry_point = entry_node.underlying_node scope = Scope(True, False, self.underlying_function) @@ -215,6 +212,7 @@ def _parse_cfg(self, cfg: Dict) -> None: self._function.is_empty = False curr_node = entry_node for expr in cfg: + def parse_statement(curr_node, expr): if isinstance(expr, AnnAssign): local_var = LocalVariable() @@ -240,7 +238,6 @@ def parse_statement(curr_node, expr): curr_node = new_node - # elif isinstance(expr, Assign): # new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) # new_node.add_unparsed_expression(expr.target) @@ -256,7 +253,13 @@ def parse_statement(curr_node, expr): local_var.set_function(self._function) local_var.set_offset(expr.src, self._function.compilation_unit) - counter_var = AnnAssign(expr.target.src, expr.target.node_id, target=Name("-1:-1:-1", -1, "counter_var"), annotation=Name("-1:-1:-1", -1, "uint256"), value=Int("-1:-1:-1", -1, 0)) + counter_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=Name("-1:-1:-1", -1, "counter_var"), + annotation=Name("-1:-1:-1", -1, "uint256"), + value=Int("-1:-1:-1", -1, 0), + ) local_var_parser = LocalVariableVyper(local_var, counter_var) self._add_local_variable(local_var_parser) counter_node = self._new_node(NodeType.VARIABLE, expr.src, scope) @@ -267,45 +270,93 @@ def parse_statement(curr_node, expr): link_underlying_nodes(node_startLoop, counter_node) node_condition = None - if isinstance(expr.iter, (Attribute,Name)): - # HACK + if isinstance(expr.iter, (Attribute, Name)): + # HACK # The loop variable is not annotated so we infer its type by looking at the type of the iterator - if isinstance(expr.iter, Attribute): # state variable + if isinstance(expr.iter, Attribute): # state variable iter_expr = expr.iter - loop_iterator = list(filter(lambda x: x._variable.name == iter_expr.attr, self._contract_parser._variables_parser))[0] - - else: # local variable + loop_iterator = list( + filter( + lambda x: x._variable.name == iter_expr.attr, + self._contract_parser._variables_parser, + ) + )[0] + + else: # local variable iter_expr = expr.iter - loop_iterator = list(filter(lambda x: x._variable.name == iter_expr.id, self._local_variables_parser))[0] + loop_iterator = list( + filter( + lambda x: x._variable.name == iter_expr.id, + self._local_variables_parser, + ) + )[0] # TODO use expr.src instead of -1:-1:1? - cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=Call("-1:-1:-1", -1, func=Name("-1:-1:-1", -1, "len"), args=[iter_expr], keywords=[], keyword=None)) + cond_expr = Compare( + "-1:-1:-1", + -1, + left=Name("-1:-1:-1", -1, "counter_var"), + op="<=", + right=Call( + "-1:-1:-1", + -1, + func=Name("-1:-1:-1", -1, "len"), + args=[iter_expr], + keywords=[], + keyword=None, + ), + ) node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) node_condition.add_unparsed_expression(cond_expr) - if loop_iterator._elem_to_parse.value.id == "DynArray": - loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[0] + loop_var_annotation = ( + loop_iterator._elem_to_parse.slice.value.elements[0] + ) else: loop_var_annotation = loop_iterator._elem_to_parse.value - value = Subscript("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, loop_iterator._variable.name), slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var"))) - loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=loop_var_annotation, value=value) - - elif isinstance(expr.iter, Call): # range + value = Subscript( + "-1:-1:-1", + -1, + value=Name("-1:-1:-1", -1, loop_iterator._variable.name), + slice=Index( + "-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var") + ), + ) + loop_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=expr.target, + annotation=loop_var_annotation, + value=value, + ) + + elif isinstance(expr.iter, Call): # range range_val = expr.iter.args[0] - cond_expr = Compare("-1:-1:-1", -1, left=Name("-1:-1:-1", -1, "counter_var"), op="<=", right=range_val) + cond_expr = Compare( + "-1:-1:-1", + -1, + left=Name("-1:-1:-1", -1, "counter_var"), + op="<=", + right=range_val, + ) node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) node_condition.add_unparsed_expression(cond_expr) - loop_var = AnnAssign(expr.target.src, expr.target.node_id, target=expr.target, annotation=Name("-1:-1:-1", -1, "uint256"), value=Name("-1:-1:-1", -1, "counter_var")) - + loop_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=expr.target, + annotation=Name("-1:-1:-1", -1, "uint256"), + value=Name("-1:-1:-1", -1, "counter_var"), + ) + else: raise NotImplementedError - - # link + + # link link_underlying_nodes(counter_node, node_condition) - # We update the index variable or range variable in the loop body expr.body.insert(0, loop_var) body_node = None @@ -313,17 +364,23 @@ def parse_statement(curr_node, expr): for stmt in expr.body: body_node = parse_statement(new_node, stmt) new_node = body_node - + node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) - - loop_increment = AugAssign("-1:-1:-1", -1, target=Name("-1:-1:-1", -1, "counter_var"), op="+=", value=Int("-1:-1:-1", -1, 1)) + + loop_increment = AugAssign( + "-1:-1:-1", + -1, + target=Name("-1:-1:-1", -1, "counter_var"), + op="+=", + value=Int("-1:-1:-1", -1, 1), + ) node_increment = self._new_node(NodeType.EXPRESSION, expr.src, scope) node_increment.add_unparsed_expression(loop_increment) link_underlying_nodes(node_increment, node_condition) - + if body_node is not None: link_underlying_nodes(body_node, node_increment) - + link_underlying_nodes(node_condition, node_endLoop) curr_node = node_endLoop @@ -357,8 +414,8 @@ def parse_statement(curr_node, expr): elif isinstance(expr, If): condition_node = self._new_node(NodeType.IF, expr.test.src, scope) condition_node.add_unparsed_expression(expr.test) - - endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) + + endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) true_node = None new_node = condition_node @@ -367,20 +424,20 @@ def parse_statement(curr_node, expr): new_node = true_node # link_underlying_nodes(condition_node, true_node) link_underlying_nodes(true_node, endIf_node) - + false_node = None new_node = condition_node for stmt in expr.orelse: false_node = parse_statement(new_node, stmt) new_node = false_node - + if false_node is not None: # link_underlying_nodes(condition_node, false_node) link_underlying_nodes(false_node, endIf_node) else: link_underlying_nodes(condition_node, endIf_node) - + link_underlying_nodes(curr_node, condition_node) curr_node = endIf_node @@ -396,6 +453,7 @@ def parse_statement(curr_node, expr): print(f"isinstance(expr, {expr.__class__.__name__})") assert False return curr_node + curr_node = parse_statement(curr_node, expr) # self._parse_block(cfg, node, self.underlying_function) else: @@ -437,7 +495,7 @@ def _parse_returns(self, returns: Union[Name, Tuple, Subscript]): print(returns) self._function.returns_src().set_offset(returns.src, self._function.compilation_unit) # Only the type of the arg is given, not a name. We create an an `Arg` with an empty name - # so that the function has the correct return type in its signature but doesn't clash with + # so that the function has the correct return type in its signature but doesn't clash with # other identifiers during name resolution (`find_variable`). if isinstance(returns, (Name, Subscript)): local_var = self._add_param(Arg(returns.src, returns.node_id, "", annotation=returns)) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 441c078eeb..326fe2c754 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -254,7 +254,28 @@ def _user_defined_op_call( from collections import deque -from slither.vyper_parsing.ast.types import Int, Call, Attribute, Name, Tuple, Hex, BinOp, Str, Assert, Compare, UnaryOp, Subscript, NameConstant, VyDict, Bytes, BoolOp, Assign, AugAssign, VyList +from slither.vyper_parsing.ast.types import ( + Int, + Call, + Attribute, + Name, + Tuple, + Hex, + BinOp, + Str, + Assert, + Compare, + UnaryOp, + Subscript, + NameConstant, + VyDict, + Bytes, + BoolOp, + Assign, + AugAssign, + VyList, +) + def parse_expression(expression: Dict, caller_context) -> "Expression": print("parse_expression") @@ -265,18 +286,18 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": literal = Literal(str(expression.value), ElementaryType("uint256")) literal.set_offset(expression.src, caller_context.compilation_unit) return literal - + if isinstance(expression, Hex): # TODO this is an implicit conversion and could potentially be bytes20 or other? - literal = Literal(str(expression.value), ElementaryType("address")) + literal = Literal(str(expression.value), ElementaryType("address")) literal.set_offset(expression.src, caller_context.compilation_unit) return literal - + if isinstance(expression, Str): - literal = Literal(str(expression.value), ElementaryType("string")) + literal = Literal(str(expression.value), ElementaryType("string")) literal.set_offset(expression.src, caller_context.compilation_unit) return literal - + if isinstance(expression, Bytes): literal = Literal(str(expression.value), ElementaryType("bytes")) literal.set_offset(expression.src, caller_context.compilation_unit) @@ -287,7 +308,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": literal = Literal(str(expression.value), ElementaryType("bool")) literal.set_offset(expression.src, caller_context.compilation_unit) return literal - + if isinstance(expression, Call): called = parse_expression(expression.func, caller_context) @@ -297,29 +318,44 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": parsed_expr = CallExpression(called, [], str(type_to)) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + elif called.value.name == "convert()": - arg = parse_expression(expression.args[0], caller_context) + arg = parse_expression(expression.args[0], caller_context) type_to = parse_type(expression.args[1], caller_context) parsed_expr = TypeConversion(arg, type_to) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - elif called.value.name== "min_value()": + elif called.value.name == "min_value()": type_to = parse_type(expression.args[0], caller_context) - member_type = str(type_to) + member_type = str(type_to) # TODO return Literal - parsed_expr = MemberAccess("min", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + parsed_expr = MemberAccess( + "min", + member_type, + CallExpression( + Identifier(SolidityFunction("type()")), + [ElementaryTypeNameExpression(type_to)], + member_type, + ), + ) return parsed_expr - - elif called.value.name== "max_value()": + + elif called.value.name == "max_value()": type_to = parse_type(expression.args[0], caller_context) - member_type = str(type_to) + member_type = str(type_to) # TODO return Literal - parsed_expr = MemberAccess("max", member_type, CallExpression(Identifier(SolidityFunction("type()")), [ElementaryTypeNameExpression(type_to)], member_type)) + parsed_expr = MemberAccess( + "max", + member_type, + CallExpression( + Identifier(SolidityFunction("type()")), + [ElementaryTypeNameExpression(type_to)], + member_type, + ), + ) return parsed_expr - if expression.args and isinstance(expression.args[0], VyDict): arguments = [] for val in expression.args[0].values: @@ -342,7 +378,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": parsed_expr = TypeConversion(arguments[0], type_to) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + else: rets = ["tuple()"] @@ -352,23 +388,28 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": rets = [called.type] else: rets = ["tuple()"] - + def get_type_str(x): if isinstance(x, str): return x return str(x.type) + print(rets) - type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" + type_str = ( + get_type_str(rets[0]) + if len(rets) == 1 + else f"tuple({','.join(map(get_type_str, rets))})" + ) parsed_expr = CallExpression(called, arguments, type_str) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, Attribute): member_name = expression.attr if isinstance(expression.value, Name): - if expression.value.id == "self" and member_name != "balance": + if expression.value.id == "self" and member_name != "balance": var, was_created = find_variable(member_name, caller_context) # TODO replace with self if was_created: @@ -376,7 +417,7 @@ def get_type_str(x): parsed_expr = SuperIdentifier(var) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + expr = parse_expression(expression.value, caller_context) # TODO this is ambiguous because it could be a type conversion of an interface or a member access if expression.attr == "address": @@ -385,7 +426,7 @@ def get_type_str(x): return parsed_expr member_access = MemberAccess(member_name, None, expr) - + if str(member_access) in SOLIDITY_VARIABLES_COMPOSED: parsed_expr = Identifier(SolidityVariableComposed(str(member_access))) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) @@ -395,23 +436,28 @@ def get_type_str(x): expr = parse_expression(expression.value, caller_context) member_name_ret_type = None # (recover_type_1) This may be a call to an interface and we don't have the return types, - # so we see if there's a function identifier with `member_name` and propagate the type to + # so we see if there's a function identifier with `member_name` and propagate the type to # its enclosing `CallExpression` # TODO this is using the wrong caller_context and needs to be interface instead of self namespace print(expr) print(expr.__class__.__name__) if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType): - # try: + # try: var, was_created = find_variable(member_name, expr.type.type) if isinstance(var, Function): rets = var.returns + def get_type_str(x): if isinstance(x, str): return x return str(x.type) - type_str = get_type_str(rets[0]) if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" + type_str = ( + get_type_str(rets[0]) + if len(rets) == 1 + else f"tuple({','.join(map(get_type_str, rets))})" + ) member_name_ret_type = type_str # except: # pass @@ -428,14 +474,14 @@ def get_type_str(x): parsed_expr = Identifier(var) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, Assign): lhs = parse_expression(expression.target, caller_context) rhs = parse_expression(expression.value, caller_context) parsed_expr = AssignmentOperation(lhs, rhs, AssignmentOperationType.ASSIGN, None) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, AugAssign): lhs = parse_expression(expression.target, caller_context) rhs = parse_expression(expression.value, caller_context) @@ -450,10 +496,12 @@ def get_type_str(x): parsed_expr = TupleExpression(tuple_vars) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, UnaryOp): operand = parse_expression(expression.operand, caller_context) - op = UnaryOperationType.get_type(expression.op, isprefix=True) #TODO does vyper have postfix? + op = UnaryOperationType.get_type( + expression.op, isprefix=True + ) # TODO does vyper have postfix? parsed_expr = UnaryOperation(operand, op) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) @@ -476,9 +524,17 @@ def get_type_str(x): # We assume left operand in membership comparison cannot be Array type conditions = deque() if isinstance(expression.right, VyList): - inner_op = BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") - outer_op = BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") - + inner_op = ( + BinaryOperationType.get_type("!=") + if expression.op == "NotIn" + else BinaryOperationType.get_type("==") + ) + outer_op = ( + BinaryOperationType.get_type("&&") + if expression.op == "NotIn" + else BinaryOperationType.get_type("||") + ) + for elem in expression.right.elements: elem_expr = parse_expression(elem, caller_context) print("elem", repr(elem_expr)) @@ -491,15 +547,27 @@ def get_type_str(x): print(rhs.__class__.__name__) if isinstance(rhs, Identifier): if isinstance(rhs.value.type, ArrayType): - inner_op = BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") - outer_op = BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") - + inner_op = ( + BinaryOperationType.get_type("!=") + if expression.op == "NotIn" + else BinaryOperationType.get_type("==") + ) + outer_op = ( + BinaryOperationType.get_type("&&") + if expression.op == "NotIn" + else BinaryOperationType.get_type("||") + ) + enum_members = rhs.value.type.length_value.value for i in range(enum_members): elem_expr = IndexAccess(rhs, Literal(str(i), ElementaryType("uint256"))) - elem_expr.set_offset(rhs.source_mapping, caller_context.compilation_unit) + elem_expr.set_offset( + rhs.source_mapping, caller_context.compilation_unit + ) parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) - parsed_expr.set_offset(lhs.source_mapping, caller_context.compilation_unit) + parsed_expr.set_offset( + lhs.source_mapping, caller_context.compilation_unit + ) conditions.append(parsed_expr) # elif isinstance(rhs.value.type, UserDefinedType): @@ -507,8 +575,12 @@ def get_type_str(x): assert False else: # This is an indexaccess like hashmap[address, Roles] - inner_op = BinaryOperationType.get_type("|") #if expression.op == "NotIn" else BinaryOperationType.get_type("==") - outer_op = BinaryOperationType.get_type("&") #if expression.op == "NotIn" else BinaryOperationType.get_type("||") + inner_op = BinaryOperationType.get_type( + "|" + ) # if expression.op == "NotIn" else BinaryOperationType.get_type("==") + outer_op = BinaryOperationType.get_type( + "&" + ) # if expression.op == "NotIn" else BinaryOperationType.get_type("||") # x, _ = find_variable(expression.right.value.attr, caller_context) # print(x) @@ -520,7 +592,10 @@ def get_type_str(x): enum_members = rhs.expression_left.value.type.type_to.type.values # for each value, create a literal with value = 2 ^ n (0 indexed) # and then translate to bitmasking - enum_values = [Literal(str(2 ** n), ElementaryType("uint256")) for n in range(len(enum_members))] + enum_values = [ + Literal(str(2**n), ElementaryType("uint256")) + for n in range(len(enum_members)) + ] inner_lhs = enum_values[0] for expr in enum_values[1:]: inner_lhs = BinaryOperation(inner_lhs, expr, inner_op) @@ -530,8 +605,6 @@ def get_type_str(x): parsed_expr.set_offset(lhs.source_mapping, caller_context.compilation_unit) return parsed_expr - - while len(conditions) > 1: lhs = conditions.pop() rhs = conditions.pop() @@ -543,7 +616,7 @@ def get_type_str(x): else: rhs = parse_expression(expression.right, caller_context) op = BinaryOperationType.get_type(expression.op) - + parsed_expr = BinaryOperation(lhs, rhs, op) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr @@ -556,7 +629,7 @@ def get_type_str(x): parsed_expr = BinaryOperation(lhs, rhs, op) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, Assert): # Treat assert the same as a Solidity `require`. # TODO rename from `SolidityFunction` to `Builtin`? @@ -566,19 +639,22 @@ def get_type_str(x): args = [parse_expression(expression.test, caller_context)] else: func = SolidityFunction("require(bool,string)") - args = [parse_expression(expression.test, caller_context), parse_expression(expression.msg, caller_context)] + args = [ + parse_expression(expression.test, caller_context), + parse_expression(expression.msg, caller_context), + ] parsed_expr = CallExpression(Identifier(func), args, type_str) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, Subscript): left_expression = parse_expression(expression.value, caller_context) right_expression = parse_expression(expression.slice.value, caller_context) parsed_expr = IndexAccess(left_expression, right_expression) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - + if isinstance(expression, BoolOp): lhs = parse_expression(expression.values[0], caller_context) rhs = parse_expression(expression.values[1], caller_context) diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index b75b688db9..1c6058c1a1 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -36,7 +36,6 @@ # CallerContext =Union["ContractSolc", "FunctionSolc", "CustomErrorSolc", "StructureTopLevelSolc"] - def _find_variable_in_function_parser( var_name: str, function_parser: Optional["FunctionSolc"], @@ -51,8 +50,6 @@ def _find_variable_in_function_parser( return None - - def _find_in_contract( var_name: str, contract: Optional[Contract], @@ -67,8 +64,6 @@ def _find_in_contract( if var_name in contract_variables: return contract_variables[var_name] - - functions = {f.name: f for f in contract.functions if not f.is_shadowed} # print(functions) if var_name in functions: @@ -106,7 +101,6 @@ def _find_in_contract( if var_name in enums: return enums[var_name] - return None @@ -157,6 +151,7 @@ def find_variable( # structure/enums cannot be shadowed from slither.vyper_parsing.declarations.contract import ContractVyper from slither.vyper_parsing.declarations.function import FunctionVyper + print("caller_context") print(caller_context) print(caller_context.__class__.__name__) @@ -208,5 +203,5 @@ def find_variable( print(next_context.events_as_dict) if f"{var_name}()" in next_context.events_as_dict: return next_context.events_as_dict[f"{var_name}()"], False - + raise VariableNotFound(f"Variable not found: {var_name} (context {caller_context})") diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index 15fc16df61..a7d83240ea 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -11,11 +11,12 @@ from slither.core.declarations.function_contract import FunctionContract + def parse_type(annotation: Union[Name, Subscript, Call], caller_context): from slither.vyper_parsing.expressions.expression_parsing import parse_expression if isinstance(caller_context, FunctionContract): - contract = caller_context.contract + contract = caller_context.contract else: contract = caller_context @@ -41,17 +42,16 @@ def parse_type(annotation: Union[Name, Subscript, Call], caller_context): elif isinstance(annotation.value, Subscript): type_ = parse_type(annotation.value, caller_context) - + elif isinstance(annotation.value, Name): # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression, so we grab the value. # Subscript(src='13:10:0', node_id=7, value=Name(src='13:6:0', node_id=8, id='String'), slice=Index(src='13:10:0', node_id=12, value=Int(src='20:2:0', node_id=10, value=64))) type_ = parse_type(annotation.value, caller_context) if annotation.value.id == "String": return type_ - + length = parse_expression(annotation.slice.value, caller_context) return ArrayType(type_, length) - elif isinstance(annotation, Call): return parse_type(annotation.args[0], caller_context) @@ -63,8 +63,6 @@ def parse_type(annotation: Union[Name, Subscript, Call], caller_context): if lname in ElementaryTypeName: return ElementaryType(lname) - - if name in contract.structures_as_dict: return UserDefinedType(contract.structures_as_dict[name]) diff --git a/slither/vyper_parsing/variables/local_variable.py b/slither/vyper_parsing/variables/local_variable.py index 3651b701fd..d3bd0b0557 100644 --- a/slither/vyper_parsing/variables/local_variable.py +++ b/slither/vyper_parsing/variables/local_variable.py @@ -27,7 +27,6 @@ def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> self._variable.set_location("default") - @property def underlying_variable(self) -> LocalVariable: return self._variable diff --git a/slither/vyper_parsing/variables/state_variable.py b/slither/vyper_parsing/variables/state_variable.py index f17a4132ef..a2e925a6ea 100644 --- a/slither/vyper_parsing/variables/state_variable.py +++ b/slither/vyper_parsing/variables/state_variable.py @@ -5,6 +5,7 @@ from slither.vyper_parsing.type_parsing import parse_type from slither.vyper_parsing.expressions.expression_parsing import parse_expression + class StateVariableVyper: def __init__(self, variable: StateVariable, variable_data: VariableDecl) -> None: self._variable: StateVariable = variable @@ -16,7 +17,7 @@ def __init__(self, variable: StateVariable, variable_data: VariableDecl) -> None if variable_data.value is not None: self._variable.initialized = True - self._initializedNotParsed = variable_data.value + self._initializedNotParsed = variable_data.value @property def underlying_variable(self) -> StateVariable: @@ -24,7 +25,7 @@ def underlying_variable(self) -> StateVariable: def analyze(self, contract) -> None: self._variable.type = parse_type(self._elem_to_parse, contract) - + if self._variable.initialized: self._variable.expression = parse_expression(self._initializedNotParsed, contract) self._initializedNotParsed = None diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index f43d85d00b..88ff43d1e1 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -51,9 +51,9 @@ def parse_contracts(self): def analyze_contracts(self) -> None: if not self._parsed: raise SlitherException("Parse the contract before running analyses") - + for contract, contract_parser in self._underlying_contract_to_parser.items(): - # State variables are analyzed for all contracts because interfaces may + # State variables are analyzed for all contracts because interfaces may # reference them, specifically, constants. contract_parser.analyze_state_variables() @@ -73,7 +73,7 @@ def _convert_to_slithir(self) -> None: func.generate_slithir_and_analyze() contract.convert_expression_to_slithir_ssa() - + self._compilation_unit.propagate_function_calls() for contract in self._compilation_unit.contracts: contract.fix_phi() From 85e63c6ba5772a6c3aced61a5d95669c61edc320 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 20:21:40 -0500 Subject: [PATCH 083/169] rename fixture --- tests/conftest.py | 2 +- tests/unit/slithir/test_ssa_generation.py | 96 +++++++++++------------ 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 63fccfa120..1b9f44c52b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -59,7 +59,7 @@ def inner(version): @pytest.fixture -def slither_from_source(solc_binary_path): +def slither_from_solidity_source(solc_binary_path): @contextmanager def inner(source_code: str, solc_version: str = "0.8.19"): """Yields a Slither instance using source_code string and solc_version. diff --git a/tests/unit/slithir/test_ssa_generation.py b/tests/unit/slithir/test_ssa_generation.py index 3c7e84973f..6b1a1d1023 100644 --- a/tests/unit/slithir/test_ssa_generation.py +++ b/tests/unit/slithir/test_ssa_generation.py @@ -283,7 +283,7 @@ def get_ssa_of_type(f: Union[Function, Node], ssatype) -> List[Operation]: return get_filtered_ssa(f, lambda ssanode: isinstance(ssanode, ssatype)) -def test_multi_write(slither_from_source) -> None: +def test_multi_write(slither_from_solidity_source) -> None: source = """ pragma solidity ^0.8.11; contract Test { @@ -293,11 +293,11 @@ def test_multi_write(slither_from_source) -> None: val = 3; } }""" - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: verify_properties_hold(slither) -def test_single_branch_phi(slither_from_source) -> None: +def test_single_branch_phi(slither_from_solidity_source) -> None: source = """ pragma solidity ^0.8.11; contract Test { @@ -309,11 +309,11 @@ def test_single_branch_phi(slither_from_source) -> None: } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: verify_properties_hold(slither) -def test_basic_phi(slither_from_source) -> None: +def test_basic_phi(slither_from_solidity_source) -> None: source = """ pragma solidity ^0.8.11; contract Test { @@ -327,11 +327,11 @@ def test_basic_phi(slither_from_source) -> None: } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: verify_properties_hold(slither) -def test_basic_loop_phi(slither_from_source) -> None: +def test_basic_loop_phi(slither_from_solidity_source) -> None: source = """ pragma solidity ^0.8.11; contract Test { @@ -343,12 +343,12 @@ def test_basic_loop_phi(slither_from_source) -> None: } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: verify_properties_hold(slither) @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_phi_propagation_loop(slither_from_source): +def test_phi_propagation_loop(slither_from_solidity_source): source = """ pragma solidity ^0.8.11; contract Test { @@ -365,12 +365,12 @@ def test_phi_propagation_loop(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: verify_properties_hold(slither) @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_free_function_properties(slither_from_source): +def test_free_function_properties(slither_from_solidity_source): source = """ pragma solidity ^0.8.11; @@ -388,11 +388,11 @@ def test_free_function_properties(slither_from_source): contract Test {} """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: verify_properties_hold(slither) -def test_ssa_inter_transactional(slither_from_source) -> None: +def test_ssa_inter_transactional(slither_from_solidity_source) -> None: source = """ pragma solidity ^0.8.11; contract A { @@ -412,7 +412,7 @@ def test_ssa_inter_transactional(slither_from_source) -> None: } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.contracts[0] variables = c.variables_as_dict funcs = c.available_functions_as_dict() @@ -435,7 +435,7 @@ def test_ssa_inter_transactional(slither_from_source) -> None: @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_ssa_phi_callbacks(slither_from_source): +def test_ssa_phi_callbacks(slither_from_solidity_source): source = """ pragma solidity ^0.8.11; contract A { @@ -463,7 +463,7 @@ def test_ssa_phi_callbacks(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("A")[0] _dump_functions(c) f = [x for x in c.functions if x.name == "use_a"][0] @@ -494,7 +494,7 @@ def test_ssa_phi_callbacks(slither_from_source): @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_storage_refers_to(slither_from_source): +def test_storage_refers_to(slither_from_solidity_source): """Test the storage aspects of the SSA IR When declaring a var as being storage, start tracking what storage it refers_to. @@ -523,7 +523,7 @@ def test_storage_refers_to(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.contracts[0] f = c.functions[0] @@ -563,7 +563,7 @@ def test_storage_refers_to(slither_from_source): @pytest.mark.skipif( not valid_version("0.4.0"), reason="Solidity version 0.4.0 not available on this platform" ) -def test_initial_version_exists_for_locals(slither_from_source): +def test_initial_version_exists_for_locals(slither_from_solidity_source): """ In solidity you can write statements such as uint a = a + 1, this test ensures that can be handled for local variables. @@ -575,7 +575,7 @@ def test_initial_version_exists_for_locals(slither_from_source): } } """ - with slither_from_source(src, "0.4.0") as slither: + with slither_from_solidity_source(src, "0.4.0") as slither: verify_properties_hold(slither) c = slither.contracts[0] f = c.functions[0] @@ -600,7 +600,7 @@ def test_initial_version_exists_for_locals(slither_from_source): @pytest.mark.skipif( not valid_version("0.4.0"), reason="Solidity version 0.4.0 not available on this platform" ) -def test_initial_version_exists_for_state_variables(slither_from_source): +def test_initial_version_exists_for_state_variables(slither_from_solidity_source): """ In solidity you can write statements such as uint a = a + 1, this test ensures that can be handled for state variables. @@ -610,7 +610,7 @@ def test_initial_version_exists_for_state_variables(slither_from_source): uint a = a + 1; } """ - with slither_from_source(src, "0.4.0") as slither: + with slither_from_solidity_source(src, "0.4.0") as slither: verify_properties_hold(slither) c = slither.contracts[0] f = c.functions[0] # There will be one artificial ctor function for the state vars @@ -637,7 +637,7 @@ def test_initial_version_exists_for_state_variables(slither_from_source): @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_initial_version_exists_for_state_variables_function_assign(slither_from_source): +def test_initial_version_exists_for_state_variables_function_assign(slither_from_solidity_source): """ In solidity you can write statements such as uint a = a + 1, this test ensures that can be handled for local variables. @@ -652,7 +652,7 @@ def test_initial_version_exists_for_state_variables_function_assign(slither_from } } """ - with slither_from_source(src) as slither: + with slither_from_solidity_source(src) as slither: verify_properties_hold(slither) c = slither.contracts[0] f, ctor = c.functions @@ -679,7 +679,7 @@ def test_initial_version_exists_for_state_variables_function_assign(slither_from @pytest.mark.skipif( not valid_version("0.4.0"), reason="Solidity version 0.4.0 not available on this platform" ) -def test_return_local_before_assign(slither_from_source): +def test_return_local_before_assign(slither_from_solidity_source): src = """ // this require solidity < 0.5 // a variable can be returned before declared. Ensure it can be @@ -694,7 +694,7 @@ def test_return_local_before_assign(slither_from_source): } } """ - with slither_from_source(src, "0.4.0") as slither: + with slither_from_solidity_source(src, "0.4.0") as slither: f = slither.contracts[0].functions[0] ret = get_ssa_of_type(f, Return)[0] @@ -709,7 +709,7 @@ def test_return_local_before_assign(slither_from_source): @pytest.mark.skipif( not valid_version("0.5.0"), reason="Solidity version 0.5.0 not available on this platform" ) -def test_shadow_local(slither_from_source): +def test_shadow_local(slither_from_solidity_source): src = """ contract A { // this require solidity 0.5 @@ -724,7 +724,7 @@ def test_shadow_local(slither_from_source): } } """ - with slither_from_source(src, "0.5.0") as slither: + with slither_from_solidity_source(src, "0.5.0") as slither: _dump_functions(slither.contracts[0]) f = slither.contracts[0].functions[0] @@ -734,7 +734,7 @@ def test_shadow_local(slither_from_source): @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_multiple_named_args_returns(slither_from_source): +def test_multiple_named_args_returns(slither_from_solidity_source): """Verifies that named arguments and return values have correct versions Each arg/ret have an initial version, version 0, and is written once and should @@ -749,7 +749,7 @@ def test_multiple_named_args_returns(slither_from_source): ret2 = arg2 + 4; } }""" - with slither_from_source(src) as slither: + with slither_from_solidity_source(src) as slither: verify_properties_hold(slither) f = slither.contracts[0].functions[0] @@ -763,7 +763,7 @@ def test_multiple_named_args_returns(slither_from_source): @pytest.mark.xfail(reason="Tests for wanted state of SSA IR, not current.", strict=True) -def test_memory_array(slither_from_source): +def test_memory_array(slither_from_solidity_source): src = """ contract MemArray { struct A { @@ -798,7 +798,7 @@ def test_memory_array(slither_from_source): return arg + 1; } }""" - with slither_from_source(src) as slither: + with slither_from_solidity_source(src) as slither: c = slither.contracts[0] ftest_array, faccept, fb = c.functions @@ -829,7 +829,7 @@ def test_memory_array(slither_from_source): @pytest.mark.xfail(reason="Tests for wanted state of SSA IR, not current.", strict=True) -def test_storage_array(slither_from_source): +def test_storage_array(slither_from_solidity_source): src = """ contract StorageArray { struct A { @@ -865,7 +865,7 @@ def test_storage_array(slither_from_source): return value + 1; } }""" - with slither_from_source(src) as slither: + with slither_from_solidity_source(src) as slither: c = slither.contracts[0] _dump_functions(c) ftest, faccept, fb = c.functions @@ -884,7 +884,7 @@ def test_storage_array(slither_from_source): @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_issue_468(slither_from_source): +def test_issue_468(slither_from_solidity_source): """ Ensure issue 468 is corrected as per https://github.com/crytic/slither/issues/468#issuecomment-620974151 @@ -905,7 +905,7 @@ def test_issue_468(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("State")[0] f = [x for x in c.functions if x.name == "f"][0] @@ -938,7 +938,7 @@ def test_issue_468(slither_from_source): @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_issue_434(slither_from_source): +def test_issue_434(slither_from_solidity_source): source = """ contract Contract { int public a; @@ -956,7 +956,7 @@ def test_issue_434(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] e = [x for x in c.functions if x.name == "e"][0] @@ -992,7 +992,7 @@ def test_issue_434(slither_from_source): @pytest.mark.xfail(strict=True, reason="Fails in current slither version. Fix in #1102.") -def test_issue_473(slither_from_source): +def test_issue_473(slither_from_solidity_source): source = """ contract Contract { function f() public returns (int) { @@ -1007,7 +1007,7 @@ def test_issue_473(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] f = c.functions[0] @@ -1035,7 +1035,7 @@ def test_issue_473(slither_from_source): assert second_phi.lvalue in return_value.values -def test_issue_1748(slither_from_source): +def test_issue_1748(slither_from_solidity_source): source = """ contract Contract { uint[] arr; @@ -1044,7 +1044,7 @@ def test_issue_1748(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] f = c.functions[0] operations = f.slithir_operations @@ -1052,7 +1052,7 @@ def test_issue_1748(slither_from_source): assert isinstance(assign_op, InitArray) -def test_issue_1776(slither_from_source): +def test_issue_1776(slither_from_solidity_source): source = """ contract Contract { function foo() public returns (uint) { @@ -1061,7 +1061,7 @@ def test_issue_1776(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] f = c.functions[0] operations = f.slithir_operations @@ -1080,7 +1080,7 @@ def test_issue_1776(slither_from_source): assert lvalue_type2.length_value.value == "5" -def test_issue_1846_ternary_in_if(slither_from_source): +def test_issue_1846_ternary_in_if(slither_from_solidity_source): source = """ contract Contract { function foo(uint x) public returns (uint y) { @@ -1092,7 +1092,7 @@ def test_issue_1846_ternary_in_if(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] f = c.functions[0] node = f.nodes[1] @@ -1101,7 +1101,7 @@ def test_issue_1846_ternary_in_if(slither_from_source): assert node.son_false.type == NodeType.EXPRESSION -def test_issue_1846_ternary_in_ternary(slither_from_source): +def test_issue_1846_ternary_in_ternary(slither_from_solidity_source): source = """ contract Contract { function foo(uint x) public returns (uint y) { @@ -1109,7 +1109,7 @@ def test_issue_1846_ternary_in_ternary(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] f = c.functions[0] node = f.nodes[1] From 55ab580a758ddcf73f137e4dbf14591a8a7d69fa Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 22:23:34 -0500 Subject: [PATCH 084/169] convert raw_call to LowLevelCall --- slither/slithir/convert.py | 7 +++++-- .../expressions/expression_parsing.py | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index d40715c4f3..d1eaafdfac 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1131,6 +1131,7 @@ def can_be_low_level(ir: HighLevelCall) -> bool: "delegatecall", "callcode", "staticcall", + "raw_call", ] @@ -1159,13 +1160,14 @@ def convert_to_low_level( ir.set_node(prev_ir.node) ir.lvalue.set_type(ElementaryType("bool")) return ir - if ir.function_name in ["call", "delegatecall", "callcode", "staticcall"]: + if ir.function_name in ["call", "delegatecall", "callcode", "staticcall", "raw_call"]: new_ir = LowLevelCall( ir.destination, ir.function_name, ir.nbr_arguments, ir.lvalue, ir.type_call ) new_ir.call_gas = ir.call_gas new_ir.call_value = ir.call_value new_ir.arguments = ir.arguments + # TODO fix this for Vyper if ir.node.compilation_unit.solc_version >= "0.5": new_ir.lvalue.set_type([ElementaryType("bool"), ElementaryType("bytes")]) else: @@ -1916,7 +1918,8 @@ def apply_ir_heuristics(irs: List[Operation], node: "Node") -> List[Operation]: irs = propagate_type_and_convert_call(irs, node) irs = remove_unused(irs) find_references_origin(irs) - convert_constant_types(irs) + # TODO refine only for Solidity + # convert_constant_types(irs) convert_delete(irs) _find_source_mapping_references(irs) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 326fe2c754..c5da11fbec 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -311,10 +311,10 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": if isinstance(expression, Call): called = parse_expression(expression.func, caller_context) - if isinstance(called, Identifier) and isinstance(called.value, SolidityFunction): if called.value.name == "empty()": type_to = parse_type(expression.args[0], caller_context) + # TODO figure out how to represent this type argument parsed_expr = CallExpression(called, [], str(type_to)) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr @@ -355,7 +355,19 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": ), ) return parsed_expr - + + elif called.value.name == "raw_call()": + args = [parse_expression(a, caller_context) for a in expression.args] + # This is treated specially in order to force `extract_tmp_call` to treat this as a `HighLevelCall` which will be converted + # to a `LowLevelCall` by `convert_to_low_level`. This is an artifact of the late conversion of Solidity... + call = CallExpression(MemberAccess("raw_call", "tuple(bool,bytes32)", args[0]), args[1:], "tuple(bool,bytes32)") + call.set_offset(expression.src, caller_context.compilation_unit) + call.call_value = next(iter(parse_expression(x.value, caller_context) for x in expression.keywords if x.arg == "value"), None) + call.call_gas = next(iter(parse_expression(x.value, caller_context) for x in expression.keywords if x.arg == "gas"), None) + # TODO handle `max_outsize` keyword + + return call + if expression.args and isinstance(expression.args[0], VyDict): arguments = [] for val in expression.args[0].values: From 4c1ad519d037374705fbda32eefcb6f8648bdb50 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 22:30:01 -0500 Subject: [PATCH 085/169] handle edge case for vyper Expr nodes --- slither/vyper_parsing/declarations/function.py | 15 ++++++++------- .../expressions/expression_parsing.py | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 9e57b6c66d..98c3728080 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -238,11 +238,14 @@ def parse_statement(curr_node, expr): curr_node = new_node - # elif isinstance(expr, Assign): - # new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - # new_node.add_unparsed_expression(expr.target) - # new_node.add_unparsed_expression(expr.value) - # link_underlying_nodes(curr_node, new_node) + elif isinstance(expr, Expr): + # TODO This is a workaround to handle Vyper putting payable/view in the function body... + if not isinstance(expr.value, Name): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr.value) + link_underlying_nodes(curr_node, new_node) + + curr_node = new_node elif isinstance(expr, For): @@ -441,8 +444,6 @@ def parse_statement(curr_node, expr): link_underlying_nodes(curr_node, condition_node) curr_node = endIf_node - elif isinstance(expr, Expr): - pass elif isinstance(expr, Pass): pass elif isinstance(expr, Raise): diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index c5da11fbec..09154d6b94 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -672,7 +672,7 @@ def get_type_str(x): rhs = parse_expression(expression.values[1], caller_context) op = BinaryOperationType.get_type(expression.op) - parsed_expr = BinaryOperation(lhs, op) + parsed_expr = BinaryOperation(lhs, rhs, op) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr From 2bfe8290b9cd5f88002a8821a9292e9590455201 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 23:05:19 -0500 Subject: [PATCH 086/169] add ability to perform filtering by language to AbstractDetector --- slither/detectors/abstract_detector.py | 24 +++++++++++++++---- .../naming_convention/naming_convention.py | 2 +- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/slither/detectors/abstract_detector.py b/slither/detectors/abstract_detector.py index 7bb8eb93fb..b6fe49d30e 100644 --- a/slither/detectors/abstract_detector.py +++ b/slither/detectors/abstract_detector.py @@ -3,7 +3,7 @@ from logging import Logger from typing import Optional, List, TYPE_CHECKING, Dict, Union, Callable -from slither.core.compilation_unit import SlitherCompilationUnit +from slither.core.compilation_unit import SlitherCompilationUnit, Language from slither.core.declarations import Contract from slither.formatters.exceptions import FormatImpossible from slither.formatters.utils.patches import apply_patch, create_diff @@ -80,6 +80,9 @@ class AbstractDetector(metaclass=abc.ABCMeta): # list of vulnerable solc versions as strings (e.g. ["0.4.25", "0.5.0"]) # If the detector is meant to run on all versions, use None VULNERABLE_SOLC_VERSIONS: Optional[List[str]] = None + # If the detector is meant to run on all languages, use None + # Otherwise, use `solidity` or `vyper` + LANGUAGE: Optional[str] = None def __init__( self, compilation_unit: SlitherCompilationUnit, slither: "Slither", logger: Logger @@ -133,6 +136,14 @@ def __init__( f"VULNERABLE_SOLC_VERSIONS should not be an empty list {self.__class__.__name__}" ) + if self.LANGUAGE is not None and self.LANGUAGE not in [ + Language.SOLIDITY.value, + Language.VYPER.value, + ]: + raise IncorrectDetectorInitialization( + f"LANGUAGE should not be either 'solidity' or 'vyper' {self.__class__.__name__}" + ) + if re.match("^[a-zA-Z0-9_-]*$", self.ARGUMENT) is None: raise IncorrectDetectorInitialization( f"ARGUMENT has illegal character {self.__class__.__name__}" @@ -164,9 +175,14 @@ def _log(self, info: str) -> None: if self.logger: self.logger.info(self.color(info)) - def _uses_vulnerable_solc_version(self) -> bool: + def _is_applicable_detector(self) -> bool: if self.VULNERABLE_SOLC_VERSIONS: - return self.compilation_unit.solc_version in self.VULNERABLE_SOLC_VERSIONS + return ( + self.compilation_unit.is_solidity + and self.compilation_unit.solc_version in self.VULNERABLE_SOLC_VERSIONS + ) + if self.LANGUAGE: + return self.compilation_unit._language == self.LANGUAGE return True @abc.abstractmethod @@ -179,7 +195,7 @@ def detect(self) -> List[Dict]: results: List[Dict] = [] # check solc version - if not self._uses_vulnerable_solc_version(): + if not self._is_applicable_detector(): return results # only keep valid result, and remove duplicate diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 02deb719e7..c456f62a30 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -24,7 +24,7 @@ class NamingConvention(AbstractDetector): HELP = "Conformity to Solidity naming conventions" IMPACT = DetectorClassification.INFORMATIONAL CONFIDENCE = DetectorClassification.HIGH - + LANGUAGE = "solidity" WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#conformance-to-solidity-naming-conventions" WIKI_TITLE = "Conformance to Solidity naming conventions" From 77637d90f0132433bc9daa13168b9797aa53ac64 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 23:13:36 -0500 Subject: [PATCH 087/169] delete unused code, misc. notes --- slither/vyper_parsing/declarations/event.py | 3 - .../expressions/expression_parsing.py | 233 ++---------------- .../vyper_parsing/vyper_compilation_unit.py | 36 --- 3 files changed, 24 insertions(+), 248 deletions(-) diff --git a/slither/vyper_parsing/declarations/event.py b/slither/vyper_parsing/declarations/event.py index a0152ec0ec..e6ed5a12e3 100644 --- a/slither/vyper_parsing/declarations/event.py +++ b/slither/vyper_parsing/declarations/event.py @@ -22,9 +22,6 @@ def __init__(self, event: Event, event_def: EventDef) -> None: self._event = event self._event.name = event_def.name self._elemsNotParsed = event_def.body - print(event_def) - # assert False - # self.analyze() # TODO create `VariableDecl` from `AnnAssign` from `event_def.body` (also for `StructDef`) def analyze(self, contract) -> None: for elem_to_parse in self._elemsNotParsed: diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 09154d6b94..36c7c3ee5b 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -49,209 +49,6 @@ if TYPE_CHECKING: from slither.core.expressions.expression import Expression -logger = logging.getLogger("ExpressionParsing") - -# pylint: disable=anomalous-backslash-in-string,import-outside-toplevel,too-many-branches,too-many-locals - -# region Filtering -################################################################################### -################################################################################### - - -def filter_name(value: str) -> str: - value = value.replace(" memory", "") - value = value.replace(" storage", "") - value = value.replace(" external", "") - value = value.replace(" internal", "") - value = value.replace("struct ", "") - value = value.replace("contract ", "") - value = value.replace("enum ", "") - value = value.replace(" ref", "") - value = value.replace(" pointer", "") - value = value.replace(" pure", "") - value = value.replace(" view", "") - value = value.replace(" constant", "") - value = value.replace(" payable", "") - value = value.replace("function (", "function(") - value = value.replace("returns (", "returns(") - value = value.replace(" calldata", "") - - # remove the text remaining after functio(...) - # which should only be ..returns(...) - # nested parenthesis so we use a system of counter on parenthesis - idx = value.find("(") - if idx: - counter = 1 - max_idx = len(value) - while counter: - assert idx < max_idx - idx = idx + 1 - if value[idx] == "(": - counter += 1 - elif value[idx] == ")": - counter -= 1 - value = value[: idx + 1] - return value - - -# endregion - -################################################################################### -################################################################################### -# region Parsing -################################################################################### -################################################################################### - -# pylint: disable=too-many-statements -def parse_call( - expression: Dict, caller_context -) -> Union[ - slither.core.expressions.call_expression.CallExpression, - slither.core.expressions.type_conversion.TypeConversion, -]: - src = expression["src"] - if caller_context.is_compact_ast: - attributes = expression - type_conversion = expression["kind"] == "typeConversion" - type_return = attributes["typeDescriptions"]["typeString"] - - else: - attributes = expression["attributes"] - type_conversion = attributes["type_conversion"] - type_return = attributes["type"] - - if type_conversion: - type_call = parse_type(UnknownType(type_return), caller_context) - if caller_context.is_compact_ast: - assert len(expression["arguments"]) == 1 - expression_to_parse = expression["arguments"][0] - else: - children = expression["children"] - assert len(children) == 2 - type_info = children[0] - expression_to_parse = children[1] - assert type_info["name"] in [ - "ElementaryTypenameExpression", - "ElementaryTypeNameExpression", - "Identifier", - "TupleExpression", - "IndexAccess", - "MemberAccess", - ] - - expression = parse_expression(expression_to_parse, caller_context) - t = TypeConversion(expression, type_call) - t.set_offset(src, caller_context.compilation_unit) - if isinstance(type_call, UserDefinedType): - type_call.type.references.append(t.source_mapping) - return t - - call_gas = None - call_value = None - call_salt = None - if caller_context.is_compact_ast: - called = parse_expression(expression["expression"], caller_context) - # If the next expression is a FunctionCallOptions - # We can here the gas/value information - # This is only available if the syntax is {gas: , value: } - # For the .gas().value(), the member are considered as function call - # And converted later to the correct info (convert.py) - if expression["expression"][caller_context.get_key()] == "FunctionCallOptions": - call_with_options = expression["expression"] - for idx, name in enumerate(call_with_options.get("names", [])): - option = parse_expression(call_with_options["options"][idx], caller_context) - if name == "value": - call_value = option - if name == "gas": - call_gas = option - if name == "salt": - call_salt = option - arguments = [] - if expression["arguments"]: - arguments = [parse_expression(a, caller_context) for a in expression["arguments"]] - else: - children = expression["children"] - called = parse_expression(children[0], caller_context) - arguments = [parse_expression(a, caller_context) for a in children[1::]] - - if isinstance(called, SuperCallExpression): - sp = SuperCallExpression(called, arguments, type_return) - sp.set_offset(expression["src"], caller_context.compilation_unit) - return sp - call_expression = CallExpression(called, arguments, type_return) - call_expression.set_offset(src, caller_context.compilation_unit) - - # Only available if the syntax {gas:, value:} was used - call_expression.call_gas = call_gas - call_expression.call_value = call_value - call_expression.call_salt = call_salt - return call_expression - - -def parse_super_name(expression: Dict, is_compact_ast: bool) -> str: - if is_compact_ast: - assert expression["nodeType"] == "MemberAccess" - base_name = expression["memberName"] - arguments = expression["typeDescriptions"]["typeString"] - else: - assert expression["name"] == "MemberAccess" - attributes = expression["attributes"] - base_name = attributes["member_name"] - arguments = attributes["type"] - - assert arguments.startswith("function ") - # remove function (...() - arguments = arguments[len("function ") :] - - arguments = filter_name(arguments) - if " " in arguments: - arguments = arguments[: arguments.find(" ")] - - return base_name + arguments - - -def _parse_elementary_type_name_expression( - expression: Dict, is_compact_ast: bool, caller_context: CallerContextExpression -) -> ElementaryTypeNameExpression: - # nop exression - # uint; - if is_compact_ast: - value = expression["typeName"] - else: - if "children" in expression: - value = expression["children"][0]["attributes"]["name"] - else: - value = expression["attributes"]["value"] - if isinstance(value, dict): - t = parse_type(value, caller_context) - else: - t = parse_type(UnknownType(value), caller_context) - e = ElementaryTypeNameExpression(t) - e.set_offset(expression["src"], caller_context.compilation_unit) - return e - - -if TYPE_CHECKING: - pass - - -def _user_defined_op_call( - caller_context: CallerContextExpression, src, function_id: int, args: List[Any], type_call: str -) -> CallExpression: - var, was_created = find_variable(None, caller_context, function_id) - - if was_created: - var.set_offset(src, caller_context.compilation_unit) - - identifier = Identifier(var) - identifier.set_offset(src, caller_context.compilation_unit) - - var.references.append(identifier.source_mapping) - - call = CallExpression(identifier, args, type_call) - call.set_offset(src, caller_context.compilation_unit) - return call - from collections import deque from slither.vyper_parsing.ast.types import ( @@ -355,19 +152,37 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": ), ) return parsed_expr - + elif called.value.name == "raw_call()": args = [parse_expression(a, caller_context) for a in expression.args] # This is treated specially in order to force `extract_tmp_call` to treat this as a `HighLevelCall` which will be converted # to a `LowLevelCall` by `convert_to_low_level`. This is an artifact of the late conversion of Solidity... - call = CallExpression(MemberAccess("raw_call", "tuple(bool,bytes32)", args[0]), args[1:], "tuple(bool,bytes32)") + call = CallExpression( + MemberAccess("raw_call", "tuple(bool,bytes32)", args[0]), + args[1:], + "tuple(bool,bytes32)", + ) call.set_offset(expression.src, caller_context.compilation_unit) - call.call_value = next(iter(parse_expression(x.value, caller_context) for x in expression.keywords if x.arg == "value"), None) - call.call_gas = next(iter(parse_expression(x.value, caller_context) for x in expression.keywords if x.arg == "gas"), None) + call.call_value = next( + iter( + parse_expression(x.value, caller_context) + for x in expression.keywords + if x.arg == "value" + ), + None, + ) + call.call_gas = next( + iter( + parse_expression(x.value, caller_context) + for x in expression.keywords + if x.arg == "gas" + ), + None, + ) # TODO handle `max_outsize` keyword - return call - + return call + if expression.args and isinstance(expression.args[0], VyDict): arguments = [] for val in expression.args[0].values: diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index 88ff43d1e1..2650ffe8e7 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -78,39 +78,3 @@ def _convert_to_slithir(self) -> None: for contract in self._compilation_unit.contracts: contract.fix_phi() contract.update_read_write_using_ssa() - - # def __init__(self, compilation_unit: SlitherCompilationUnit) -> None: - - # self._contracts_by_id: Dict[int, ContractSolc] = {} - # self._parsed = False - # self._analyzed = False - - # self._underlying_contract_to_parser: Dict[Contract, ContractSolc] = {} - # self._structures_top_level_parser: List[StructureTopLevelSolc] = [] - # self._custom_error_parser: List[CustomErrorSolc] = [] - # self._variables_top_level_parser: List[TopLevelVariableSolc] = [] - # self._functions_top_level_parser: List[FunctionSolc] = [] - # self._using_for_top_level_parser: List[UsingForTopLevelSolc] = [] - - # self._all_functions_and_modifier_parser: List[FunctionSolc] = [] - - # self._top_level_contracts_counter = 0 - - # @property - # def compilation_unit(self) -> SlitherCompilationUnit: - # return self._compilation_unit - - # @property - # def all_functions_and_modifiers_parser(self) -> List[FunctionSolc]: - # return self._all_functions_and_modifier_parser - - # def add_function_or_modifier_parser(self, f: FunctionSolc) -> None: - # self._all_functions_and_modifier_parser.append(f) - - # @property - # def underlying_contract_to_parser(self) -> Dict[Contract, ContractSolc]: - # return self._underlying_contract_to_parser - - # @property - # def slither_parser(self) -> "SlitherCompilationUnitSolc": - # return self From 372579221d01580a45e7ff7babf307f1ae2afc58 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 23:16:02 -0500 Subject: [PATCH 088/169] delete more unused code --- .../expressions/find_variable.py | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index 1c6058c1a1..5b84570ce8 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -30,11 +30,6 @@ from slither.solc_parsing.declarations.function import FunctionSolc from slither.solc_parsing.declarations.contract import ContractSolc -# pylint: disable=import-outside-toplevel,too-many-branches,too-many-locals - - -# CallerContext =Union["ContractSolc", "FunctionSolc", "CustomErrorSolc", "StructureTopLevelSolc"] - def _find_variable_in_function_parser( var_name: str, @@ -82,20 +77,6 @@ def _find_in_contract( if var_name in enums: return enums[var_name] - # Note: contract.custom_errors_as_dict uses the name (not the sol sig) as key - # This is because when the dic is populated the underlying object is not yet parsed - # As a result, we need to iterate over all the custom errors here instead of using the dict - custom_errors = contract.custom_errors - try: - for custom_error in custom_errors: - if var_name in [custom_error.solidity_signature, custom_error.full_name]: - return custom_error - except ValueError: - # This can happen as custom error sol signature might not have been built - # when find_variable was called - # TODO refactor find_variable to prevent this from happening - pass - # If the enum is refered as its name rather than its canonicalName enums = {e.name: e for e in contract.enums} if var_name in enums: @@ -130,25 +111,10 @@ def find_variable( :type var_name: :param caller_context: :type caller_context: - :param referenced_declaration: :return: :rtype: """ - # variable are looked from the contract declarer - # functions can be shadowed, but are looked from the contract instance, rather than the contract declarer - # the difference between function and variable come from the fact that an internal call, or an variable access - # in a function does not behave similariy, for example in: - # contract C{ - # function f(){ - # state_var = 1 - # f2() - # } - # state_var will refer to C.state_var, no mater if C is inherited - # while f2() will refer to the function definition of the inherited contract (C.f2() in the context of C, or - # the contract inheriting from C) - # for events it's unclear what should be the behavior, as they can be shadowed, but there is not impact - # structure/enums cannot be shadowed from slither.vyper_parsing.declarations.contract import ContractVyper from slither.vyper_parsing.declarations.function import FunctionVyper From 917c5d6cd6c28719ff8813b89e9c466a3a6b14a6 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 29 Aug 2023 23:21:35 -0500 Subject: [PATCH 089/169] add IncorrectSolc detector to solidity-only detectors --- 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 eaf40bf21f..ad38b17843 100644 --- a/slither/detectors/attributes/incorrect_solc.py +++ b/slither/detectors/attributes/incorrect_solc.py @@ -33,7 +33,7 @@ class IncorrectSolc(AbstractDetector): HELP = "Incorrect Solidity version" IMPACT = DetectorClassification.INFORMATIONAL CONFIDENCE = DetectorClassification.HIGH - + LANGUAGE = "solidity" WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-versions-of-solidity" WIKI_TITLE = "Incorrect versions of Solidity" From 5197b157a84190a8575d982276bda0aea50cb289 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 08:36:04 -0500 Subject: [PATCH 090/169] fix filtering to use string value of enum --- 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 b6fe49d30e..c3f661a112 100644 --- a/slither/detectors/abstract_detector.py +++ b/slither/detectors/abstract_detector.py @@ -182,7 +182,7 @@ def _is_applicable_detector(self) -> bool: and self.compilation_unit.solc_version in self.VULNERABLE_SOLC_VERSIONS ) if self.LANGUAGE: - return self.compilation_unit._language == self.LANGUAGE + return self.compilation_unit._language.value == self.LANGUAGE return True @abc.abstractmethod From baa3c980c29a77c688d5c8bd0f293e00f48069b7 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 11:07:37 -0500 Subject: [PATCH 091/169] install vyper in CI --- .github/workflows/test.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b3754bfd78..51ea634f11 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -57,7 +57,23 @@ jobs: npm install hardhat popd || exit fi - + - name: Install Vyper + run: | + INSTALLDIR="$RUNNER_TEMP/vyper-install" + if [[ "$RUNNER_OS" = "Windows" ]]; then + URL="https://github.com/vyperlang/vyper/releases/download/v0.3.7/vyper.0.3.7+commit.6020b8bb.windows.exe" + FILENAME="vyper.exe" + elif [[ "$RUNNER_OS" = "Linux" ]]; then + URL="https://github.com/vyperlang/vyper/releases/download/v0.3.7/vyper.0.3.7+commit.6020b8bb.linux" + FILENAME="vyper" + else + echo "Unknown OS" + exit 1 + fi + mkdir -p "$INSTALLDIR" + wget "$URL" -q -O "$INSTALLDIR/$FILENAME" + chmod 755 "$INSTALLDIR/$FILENAME" + echo "$INSTALLDIR" >> "$GITHUB_PATH" - name: Run ${{ matrix.type }} tests env: TEST_TYPE: ${{ matrix.type }} From ae45f461e32e72bc64af793d4fb3a1da8ccb9fab Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 11:13:15 -0500 Subject: [PATCH 092/169] initial tests --- slither/core/declarations/function.py | 23 ++--- tests/conftest.py | 20 +++++ tests/unit/core/test_function_declaration.py | 85 +++++++++++++++++++ tests/unit/slithir/vyper/__init__.py | 0 .../unit/slithir/vyper/test_ir_generation.py | 65 ++++++++++++++ 5 files changed, 182 insertions(+), 11 deletions(-) create mode 100644 tests/unit/slithir/vyper/__init__.py create mode 100644 tests/unit/slithir/vyper/test_ir_generation.py diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index d549c96159..0f1955a923 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -106,7 +106,8 @@ def _filter_state_variables_written(expressions: List["Expression"]): ret.append(expression.expression_left) return ret -#TODO replace + +# TODO replace class FunctionLanguage(Enum): Solidity = 0 Yul = 1 @@ -238,7 +239,7 @@ def name(self) -> str: """ if self._name == "" and self._function_type == FunctionType.CONSTRUCTOR: return "constructor" - if self._function_type == FunctionType.FALLBACK: + if self._name == "" and self._function_type == FunctionType.FALLBACK: return "fallback" if self._function_type == FunctionType.RECEIVE: return "receive" @@ -985,14 +986,15 @@ def signature(self) -> Tuple[str, List[str], List[str]]: (str, list(str), list(str)): Function signature as (name, list parameters type, list return values type) """ - if self._signature is None: - signature = ( - self.name, - [str(x.type) for x in self.parameters], - [str(x.type) for x in self.returns], - ) - self._signature = signature - return self._signature + # FIXME memoizing this function is not working properly for vyper + # if self._signature is None: + return ( + self.name, + [str(x.type) for x in self.parameters], + [str(x.type) for x in self.returns], + ) + # self._signature = signature + # return self._signature @property def signature_str(self) -> str: @@ -1758,7 +1760,6 @@ def fix_phi( def generate_slithir_and_analyze(self) -> None: print("generate_slithir_and_analyze") - print(self.nodes) for node in self.nodes: node.slithir_generation() diff --git a/tests/conftest.py b/tests/conftest.py index 1b9f44c52b..5c77dceca5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -77,3 +77,23 @@ def inner(source_code: str, solc_version: str = "0.8.19"): Path(fname).unlink() return inner + + +@pytest.fixture +def slither_from_vyper_source(): + @contextmanager + def inner(source_code: str): + """Yields a Slither instance using source_code string. + Creates a temporary file and compiles with vyper. + """ + + fname = "" + try: + with tempfile.NamedTemporaryFile(mode="w", suffix=".vy", delete=False) as f: + fname = f.name + f.write(source_code) + yield Slither(fname) + finally: + Path(fname).unlink() + + return inner diff --git a/tests/unit/core/test_function_declaration.py b/tests/unit/core/test_function_declaration.py index 651f449de5..739a113bc5 100644 --- a/tests/unit/core/test_function_declaration.py +++ b/tests/unit/core/test_function_declaration.py @@ -9,6 +9,7 @@ from slither import Slither from slither.core.declarations.function import FunctionType from slither.core.solidity_types.elementary_type import ElementaryType +from slither.core.solidity_types.mapping_type import MappingType TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" FUNC_DELC_TEST_ROOT = Path(TEST_DATA_DIR, "function_declaration") @@ -302,3 +303,87 @@ def test_public_variable(solc_binary_path) -> None: assert var.signature_str == "info() returns(bytes32)" assert var.visibility == "public" assert var.type == ElementaryType("bytes32") + + +def test_vyper_functions(slither_from_vyper_source) -> None: + with slither_from_vyper_source( + """ +balances: public(HashMap[address, uint256]) +allowances: HashMap[address, HashMap[address, uint256]] +@pure +@internal +def add(x: int128, y: int128) -> int128: + return x + y +@external +def __init__(): + pass +@external +def withdraw(): + raw_call(msg.sender, b"", value= self.balances[msg.sender]) +@external +@nonreentrant("lock") +def withdraw_locked(): + raw_call(msg.sender, b"", value= self.balances[msg.sender]) +@payable +@external +def __default__(): + pass + """ + ) as sl: + contract = sl.contracts[0] + functions = contract.available_functions_as_dict() + + f = functions["add(int128,int128)"] + assert f.function_type == FunctionType.NORMAL + assert f.visibility == "internal" + assert not f.payable + assert f.view is False + assert f.pure is True + assert f.parameters[0].name == "x" + assert f.parameters[0].type == ElementaryType("int128") + assert f.parameters[1].name == "y" + assert f.parameters[1].type == ElementaryType("int128") + assert f.return_type[0] == ElementaryType("int128") + + f = functions["__init__()"] + assert f.function_type == FunctionType.CONSTRUCTOR + assert f.visibility == "external" + assert not f.payable + assert not f.view + assert not f.pure + + f = functions["__default__()"] + assert f.function_type == FunctionType.FALLBACK + assert f.visibility == "external" + assert f.payable + assert not f.view + assert not f.pure + + f = functions["withdraw()"] + assert f.function_type == FunctionType.NORMAL + assert f.visibility == "external" + assert not f.payable + assert not f.view + assert not f.pure + assert f.can_send_eth() + assert f.can_reenter() + + # f = functions["withdraw_locked()"] + # assert not f.can_reenter() + + var = contract.get_state_variable_from_name("balances") + assert var + assert var.solidity_signature == "balances(address)" + assert var.signature_str == "balances(address) returns(uint256)" + assert var.visibility == "public" + assert var.type == MappingType(ElementaryType("address"), ElementaryType("uint256")) + + var = contract.get_state_variable_from_name("allowances") + assert var + assert var.solidity_signature == "allowances(address,address)" + assert var.signature_str == "allowances(address,address) returns(uint256)" + assert var.visibility == "internal" + assert var.type == MappingType( + ElementaryType("address"), + MappingType(ElementaryType("address"), ElementaryType("uint256")), + ) diff --git a/tests/unit/slithir/vyper/__init__.py b/tests/unit/slithir/vyper/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/unit/slithir/vyper/test_ir_generation.py b/tests/unit/slithir/vyper/test_ir_generation.py new file mode 100644 index 0000000000..3ea5ea9fcd --- /dev/null +++ b/tests/unit/slithir/vyper/test_ir_generation.py @@ -0,0 +1,65 @@ +# # pylint: disable=too-many-lines +import pathlib +from argparse import ArgumentTypeError +from collections import defaultdict +from inspect import getsourcefile +from typing import Union, List, Dict, Callable + +import pytest + +from slither import Slither +from slither.core.cfg.node import Node, NodeType +from slither.core.declarations import Function, Contract +from slither.core.solidity_types import ArrayType +from slither.core.variables.local_variable import LocalVariable +from slither.core.variables.state_variable import StateVariable +from slither.slithir.operations import ( + OperationWithLValue, + Phi, + Assignment, + HighLevelCall, + Return, + Operation, + Binary, + BinaryType, + InternalCall, + Index, + InitArray, +) +from slither.slithir.utils.ssa import is_used_later +from slither.slithir.variables import ( + Constant, + ReferenceVariable, + LocalIRVariable, + StateIRVariable, + TemporaryVariableSSA, +) + + +def test_interface_conversion_and_call_resolution(slither_from_vyper_source): + with slither_from_vyper_source( + """ +interface Test: + def foo() -> (int128, uint256): nonpayable + +@internal +def foo() -> (int128, int128): + return 2, 3 + +@external +def bar(): + a: int128 = 0 + b: int128 = 0 + (a, b) = self.foo() + + x: address = 0x0000000000000000000000000000000000000000 + c: uint256 = 0 + a, c = Test(x).foo() +""" + ) as sl: + interface = next(iter(x for x in sl.contracts if x.is_interface)) + contract = next(iter(x for x in sl.contracts if not x.is_interface)) + func = contract.get_function_from_signature("bar()") + (contract, function) = func.high_level_calls[0] + assert contract == interface + assert function.signature_str == "foo() returns(int128,uint256)" From b5778ce5df4b5e4a65e8bbc38e730773f432be39 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 11:22:36 -0500 Subject: [PATCH 093/169] use curl to support windows --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 51ea634f11..ef10a19a54 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -71,7 +71,7 @@ jobs: exit 1 fi mkdir -p "$INSTALLDIR" - wget "$URL" -q -O "$INSTALLDIR/$FILENAME" + curl "$URL" -o "$INSTALLDIR/$FILENAME" chmod 755 "$INSTALLDIR/$FILENAME" echo "$INSTALLDIR" >> "$GITHUB_PATH" - name: Run ${{ matrix.type }} tests From 0fd1ed73088714ba824e1dc4258951d347df7fb0 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 13:21:48 -0500 Subject: [PATCH 094/169] follow redirects --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ef10a19a54..533940328a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -71,7 +71,7 @@ jobs: exit 1 fi mkdir -p "$INSTALLDIR" - curl "$URL" -o "$INSTALLDIR/$FILENAME" + curl "$URL" -o "$INSTALLDIR/$FILENAME" -L chmod 755 "$INSTALLDIR/$FILENAME" echo "$INSTALLDIR" >> "$GITHUB_PATH" - name: Run ${{ matrix.type }} tests From ce6d3c91c8c6bdca8b05a635d9111cfb9520948f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 13:27:35 -0500 Subject: [PATCH 095/169] point at vyper crytic-compile branch --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 70d4f71fd4..4d3a15c8f2 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ "prettytable>=3.3.0", "pycryptodome>=3.4.6", # "crytic-compile>=0.3.1,<0.4.0", - "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", + "crytic-compile@git+https://github.com/crytic/crytic-compile.git@feat/vyper-standard-json#egg=crytic-compile", "web3>=6.0.0", "eth-abi>=4.0.0", "eth-typing>=3.0.0", From 929c2af08842c13d3011f31140515a595d94f927 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 14:53:58 -0500 Subject: [PATCH 096/169] add deprecated calls to solidity only detectors --- slither/detectors/statements/deprecated_calls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/statements/deprecated_calls.py b/slither/detectors/statements/deprecated_calls.py index e59d254bb1..5e066c751e 100644 --- a/slither/detectors/statements/deprecated_calls.py +++ b/slither/detectors/statements/deprecated_calls.py @@ -31,7 +31,7 @@ class DeprecatedStandards(AbstractDetector): HELP = "Deprecated Solidity Standards" IMPACT = DetectorClassification.INFORMATIONAL CONFIDENCE = DetectorClassification.HIGH - + LANGUAGE = "solidity" WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#deprecated-standards" WIKI_TITLE = "Deprecated standards" From eadcd462c39923b2e7618f2f6da3cac1d32d9d43 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 30 Aug 2023 15:57:43 -0500 Subject: [PATCH 097/169] remove solc imports from vyper parsing --- .../vyper_parsing/expressions/expression_parsing.py | 8 ++++---- slither/vyper_parsing/expressions/find_variable.py | 10 ++++------ .../variables/function_type_variable.py | 13 ------------- 3 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 slither/vyper_parsing/variables/function_type_variable.py diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 36c7c3ee5b..60d5fe2467 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -40,8 +40,6 @@ UserDefinedType, ) from slither.core.declarations.contract import Contract -from slither.solc_parsing.declarations.caller_context import CallerContextExpression -from slither.solc_parsing.exceptions import ParsingError, VariableNotFound from slither.vyper_parsing.expressions.find_variable import find_variable from slither.vyper_parsing.type_parsing import parse_type @@ -107,6 +105,8 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": return literal if isinstance(expression, Call): + print("Call") + print(expression) called = parse_expression(expression.func, caller_context) if isinstance(called, Identifier) and isinstance(called.value, SolidityFunction): if called.value.name == "empty()": @@ -227,7 +227,7 @@ def get_type_str(x): if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" ) - + print(arguments) parsed_expr = CallExpression(called, arguments, type_str) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr @@ -235,7 +235,7 @@ def get_type_str(x): if isinstance(expression, Attribute): member_name = expression.attr if isinstance(expression.value, Name): - + print(expression) if expression.value.id == "self" and member_name != "balance": var, was_created = find_variable(member_name, caller_context) # TODO replace with self diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index 5b84570ce8..1b9f0de873 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -20,20 +20,18 @@ MappingType, TypeAlias, ) -from slither.core.variables.top_level_variable import TopLevelVariable from slither.core.variables.variable import Variable from slither.exceptions import SlitherError -from slither.solc_parsing.declarations.caller_context import CallerContextExpression from slither.solc_parsing.exceptions import VariableNotFound if TYPE_CHECKING: - from slither.solc_parsing.declarations.function import FunctionSolc - from slither.solc_parsing.declarations.contract import ContractSolc + from slither.vyper_parsing.declarations.function import FunctionVyper + def _find_variable_in_function_parser( var_name: str, - function_parser: Optional["FunctionSolc"], + function_parser: Optional["FunctionVyper"], ) -> Optional[Variable]: if function_parser is None: return None @@ -87,7 +85,7 @@ def _find_in_contract( def find_variable( var_name: str, - caller_context: CallerContextExpression, + caller_context, ) -> Tuple[ Union[ Variable, diff --git a/slither/vyper_parsing/variables/function_type_variable.py b/slither/vyper_parsing/variables/function_type_variable.py deleted file mode 100644 index 309f4d8b7b..0000000000 --- a/slither/vyper_parsing/variables/function_type_variable.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Dict - -from slither.solc_parsing.variables.variable_declaration import VariableDeclarationSolc -from slither.core.variables.function_type_variable import FunctionTypeVariable - - -class FunctionTypeVariableSolc(VariableDeclarationSolc): - def __init__(self, variable: FunctionTypeVariable, variable_data: Dict): - super().__init__(variable, variable_data) - - @property - def underlying_variable(self) -> FunctionTypeVariable: - return self._variable From d3686764b83931a734b60fbd8f7ac8200248d0c5 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 07:41:22 -0500 Subject: [PATCH 098/169] fix missing call to set_offset --- slither/vyper_parsing/expressions/expression_parsing.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 60d5fe2467..bebbf3b9ee 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -136,6 +136,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": member_type, ), ) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr elif called.value.name == "max_value()": @@ -151,6 +152,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": member_type, ), ) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr elif called.value.name == "raw_call()": From 36c60a93b0de84afa68e8ce71b3563c96545500d Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 10:30:00 -0500 Subject: [PATCH 099/169] add failing phi test --- tests/unit/slithir/vyper/test_ir_generation.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/unit/slithir/vyper/test_ir_generation.py b/tests/unit/slithir/vyper/test_ir_generation.py index 3ea5ea9fcd..704e0d27a6 100644 --- a/tests/unit/slithir/vyper/test_ir_generation.py +++ b/tests/unit/slithir/vyper/test_ir_generation.py @@ -63,3 +63,20 @@ def bar(): (contract, function) = func.high_level_calls[0] assert contract == interface assert function.signature_str == "foo() returns(int128,uint256)" + +def test_phi_entry_point_internal_call(slither_from_vyper_source): + with slither_from_vyper_source( + """ +counter: uint256 +@internal +def b(y: uint256): + self.counter = y # tainted by x, 1 + +@external +def a(x: uint256): + self.b(x) + self.b(1) +""" + ) as sl: + b = sl.contracts[0].get_function_from_signature("b(uint256)") + assert len(list(filter(lambda x: isinstance(x, Phi), b.all_slithir_operations()))) == 1 From 0efef8babf8be6169f62ad20d73c3bd4377e126c Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 12:30:21 -0500 Subject: [PATCH 100/169] add test for parsing and cfgir --- tests/e2e/vyper_parsing/__init__.py | 0 ..._vyper_cfgir_builtins_test_builtins__0.txt | 117 ++++++++++++ ...ast_parsing__vyper_cfgir_chain_test__0.txt | 13 ++ ..._parsing__vyper_cfgir_for2_for_loop__0.txt | 63 +++++++ ...slitherConstructorConstantVariables__0.txt | 19 ++ ...ast_parsing__vyper_cfgir_for3_get_D__0.txt | 62 +++++++ ...t_parsing__vyper_cfgir_for_for_loop__0.txt | 56 ++++++ ...slitherConstructorConstantVariables__0.txt | 19 ++ ...t_parsing__vyper_cfgir_if_limit_p_o__0.txt | 172 ++++++++++++++++++ .../ast_parsing__vyper_cfgir_in_bar__0.txt | 50 +++++ .../ast_parsing__vyper_cfgir_in_foo__0.txt | 51 ++++++ ...arsing__vyper_cfgir_initarry___init__0.txt | 22 +++ ...parsing__vyper_cfgir_initarry_coins__0.txt | 16 ++ ...slitherConstructorConstantVariables__0.txt | 9 + ..._parsing__vyper_cfgir_precedence_fa__0.txt | 12 ++ ..._parsing__vyper_cfgir_precedence_fb__0.txt | 4 + ...parsing__vyper_cfgir_precedence_foo__0.txt | 17 ++ ...st_parsing__vyper_cfgir_struct_test__0.txt | 13 ++ ...slitherConstructorConstantVariables__0.txt | 9 + .../ast_parsing__vyper_cfgir_tuple_bar__0.txt | 57 ++++++ .../ast_parsing__vyper_cfgir_tuple_foo__0.txt | 12 ++ tests/e2e/vyper_parsing/test_ast_parsing.py | 26 +++ tests/e2e/vyper_parsing/test_data/ERC20.vy | 22 +++ tests/e2e/vyper_parsing/test_data/builtins.vy | 31 ++++ tests/e2e/vyper_parsing/test_data/chain.vy | 4 + tests/e2e/vyper_parsing/test_data/for.vy | 32 ++++ tests/e2e/vyper_parsing/test_data/for2.vy | 26 +++ tests/e2e/vyper_parsing/test_data/for3.vy | 6 + tests/e2e/vyper_parsing/test_data/if.vy | 25 +++ tests/e2e/vyper_parsing/test_data/in.vy | 23 +++ tests/e2e/vyper_parsing/test_data/initarry.vy | 17 ++ tests/e2e/vyper_parsing/test_data/literal.vy | 20 ++ .../e2e/vyper_parsing/test_data/precedence.vy | 13 ++ tests/e2e/vyper_parsing/test_data/struct.vy | 7 + tests/e2e/vyper_parsing/test_data/tricky.vy | 15 ++ tests/e2e/vyper_parsing/test_data/tuple.vy | 19 ++ 36 files changed, 1079 insertions(+) create mode 100644 tests/e2e/vyper_parsing/__init__.py create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_slitherConstructorConstantVariables__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_slitherConstructorConstantVariables__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry___init__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fa__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_struct_test__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt create mode 100644 tests/e2e/vyper_parsing/test_ast_parsing.py create mode 100644 tests/e2e/vyper_parsing/test_data/ERC20.vy create mode 100644 tests/e2e/vyper_parsing/test_data/builtins.vy create mode 100644 tests/e2e/vyper_parsing/test_data/chain.vy create mode 100644 tests/e2e/vyper_parsing/test_data/for.vy create mode 100644 tests/e2e/vyper_parsing/test_data/for2.vy create mode 100644 tests/e2e/vyper_parsing/test_data/for3.vy create mode 100644 tests/e2e/vyper_parsing/test_data/if.vy create mode 100644 tests/e2e/vyper_parsing/test_data/in.vy create mode 100644 tests/e2e/vyper_parsing/test_data/initarry.vy create mode 100644 tests/e2e/vyper_parsing/test_data/literal.vy create mode 100644 tests/e2e/vyper_parsing/test_data/precedence.vy create mode 100644 tests/e2e/vyper_parsing/test_data/struct.vy create mode 100644 tests/e2e/vyper_parsing/test_data/tricky.vy create mode 100644 tests/e2e/vyper_parsing/test_data/tuple.vy diff --git a/tests/e2e/vyper_parsing/__init__.py b/tests/e2e/vyper_parsing/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt new file mode 100644 index 0000000000..07141a2b12 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt @@ -0,0 +1,117 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +a = block.coinbase + +IRs: +a(address) := block.coinbase(address)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +b = block.difficulty + +IRs: +b(uint256) := block.difficulty(uint256)"]; +2->3; +3[label="Node Type: NEW VARIABLE 3 + +EXPRESSION: +c = block.prevrandao + +IRs: +c(uint256) := block.prevrandao(uint256)"]; +3->4; +4[label="Node Type: NEW VARIABLE 4 + +EXPRESSION: +d = block.number + +IRs: +d(uint256) := block.number(uint256)"]; +4->5; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +e = block.prevhash + +IRs: +e(bytes32) := block.prevhash(bytes32)"]; +5->6; +6[label="Node Type: NEW VARIABLE 6 + +EXPRESSION: +f = block.timestamp + +IRs: +f(uint256) := block.timestamp(uint256)"]; +6->7; +7[label="Node Type: NEW VARIABLE 7 + +EXPRESSION: +h = chain.id + +IRs: +h(uint256) := chain.id(uint256)"]; +7->8; +8[label="Node Type: NEW VARIABLE 8 + +EXPRESSION: +i = slice()(msg.data,0,32) + +IRs: +TMP_0(None) = SOLIDITY_CALL slice()(msg.data,0,32) +i(bytes[32]) = ['TMP_0(None)']"]; +8->9; +9[label="Node Type: NEW VARIABLE 9 + +EXPRESSION: +j = msg.gas + +IRs: +j(uint256) := msg.gas(uint256)"]; +9->10; +10[label="Node Type: NEW VARIABLE 10 + +EXPRESSION: +k = msg.sender + +IRs: +k(address) := msg.sender(address)"]; +10->11; +11[label="Node Type: NEW VARIABLE 11 + +EXPRESSION: +l = msg.value + +IRs: +l(uint256) := msg.value(uint256)"]; +11->12; +12[label="Node Type: NEW VARIABLE 12 + +EXPRESSION: +m = tx.origin + +IRs: +m(address) := tx.origin(address)"]; +12->13; +13[label="Node Type: NEW VARIABLE 13 + +EXPRESSION: +n = tx.gasprice + +IRs: +n(uint256) := tx.gasprice(uint256)"]; +13->14; +14[label="Node Type: NEW VARIABLE 14 + +EXPRESSION: +x = self.balance + +IRs: +x(uint256) := self.balance(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt new file mode 100644 index 0000000000..6f12cb5302 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt @@ -0,0 +1,13 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +x = bytes32(chain.id) + +IRs: +TMP_0 = CONVERT chain.id to bytes32 +x(bytes32) := TMP_0(bytes32)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt new file mode 100644 index 0000000000..949e814fff --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt @@ -0,0 +1,63 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +_strategies = strategies + +IRs: +_strategies(address[3]) = ['strategies(address[3])']"]; +1->2; +2[label="Node Type: BEGIN_LOOP 2 +"]; +2->3; +3[label="Node Type: NEW VARIABLE 3 + +EXPRESSION: +counter_var = 0 + +IRs: +counter_var(uint256) := 0(uint256)"]; +3->4; +4[label="Node Type: IF_LOOP 4 + +EXPRESSION: +counter_var <= 10 + +IRs: +TMP_0(bool) = counter_var <= 10 +CONDITION TMP_0"]; +4->5[label="True"]; +4->7[label="False"]; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +i = counter_var + +IRs: +i(uint256) := counter_var(uint256)"]; +5->6; +6[label="Node Type: NEW VARIABLE 6 + +EXPRESSION: +max_withdraw = IStrategy(_strategies[i]).maxWithdraw(self) + +IRs: +REF_0(address) -> _strategies[i] +TMP_1 = CONVERT REF_0 to IStrategy +TMP_2(uint256) = HIGH_LEVEL_CALL, dest:TMP_1(IStrategy), function:maxWithdraw, arguments:['self'] +max_withdraw(uint256) := TMP_2(uint256)"]; +6->8; +7[label="Node Type: END_LOOP 7 +"]; +8[label="Node Type: EXPRESSION 8 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +8->4; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_slitherConstructorConstantVariables__0.txt new file mode 100644 index 0000000000..781b8e4859 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_slitherConstructorConstantVariables__0.txt @@ -0,0 +1,19 @@ +digraph{ +0[label="Node Type: OTHER_ENTRYPOINT 0 + +EXPRESSION: +x = 1 + 1 + +IRs: +TMP_3(uint256) = 1 + 1 +x(uint256) := TMP_3(uint256)"]; +0->1; +1[label="Node Type: OTHER_ENTRYPOINT 1 + +EXPRESSION: +MAX_QUEUE = 1 + x + +IRs: +TMP_4(uint256) = 1 + x +MAX_QUEUE(uint256) := TMP_4(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt new file mode 100644 index 0000000000..ae6d397b05 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt @@ -0,0 +1,62 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +S = 0 + +IRs: +S(uint256) := 0(uint256)"]; +1->2; +2[label="Node Type: BEGIN_LOOP 2 +"]; +2->3; +3[label="Node Type: NEW VARIABLE 3 + +EXPRESSION: +counter_var = 0 + +IRs: +counter_var(uint256) := 0(uint256)"]; +3->4; +4[label="Node Type: IF_LOOP 4 + +EXPRESSION: +counter_var <= len()(_xp) + +IRs: +TMP_0(uint256) = SOLIDITY_CALL len()(_xp) +TMP_1(bool) = counter_var <= TMP_0 +CONDITION TMP_1"]; +4->5[label="True"]; +4->7[label="False"]; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +x = _xp[counter_var] + +IRs: +REF_0(uint256) -> _xp[counter_var] +x(uint256) := REF_0(uint256)"]; +5->6; +6[label="Node Type: EXPRESSION 6 + +EXPRESSION: +S += x + +IRs: +S(uint256) = S (c)+ x"]; +6->8; +7[label="Node Type: END_LOOP 7 +"]; +8[label="Node Type: EXPRESSION 8 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +8->4; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt new file mode 100644 index 0000000000..210c5cec56 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt @@ -0,0 +1,56 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: BEGIN_LOOP 1 +"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +counter_var = 0 + +IRs: +counter_var(uint256) := 0(uint256)"]; +2->3; +3[label="Node Type: IF_LOOP 3 + +EXPRESSION: +counter_var <= len()(super.strategies) + +IRs: +TMP_0(uint256) = SOLIDITY_CALL len()(strategies) +TMP_1(bool) = counter_var <= TMP_0 +CONDITION TMP_1"]; +3->4[label="True"]; +3->6[label="False"]; +4[label="Node Type: NEW VARIABLE 4 + +EXPRESSION: +strategy = strategies[counter_var] + +IRs: +REF_0(address) -> strategies[counter_var] +strategy(address) := REF_0(address)"]; +4->5; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +z = IStrategy(strategy).asset() + +IRs: +TMP_2 = CONVERT strategy to IStrategy +TMP_3(address) = HIGH_LEVEL_CALL, dest:TMP_2(IStrategy), function:asset, arguments:[] +z(address) := TMP_3(address)"]; +5->7; +6[label="Node Type: END_LOOP 6 +"]; +7[label="Node Type: EXPRESSION 7 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +7->3; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_slitherConstructorConstantVariables__0.txt new file mode 100644 index 0000000000..a5e0a06f74 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_slitherConstructorConstantVariables__0.txt @@ -0,0 +1,19 @@ +digraph{ +0[label="Node Type: OTHER_ENTRYPOINT 0 + +EXPRESSION: +x = 1 + 1 + +IRs: +TMP_4(uint256) = 1 + 1 +x(uint256) := TMP_4(uint256)"]; +0->1; +1[label="Node Type: OTHER_ENTRYPOINT 1 + +EXPRESSION: +MAX_QUEUE = 1 + x + +IRs: +TMP_5(uint256) = 1 + x +MAX_QUEUE(uint256) := TMP_5(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt new file mode 100644 index 0000000000..0c7ae7d7ad --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt @@ -0,0 +1,172 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +p_new = p + +IRs: +p_new(uint256) := p(uint256)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +dt = 1 + +IRs: +dt(uint256) := 1(uint256)"]; +2->3; +3[label="Node Type: NEW VARIABLE 3 + +EXPRESSION: +ratio = 0 + +IRs: +ratio(uint256) := 0(uint256)"]; +3->4; +4[label="Node Type: IF 4 + +EXPRESSION: +dt > 0 + +IRs: +TMP_0(bool) = dt > 0 +CONDITION TMP_0"]; +4->6[label="True"]; +4->5[label="False"]; +5[label="Node Type: END_IF 5 +"]; +6[label="Node Type: NEW VARIABLE 6 + +EXPRESSION: +old_p_o = 1 + +IRs: +old_p_o(uint256) := 1(uint256)"]; +6->7; +7[label="Node Type: NEW VARIABLE 7 + +EXPRESSION: +old_ratio = 2 + +IRs: +old_ratio(uint256) := 2(uint256)"]; +7->8; +8[label="Node Type: IF 8 + +EXPRESSION: +p > old_p_o + +IRs: +TMP_1(bool) = p > old_p_o +CONDITION TMP_1"]; +8->10[label="True"]; +8->15[label="False"]; +9[label="Node Type: END_IF 9 +"]; +9->20; +10[label="Node Type: EXPRESSION 10 + +EXPRESSION: +ratio = unsafe_div()(old_p_o * 10 ** 18,p) + +IRs: +TMP_2(uint256) = 10 (c)** 18 +TMP_3(uint256) = old_p_o (c)* TMP_2 +TMP_4(None) = SOLIDITY_CALL unsafe_div()(TMP_3,p) +ratio(uint256) := TMP_4(None)"]; +10->11; +11[label="Node Type: IF 11 + +EXPRESSION: +ratio < 10 ** 36 / 1 + +IRs: +TMP_5(uint256) = 10 (c)** 36 +TMP_6(uint256) = TMP_5 (c)/ 1 +TMP_7(bool) = ratio < TMP_6 +CONDITION TMP_7"]; +11->13[label="True"]; +11->12[label="False"]; +12[label="Node Type: END_IF 12 +"]; +12->9; +13[label="Node Type: EXPRESSION 13 + +EXPRESSION: +p_new = unsafe_div()(old_p_o * 1,10 ** 18) + +IRs: +TMP_8(uint256) = old_p_o (c)* 1 +TMP_9(uint256) = 10 (c)** 18 +TMP_10(None) = SOLIDITY_CALL unsafe_div()(TMP_8,TMP_9) +p_new(uint256) := TMP_10(None)"]; +13->14; +14[label="Node Type: EXPRESSION 14 + +EXPRESSION: +ratio = 10 ** 36 / 1 + +IRs: +TMP_11(uint256) = 10 (c)** 36 +TMP_12(uint256) = TMP_11 (c)/ 1 +ratio(uint256) := TMP_12(uint256)"]; +14->12; +15[label="Node Type: EXPRESSION 15 + +EXPRESSION: +ratio = unsafe_div()(p * 10 ** 18,old_p_o) + +IRs: +TMP_13(uint256) = 10 (c)** 18 +TMP_14(uint256) = p (c)* TMP_13 +TMP_15(None) = SOLIDITY_CALL unsafe_div()(TMP_14,old_p_o) +ratio(uint256) := TMP_15(None)"]; +15->16; +16[label="Node Type: IF 16 + +EXPRESSION: +ratio < 10 ** 36 / 1 + +IRs: +TMP_16(uint256) = 10 (c)** 36 +TMP_17(uint256) = TMP_16 (c)/ 1 +TMP_18(bool) = ratio < TMP_17 +CONDITION TMP_18"]; +16->18[label="True"]; +16->17[label="False"]; +17[label="Node Type: END_IF 17 +"]; +17->9; +18[label="Node Type: EXPRESSION 18 + +EXPRESSION: +p_new = unsafe_div()(old_p_o * 10 ** 18,1) + +IRs: +TMP_19(uint256) = 10 (c)** 18 +TMP_20(uint256) = old_p_o (c)* TMP_19 +TMP_21(None) = SOLIDITY_CALL unsafe_div()(TMP_20,1) +p_new(uint256) := TMP_21(None)"]; +18->19; +19[label="Node Type: EXPRESSION 19 + +EXPRESSION: +ratio = 10 ** 36 / 1 + +IRs: +TMP_22(uint256) = 10 (c)** 36 +TMP_23(uint256) = TMP_22 (c)/ 1 +ratio(uint256) := TMP_23(uint256)"]; +19->17; +20[label="Node Type: EXPRESSION 20 + +EXPRESSION: +ratio = 1 + +IRs: +ratio(uint256) := 1(uint256)"]; +20->5; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt new file mode 100644 index 0000000000..7bf9052b8c --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt @@ -0,0 +1,50 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +a = 0 + +IRs: +a(int128) := 0(uint256)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +b = 0 + +IRs: +b(int128) := 0(uint256)"]; +2->3; +3[label="Node Type: IF 3 + +EXPRESSION: +x & 1 | 2 + +IRs: +TMP_0(uint256) = 1 | 2 +TMP_1(in.Roles) = x & TMP_0 +CONDITION TMP_1"]; +3->5[label="True"]; +3->4[label="False"]; +4[label="Node Type: END_IF 4 +"]; +4->6; +5[label="Node Type: RETURN 5 + +EXPRESSION: +True + +IRs: +RETURN True"]; +5->4; +6[label="Node Type: RETURN 6 + +EXPRESSION: +False + +IRs: +RETURN False"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt new file mode 100644 index 0000000000..b9d3da07ea --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt @@ -0,0 +1,51 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +a = 0 + +IRs: +a(int128) := 0(uint256)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +b = 0 + +IRs: +b(int128) := 0(uint256)"]; +2->3; +3[label="Node Type: IF 3 + +EXPRESSION: +x == b || x == a + +IRs: +TMP_2(bool) = x == b +TMP_3(bool) = x == a +TMP_4(bool) = TMP_2 || TMP_3 +CONDITION TMP_4"]; +3->5[label="True"]; +3->4[label="False"]; +4[label="Node Type: END_IF 4 +"]; +4->6; +5[label="Node Type: RETURN 5 + +EXPRESSION: +True + +IRs: +RETURN True"]; +5->4; +6[label="Node Type: RETURN 6 + +EXPRESSION: +False + +IRs: +RETURN False"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry___init__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry___init__0.txt new file mode 100644 index 0000000000..e3417a8942 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry___init__0.txt @@ -0,0 +1,22 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: EXPRESSION 1 + +EXPRESSION: +BORROWED_TOKEN = ERC20(x) + +IRs: +TMP_0 = CONVERT x to ERC20 +BORROWED_TOKEN(ERC20) := TMP_0(ERC20)"]; +1->2; +2[label="Node Type: EXPRESSION 2 + +EXPRESSION: +COLLATERAL_TOKEN = ERC20(y) + +IRs: +TMP_1 = CONVERT y to ERC20 +COLLATERAL_TOKEN(ERC20) := TMP_1(ERC20)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt new file mode 100644 index 0000000000..15a091f260 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt @@ -0,0 +1,16 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: RETURN 1 + +EXPRESSION: +(address(BORROWED_TOKEN),address(COLLATERAL_TOKEN))[i] + +IRs: +TMP_2 = CONVERT BORROWED_TOKEN to address +TMP_3 = CONVERT COLLATERAL_TOKEN to address +TMP_4(address[2]) = ['TMP_2(address)', 'TMP_3(address)'] +REF_0(address) -> TMP_4[i] +RETURN REF_0"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt new file mode 100644 index 0000000000..b53263a8d7 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt @@ -0,0 +1,9 @@ +digraph{ +0[label="Node Type: OTHER_ENTRYPOINT 0 + +EXPRESSION: +MAX_BANDS = 10 + +IRs: +MAX_BANDS(uint256) := 10(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fa__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fa__0.txt new file mode 100644 index 0000000000..9d3526f54e --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fa__0.txt @@ -0,0 +1,12 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: RETURN 1 + +EXPRESSION: +1 + +IRs: +RETURN 1"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt new file mode 100644 index 0000000000..b799f07d43 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt @@ -0,0 +1,4 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt new file mode 100644 index 0000000000..802e03ad17 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt @@ -0,0 +1,17 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: RETURN 1 + +EXPRESSION: +x != super.fb() && x != super.fa() + +IRs: +TMP_0(uint256) = INTERNAL_CALL, precedence.fb()() +TMP_1(bool) = x != TMP_0 +TMP_2(uint256) = INTERNAL_CALL, precedence.fa()() +TMP_3(bool) = x != TMP_2 +TMP_4(bool) = TMP_1 && TMP_3 +RETURN TMP_4"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_struct_test__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_struct_test__0.txt new file mode 100644 index 0000000000..d8c540f213 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_struct_test__0.txt @@ -0,0 +1,13 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: RETURN 1 + +EXPRESSION: +X(1) + +IRs: +TMP_0(struct.X) = new X(1) +RETURN TMP_0"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt new file mode 100644 index 0000000000..753f5a9385 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt @@ -0,0 +1,9 @@ +digraph{ +0[label="Node Type: OTHER_ENTRYPOINT 0 + +EXPRESSION: +MAX_TICKS_UINT = 50 + +IRs: +MAX_TICKS_UINT(uint256) := 50(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt new file mode 100644 index 0000000000..35b37282c0 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt @@ -0,0 +1,57 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +a = 0 + +IRs: +a(int128) := 0(uint256)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +b = 0 + +IRs: +b(int128) := 0(uint256)"]; +2->3; +3[label="Node Type: EXPRESSION 3 + +EXPRESSION: +(a,b) = super.foo() + +IRs: +TUPLE_0(int128,int128) = INTERNAL_CALL, tuple.foo()() +a(int128)= UNPACK TUPLE_0 index: 0 +b(int128)= UNPACK TUPLE_0 index: 1 "]; +3->4; +4[label="Node Type: NEW VARIABLE 4 + +EXPRESSION: +x = 0x0000000000000000000000000000000000000000 + +IRs: +x(address) := 0(address)"]; +4->5; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +c = 0 + +IRs: +c(uint256) := 0(uint256)"]; +5->6; +6[label="Node Type: EXPRESSION 6 + +EXPRESSION: +(a,c) = Test(x).foo() + +IRs: +TMP_0 = CONVERT x to Test +TUPLE_1(int128,uint256) = HIGH_LEVEL_CALL, dest:TMP_0(Test), function:foo, arguments:[] +a(int128)= UNPACK TUPLE_1 index: 0 +c(uint256)= UNPACK TUPLE_1 index: 1 "]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt new file mode 100644 index 0000000000..8d1c1166b2 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt @@ -0,0 +1,12 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: RETURN 1 + +EXPRESSION: +(2,3) + +IRs: +RETURN 2,3"]; +} diff --git a/tests/e2e/vyper_parsing/test_ast_parsing.py b/tests/e2e/vyper_parsing/test_ast_parsing.py new file mode 100644 index 0000000000..8529f3e1c0 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_ast_parsing.py @@ -0,0 +1,26 @@ +from typing import Dict +from pathlib import Path +from slither import Slither + +TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" + +ALL_TESTS = list(Path(TEST_DATA_DIR).glob("*.vy")) + + +def pytest_generate_tests(metafunc): + test_cases = [] + for test_file in ALL_TESTS: + sl = Slither(test_file.as_posix()) + for contract in sl.contracts: + if contract.is_interface: + continue + for func_or_modifier in contract.functions: + test_cases.append( + (func_or_modifier.canonical_name, func_or_modifier.slithir_cfg_to_dot_str()) + ) + + metafunc.parametrize("test_case", test_cases, ids=lambda x: x[0]) + + +def test_vyper_cfgir(test_case, snapshot): + assert snapshot() == test_case[1] diff --git a/tests/e2e/vyper_parsing/test_data/ERC20.vy b/tests/e2e/vyper_parsing/test_data/ERC20.vy new file mode 100644 index 0000000000..682b8cf268 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/ERC20.vy @@ -0,0 +1,22 @@ + + +interface ERC20: + + def totalSupply() -> uint256: view + + + + def balanceOf(_owner: address) -> uint256: view + + + + def allowance(_owner: address, _spender: address) -> uint256: view + + + def transfer(_to: address, _value: uint256) -> bool: nonpayable + + + def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable + + + def approve(_spender: address, _value: uint256) -> bool: nonpayable diff --git a/tests/e2e/vyper_parsing/test_data/builtins.vy b/tests/e2e/vyper_parsing/test_data/builtins.vy new file mode 100644 index 0000000000..4fb908a094 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/builtins.vy @@ -0,0 +1,31 @@ + +@payable +@external +def test_builtins(): + a: address = block.coinbase + + b: uint256 = block.difficulty + + c: uint256 = block.prevrandao + + d: uint256 = block.number + + e: bytes32 = block.prevhash + + f: uint256 = block.timestamp + + h: uint256 = chain.id + + i: Bytes[32] = slice(msg.data, 0, 32) + + j: uint256 = msg.gas + + k: address = msg.sender + + l: uint256 = msg.value + + m: address = tx.origin + + n: uint256 = tx.gasprice + + x: uint256 = self.balance diff --git a/tests/e2e/vyper_parsing/test_data/chain.vy b/tests/e2e/vyper_parsing/test_data/chain.vy new file mode 100644 index 0000000000..81a7704794 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/chain.vy @@ -0,0 +1,4 @@ + +@external +def test(): + x: bytes32 = convert(chain.id, bytes32) \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/for.vy b/tests/e2e/vyper_parsing/test_data/for.vy new file mode 100644 index 0000000000..b9f09bf6f6 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/for.vy @@ -0,0 +1,32 @@ + + +x: constant(uint256) = 1 + 1 +MAX_QUEUE: constant(uint256) = 1 + x + +interface IStrategy: + def asset() -> address: view + def balanceOf(owner: address) -> uint256: view + def maxDeposit(receiver: address) -> uint256: view + def maxWithdraw(owner: address) -> uint256: view + def withdraw(amount: uint256, receiver: address, owner: address) -> uint256: nonpayable + def redeem(shares: uint256, receiver: address, owner: address) -> uint256: nonpayable + def deposit(assets: uint256, receiver: address) -> uint256: nonpayable + def totalAssets() -> (uint256): view + def convertToAssets(shares: uint256) -> uint256: view + def convertToShares(assets: uint256) -> uint256: view + def previewWithdraw(assets: uint256) -> uint256: view + + + + +struct X: + y: int8 + +strategies: public(DynArray[address, MAX_QUEUE]) + +@external +def for_loop(): + + for strategy in self.strategies: + z: address = IStrategy(strategy).asset() + diff --git a/tests/e2e/vyper_parsing/test_data/for2.vy b/tests/e2e/vyper_parsing/test_data/for2.vy new file mode 100644 index 0000000000..f129e56b72 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/for2.vy @@ -0,0 +1,26 @@ + + +x: constant(uint256) = 1 + 1 +MAX_QUEUE: constant(uint256) = 1 + x + +interface IStrategy: + def asset() -> address: view + def balanceOf(owner: address) -> uint256: view + def maxDeposit(receiver: address) -> uint256: view + def maxWithdraw(owner: address) -> uint256: view + def withdraw(amount: uint256, receiver: address, owner: address) -> uint256: nonpayable + def redeem(shares: uint256, receiver: address, owner: address) -> uint256: nonpayable + def deposit(assets: uint256, receiver: address) -> uint256: nonpayable + def totalAssets() -> (uint256): view + def convertToAssets(shares: uint256) -> uint256: view + def convertToShares(assets: uint256) -> uint256: view + def previewWithdraw(assets: uint256) -> uint256: view + +@external +def for_loop(strategies: DynArray[address, MAX_QUEUE]): + _strategies: DynArray[address, MAX_QUEUE] = strategies + + for i in range(10): + + max_withdraw: uint256 = IStrategy(_strategies[i]).maxWithdraw(self) + diff --git a/tests/e2e/vyper_parsing/test_data/for3.vy b/tests/e2e/vyper_parsing/test_data/for3.vy new file mode 100644 index 0000000000..4b55b6970a --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/for3.vy @@ -0,0 +1,6 @@ + +@external +def get_D(_xp: uint256[3], _amp: uint256): + S: uint256 = 0 + for x in _xp: + S += x \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/if.vy b/tests/e2e/vyper_parsing/test_data/if.vy new file mode 100644 index 0000000000..23483ca455 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/if.vy @@ -0,0 +1,25 @@ +@external +@view +def limit_p_o(p: uint256): + p_new: uint256 = p + dt: uint256 = 1 + ratio: uint256 = 0 + + if dt > 0: + old_p_o: uint256 = 1 + old_ratio: uint256 = 2 + # ratio = p_o_min / p_o_max + if p > old_p_o: + ratio = unsafe_div(old_p_o * 10**18, p) + if ratio < 10**36 / 1: + p_new = unsafe_div(old_p_o * 1, 10**18) + ratio = 10**36 / 1 + else: + ratio = unsafe_div(p * 10**18, old_p_o) + if ratio < 10**36 / 1: + p_new = unsafe_div(old_p_o * 10**18, 1) + ratio = 10**36 / 1 + + # ratio is guaranteed to be less than 1e18 + # Also guaranteed to be limited, therefore can have all ops unsafe + ratio = 1 diff --git a/tests/e2e/vyper_parsing/test_data/in.vy b/tests/e2e/vyper_parsing/test_data/in.vy new file mode 100644 index 0000000000..e08f71a749 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/in.vy @@ -0,0 +1,23 @@ +enum Roles: + A + B + +roles: public(HashMap[address, Roles]) + +@external +def bar(x: Roles) -> bool: + a: int128 = 0 + b: int128 = 0 + + if x in self.roles[self]: + return True + return False + +@external +def foo(x: int128) -> bool: + a: int128 = 0 + b: int128 = 0 + + if x in [a, b]: + return True + return False \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/initarry.vy b/tests/e2e/vyper_parsing/test_data/initarry.vy new file mode 100644 index 0000000000..bfbd29a27f --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/initarry.vy @@ -0,0 +1,17 @@ +interface ERC20: + def transfer(_to: address, _value: uint256) -> bool: nonpayable + def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable + def approve(_spender: address, _value: uint256) -> bool: nonpayable + +BORROWED_TOKEN: immutable(ERC20) # x +COLLATERAL_TOKEN: immutable(ERC20) # x + +@external +def __init__(x: address, y: address): + BORROWED_TOKEN = ERC20(x) + COLLATERAL_TOKEN = ERC20(y) + +@external +@pure +def coins(i: uint256) -> address: + return [BORROWED_TOKEN.address, COLLATERAL_TOKEN.address][i] \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/literal.vy b/tests/e2e/vyper_parsing/test_data/literal.vy new file mode 100644 index 0000000000..e0686301e7 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/literal.vy @@ -0,0 +1,20 @@ +name: public(String[64]) +symbol: public(String[32]) +decimals: public(uint256) +totalSupply: public(uint256) + + + + +balances: HashMap[address, uint256] +allowances: HashMap[address, HashMap[address, uint256]] + + +MAX_BANDS: constant(uint256) = 10 + +x: public(uint256[3][4]) +y: public(uint256[2]) + +struct Loan: + liquidation_range: DynArray[uint256, MAX_BANDS] + deposit_amounts: DynArray[uint256, MAX_BANDS] \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/precedence.vy b/tests/e2e/vyper_parsing/test_data/precedence.vy new file mode 100644 index 0000000000..ec86186632 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/precedence.vy @@ -0,0 +1,13 @@ +@internal +def fa() -> uint256: + return 1 + +@internal +def fb() -> uint256: + raise + +@external +def foo(x: uint256) -> bool: + return x not in [self.fa(), self.fb()] + + diff --git a/tests/e2e/vyper_parsing/test_data/struct.vy b/tests/e2e/vyper_parsing/test_data/struct.vy new file mode 100644 index 0000000000..97c6f5589e --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/struct.vy @@ -0,0 +1,7 @@ +struct X: + y: int8 + + +@external +def test() -> X: + return X({y: 1}) diff --git a/tests/e2e/vyper_parsing/test_data/tricky.vy b/tests/e2e/vyper_parsing/test_data/tricky.vy new file mode 100644 index 0000000000..83b19cb895 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/tricky.vy @@ -0,0 +1,15 @@ +interface LMGauge: + def callback_collateral_shares(n: int256, collateral_per_share: DynArray[uint256, MAX_TICKS_UINT]): nonpayable + def callback_user_shares(user: address, n: int256, user_shares: DynArray[uint256, MAX_TICKS_UINT]): nonpayable + + +MAX_TICKS_UINT: constant(uint256) = 50 + + +struct Loan: + liquidation_range: LMGauge + +x: public(Loan) + + +# TODO Will this overly complicate analyzing AST https://github.com/vyperlang/vyper/pull/3411 \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/tuple.vy b/tests/e2e/vyper_parsing/test_data/tuple.vy new file mode 100644 index 0000000000..f0c7e66fe8 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/tuple.vy @@ -0,0 +1,19 @@ + + +interface Test: + def foo() -> (int128, uint256): nonpayable + +@internal +def foo() -> (int128, int128): + return 2, 3 + +@external +def bar(): + a: int128 = 0 + b: int128 = 0 + (a, b) = self.foo() + + x: address = 0x0000000000000000000000000000000000000000 + c: uint256 = 0 + a, c = Test(x).foo() + From 08af1ee9e5edf1ccb8392bc415626b9dc8a9c762 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 12:42:02 -0500 Subject: [PATCH 101/169] cleanup FunctionVyper --- .../vyper_parsing/declarations/function.py | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 98c3728080..17bbf6910c 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -19,6 +19,7 @@ if TYPE_CHECKING: from slither.core.compilation_unit import SlitherCompilationUnit + from slither.vyper_parsing.declarations.contract import ContractVyper def link_underlying_nodes(node1: NodeVyper, node2: NodeVyper): @@ -40,8 +41,9 @@ def __init__( self._function.name = function_data.name self._function.id = function_data.node_id - self._local_variables_parser: List = [] + self._local_variables_parser: List[LocalVariableVyper] = [] self._contract_parser = contract_parser + self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} for decorator in function_data.decorators: if not hasattr(decorator, "id"): @@ -54,6 +56,8 @@ def __init__( self._function.pure = True elif decorator.id == "payable": self._function.payable = True + elif decorator.id == "nonpayable": + self._function.payable = False else: raise ValueError(f"Unknown decorator {decorator.id}") # Interfaces do not have decorators and are external @@ -64,24 +68,9 @@ def __init__( self._content_was_analyzed = False self._counter_scope_local_variables = 0 - # # variable renamed will map the solc id - # # to the variable. It only works for compact format - # # Later if an expression provides the referencedDeclaration attr - # # we can retrieve the variable - # # It only matters if two variables have the same name in the function - # # which is only possible with solc > 0.5 - # self._variables_renamed: Dict[ - # int, Union[LocalVariableVyper, LocalVariableInitFromTupleSolc] - # ] = {} self._analyze_function_type() - # self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} - # self._node_to_yulobject: Dict[Node, YulBlock] = {} - - # self._local_variables_parser: List[ - # Union[LocalVariableVyper, LocalVariableInitFromTupleSolc] - # ] = [] if function_data.doc_string is not None: function.has_documentation = True @@ -107,12 +96,9 @@ def variables_renamed( return self._variables_renamed def _add_local_variable(self, local_var_parser: LocalVariableVyper) -> None: - # If two local variables have the same name - # We add a suffix to the new variable - # This is done to prevent collision during SSA translation - # Use of while in case of collision - # In the worst case, the name will be really long - # TODO no shadowing? + # Ensure variables name are unique for SSA conversion + # This should not apply to actual Vyper variables currently + # but is necessary if we have nested loops where we've created artificial variables e.g. counter_var if local_var_parser.underlying_variable.name: known_variables = [v.name for v in self._function.variables] while local_var_parser.underlying_variable.name in known_variables: From f9633ca67a25a0b5850a66fdbc3330b91babb271 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 13:34:16 -0500 Subject: [PATCH 102/169] fix name resolution for shadowed state variable --- slither/core/expressions/__init__.py | 1 + slither/core/expressions/self_identifier.py | 6 ++++++ .../expressions/expression_parsing.py | 17 +++++++---------- .../vyper_parsing/expressions/find_variable.py | 13 +++++++------ ...ast_parsing__vyper_cfgir_for_for_loop__0.txt | 2 +- ...t_parsing__vyper_cfgir_precedence_foo__0.txt | 2 +- .../ast_parsing__vyper_cfgir_tuple_bar__0.txt | 2 +- .../test_data/src_mapping/SelfIdentifier.vy | 4 ++++ tests/unit/core/test_source_mapping.py | 13 +++++++++++++ 9 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 slither/core/expressions/self_identifier.py create mode 100644 tests/unit/core/test_data/src_mapping/SelfIdentifier.vy diff --git a/slither/core/expressions/__init__.py b/slither/core/expressions/__init__.py index 42554bf0bc..b162481ba2 100644 --- a/slither/core/expressions/__init__.py +++ b/slither/core/expressions/__init__.py @@ -12,6 +12,7 @@ from .new_elementary_type import NewElementaryType from .super_call_expression import SuperCallExpression from .super_identifier import SuperIdentifier +from .self_identifier import SelfIdentifier from .tuple_expression import TupleExpression from .type_conversion import TypeConversion from .unary_operation import UnaryOperation, UnaryOperationType diff --git a/slither/core/expressions/self_identifier.py b/slither/core/expressions/self_identifier.py new file mode 100644 index 0000000000..b86d70baf4 --- /dev/null +++ b/slither/core/expressions/self_identifier.py @@ -0,0 +1,6 @@ +from slither.core.expressions.identifier import Identifier + + +class SelfIdentifier(Identifier): + def __str__(self): + return "self." + str(self._value) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index bebbf3b9ee..9996df8a8e 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -20,7 +20,7 @@ NewContract, NewElementaryType, SuperCallExpression, - SuperIdentifier, + SelfIdentifier, TupleExpression, TypeConversion, UnaryOperation, @@ -42,7 +42,7 @@ from slither.core.declarations.contract import Contract from slither.vyper_parsing.expressions.find_variable import find_variable from slither.vyper_parsing.type_parsing import parse_type - +from slither.all_exceptions import ParsingError if TYPE_CHECKING: from slither.core.expressions.expression import Expression @@ -237,14 +237,14 @@ def get_type_str(x): if isinstance(expression, Attribute): member_name = expression.attr if isinstance(expression.value, Name): - print(expression) + # TODO this is ambiguous because it could be a state variable or a call to balance if expression.value.id == "self" and member_name != "balance": - var, was_created = find_variable(member_name, caller_context) - # TODO replace with self + var, was_created = find_variable(member_name, caller_context, is_self=True) if was_created: var.set_offset(expression.src, caller_context.compilation_unit) - parsed_expr = SuperIdentifier(var) + parsed_expr = SelfIdentifier(var) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + var.references.append(parsed_expr.source_mapping) return parsed_expr expr = parse_expression(expression.value, caller_context) @@ -267,12 +267,11 @@ def get_type_str(x): # (recover_type_1) This may be a call to an interface and we don't have the return types, # so we see if there's a function identifier with `member_name` and propagate the type to # its enclosing `CallExpression` - # TODO this is using the wrong caller_context and needs to be interface instead of self namespace print(expr) print(expr.__class__.__name__) if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType): - # try: + # If we access a member of an interface, needs to be interface instead of self namespace var, was_created = find_variable(member_name, expr.type.type) if isinstance(var, Function): rets = var.returns @@ -288,8 +287,6 @@ def get_type_str(x): else f"tuple({','.join(map(get_type_str, rets))})" ) member_name_ret_type = type_str - # except: - # pass member_access = MemberAccess(member_name, member_name_ret_type, expr) diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index 1b9f0de873..e888aa0148 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -28,7 +28,6 @@ from slither.vyper_parsing.declarations.function import FunctionVyper - def _find_variable_in_function_parser( var_name: str, function_parser: Optional["FunctionVyper"], @@ -86,6 +85,7 @@ def _find_in_contract( def find_variable( var_name: str, caller_context, + is_self: bool = False, ) -> Tuple[ Union[ Variable, @@ -96,8 +96,6 @@ def find_variable( Event, Enum, Structure, - CustomError, - TypeAlias, ], bool, ]: @@ -136,9 +134,12 @@ def find_variable( caller_context if isinstance(caller_context, FunctionContract) else None ) # print("function_parser", function_parser) - ret1 = _find_variable_in_function_parser(var_name, function_parser) - if ret1: - return ret1, False + # If a local shadows a state variable but the attribute is `self`, we want to + # return the state variable and not the local. + if not is_self: + ret1 = _find_variable_in_function_parser(var_name, function_parser) + if ret1: + return ret1, False ret = _find_in_contract(var_name, next_context, caller_context) if ret: diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt index 210c5cec56..5c4123662f 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt @@ -16,7 +16,7 @@ counter_var(uint256) := 0(uint256)"]; 3[label="Node Type: IF_LOOP 3 EXPRESSION: -counter_var <= len()(super.strategies) +counter_var <= len()(self.strategies) IRs: TMP_0(uint256) = SOLIDITY_CALL len()(strategies) diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt index 802e03ad17..2355fd513a 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt @@ -5,7 +5,7 @@ digraph{ 1[label="Node Type: RETURN 1 EXPRESSION: -x != super.fb() && x != super.fa() +x != self.fb() && x != self.fa() IRs: TMP_0(uint256) = INTERNAL_CALL, precedence.fb()() diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt index 35b37282c0..0d2540498a 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt @@ -21,7 +21,7 @@ b(int128) := 0(uint256)"]; 3[label="Node Type: EXPRESSION 3 EXPRESSION: -(a,b) = super.foo() +(a,b) = self.foo() IRs: TUPLE_0(int128,int128) = INTERNAL_CALL, tuple.foo()() diff --git a/tests/unit/core/test_data/src_mapping/SelfIdentifier.vy b/tests/unit/core/test_data/src_mapping/SelfIdentifier.vy new file mode 100644 index 0000000000..5607fb9438 --- /dev/null +++ b/tests/unit/core/test_data/src_mapping/SelfIdentifier.vy @@ -0,0 +1,4 @@ +name: public(String[64]) +@external +def __init__(name: String[64]): + self.name = name diff --git a/tests/unit/core/test_source_mapping.py b/tests/unit/core/test_source_mapping.py index fe53359777..16a26215b6 100644 --- a/tests/unit/core/test_source_mapping.py +++ b/tests/unit/core/test_source_mapping.py @@ -113,3 +113,16 @@ def test_references_user_defined_types_when_casting(solc_binary_path): assert len(a.references) == 2 lines = _sort_references_lines(a.references) assert lines == [12, 18] + +def test_references_self_identifier(): + """ + Tests that shadowing state variables with local variables does not affect references. + """ + file = Path(SRC_MAPPING_TEST_ROOT, "SelfIdentifier.vy").as_posix() + slither = Slither(file) + + contracts = slither.compilation_units[0].contracts + a = contracts[0].state_variables[0] + assert len(a.references) == 1 + lines = _sort_references_lines(a.references) + assert lines == [4] \ No newline at end of file From 2dbb912bb72278c5e15047f95bccfb219e310396 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 13:46:26 -0500 Subject: [PATCH 103/169] correctly set indexed attribute for event variables --- slither/vyper_parsing/variables/event_variable.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/slither/vyper_parsing/variables/event_variable.py b/slither/vyper_parsing/variables/event_variable.py index 10b8aa06cc..2dc5db5441 100644 --- a/slither/vyper_parsing/variables/event_variable.py +++ b/slither/vyper_parsing/variables/event_variable.py @@ -2,7 +2,7 @@ from slither.core.variables.event_variable import EventVariable from slither.vyper_parsing.type_parsing import parse_type -from slither.vyper_parsing.ast.types import AnnAssign +from slither.vyper_parsing.ast.types import AnnAssign, Call class EventVariableVyper: @@ -10,7 +10,10 @@ def __init__(self, variable: EventVariable, variable_data: AnnAssign): print(variable_data) self._variable = variable self._variable.name = variable_data.target.id - # TODO self._variable.indexed + if isinstance(variable_data.annotation, Call) and variable_data.annotation.func.id == "indexed": + self._variable.indexed = True + else: + self._variable.indexed = False self._elem_to_parse = variable_data.annotation @property From f7ef48401ed8d8c51956dcaaa1842c953b511a8a Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 15:53:03 -0500 Subject: [PATCH 104/169] very simplistic support for reentrancy lock --- slither/core/declarations/function.py | 4 +- .../vyper_parsing/declarations/function.py | 72 +++++++++++++------ tests/unit/core/test_function_declaration.py | 4 +- 3 files changed, 55 insertions(+), 25 deletions(-) diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index 0f1955a923..e9f9552e94 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -1499,7 +1499,9 @@ def is_reentrant(self) -> bool: Determine if the function can be re-entered """ # TODO: compare with hash of known nonReentrant modifier instead of the name - if "nonReentrant" in [m.name for m in self.modifiers]: + if "nonReentrant" in [m.name for m in self.modifiers] or "nonreentrant(lock)" in [ + m.name for m in self.modifiers + ]: return False if self.visibility in ["public", "external"]: diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 17bbf6910c..850ff08b63 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -8,7 +8,8 @@ Function, FunctionType, ) -from slither.core.declarations.function_contract import FunctionContract +from slither.core.declarations.function import ModifierStatements +from slither.core.declarations.modifier import Modifier from slither.core.expressions import AssignmentOperation from slither.core.source_mapping.source_mapping import Source from slither.core.variables.local_variable import LocalVariable @@ -33,48 +34,47 @@ def __init__( function_data: Dict, contract_parser: "ContractVyper", ) -> None: - self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} self._function = function - print(function_data.name) - print(function_data) self._function.name = function_data.name self._function.id = function_data.node_id - + self._functionNotParsed = function_data + self._decoratorNotParsed = None self._local_variables_parser: List[LocalVariableVyper] = [] self._contract_parser = contract_parser self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} for decorator in function_data.decorators: - if not hasattr(decorator, "id"): - continue # TODO isinstance Name - if decorator.id in ["external", "public", "internal"]: - self._function.visibility = decorator.id - elif decorator.id == "view": - self._function.view = True - elif decorator.id == "pure": - self._function.pure = True - elif decorator.id == "payable": - self._function.payable = True - elif decorator.id == "nonpayable": - self._function.payable = False + if isinstance(decorator, Call): + # TODO handle multiple + self._decoratorNotParsed = decorator + elif isinstance(decorator, Name): + if decorator.id in ["external", "public", "internal"]: + self._function.visibility = decorator.id + elif decorator.id == "view": + self._function.view = True + elif decorator.id == "pure": + self._function.pure = True + elif decorator.id == "payable": + self._function.payable = True + elif decorator.id == "nonpayable": + self._function.payable = False else: raise ValueError(f"Unknown decorator {decorator.id}") + # Interfaces do not have decorators and are external if self._function._visibility is None: self._function.visibility = "external" - self._functionNotParsed = function_data + self._params_was_analyzed = False self._content_was_analyzed = False - self._counter_scope_local_variables = 0 - self._analyze_function_type() - - if function_data.doc_string is not None: function.has_documentation = True + self._analyze_function_type() + @property def underlying_function(self) -> Function: return self._function @@ -166,6 +166,34 @@ def analyze_content(self) -> None: for node_parser in self._node_to_NodeVyper.values(): node_parser.analyze_expressions(self._function) + self._analyze_decorator() + + def _analyze_decorator(self) -> None: + if not self._decoratorNotParsed: + return + + decorator = self._decoratorNotParsed + if decorator.args: + name = f"{decorator.func.id}({decorator.args[0].value})" + else: + name = decorator.func.id + + contract = self._contract_parser.underlying_contract + compilation_unit = self._contract_parser.underlying_contract.compilation_unit + modifier = Modifier(compilation_unit) + modifier._name = name + modifier.set_offset(decorator.src, compilation_unit) + modifier.set_contract(contract) + modifier.set_contract_declarer(contract) + latest_entry_point = self._function.entry_point + self._function.add_modifier( + ModifierStatements( + modifier=modifier, + entry_point=latest_entry_point, + nodes=[latest_entry_point], + ) + ) + # endregion ################################################################################### ################################################################################### diff --git a/tests/unit/core/test_function_declaration.py b/tests/unit/core/test_function_declaration.py index 739a113bc5..2dc8192a1f 100644 --- a/tests/unit/core/test_function_declaration.py +++ b/tests/unit/core/test_function_declaration.py @@ -368,8 +368,8 @@ def __default__(): assert f.can_send_eth() assert f.can_reenter() - # f = functions["withdraw_locked()"] - # assert not f.can_reenter() + f = functions["withdraw_locked()"] + assert not f.is_reentrant var = contract.get_state_variable_from_name("balances") assert var From 4b10a0fa18e7604aed6a5e8076a056e4977caafc Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 15:54:26 -0500 Subject: [PATCH 105/169] delete commented out code --- slither/__main__.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/slither/__main__.py b/slither/__main__.py index e68f0b67f1..ab15c72d87 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -870,12 +870,6 @@ def main_impl( logging.error(red(output_error)) logging.error("Please report an issue to https://github.com/crytic/slither/issues") - # except Exception: # pylint: disable=broad-except - # output_error = traceback.format_exc() - # traceback.print_exc() - # logging.error(f"Error in {args.filename}") # pylint: disable=logging-fstring-interpolation - # logging.error(output_error) - # If we are outputting JSON, capture the redirected output and disable the redirect to output the final JSON. if outputting_json: if "console" in args.json_types: From e561d33eb18e086fe4da751cd86cfa1c1e1ebf7b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 31 Aug 2023 17:37:30 -0500 Subject: [PATCH 106/169] try removing trailing comment --- tests/e2e/vyper_parsing/test_data/tricky.vy | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/e2e/vyper_parsing/test_data/tricky.vy b/tests/e2e/vyper_parsing/test_data/tricky.vy index 83b19cb895..4a5b718518 100644 --- a/tests/e2e/vyper_parsing/test_data/tricky.vy +++ b/tests/e2e/vyper_parsing/test_data/tricky.vy @@ -9,7 +9,4 @@ MAX_TICKS_UINT: constant(uint256) = 50 struct Loan: liquidation_range: LMGauge -x: public(Loan) - - -# TODO Will this overly complicate analyzing AST https://github.com/vyperlang/vyper/pull/3411 \ No newline at end of file +x: public(Loan) \ No newline at end of file From 3ca9d0f2287742bc8f57afbbaa1f6977966710dd Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 1 Sep 2023 19:50:56 -0500 Subject: [PATCH 107/169] convert tuple on lhs and index access to struct and field access --- .../visitors/slithir/expression_to_slithir.py | 46 +++++++++++++++++++ slither/vyper_parsing/type_parsing.py | 28 ++++++++++- .../vyper_parsing/variables/local_variable.py | 4 +- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 5a6c7de598..fa8cef8e3b 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -11,6 +11,7 @@ EnumContract, EnumTopLevel, Enum, + Structure, ) from slither.core.expressions import ( AssignmentOperation, @@ -233,6 +234,35 @@ def _post_assignement_operation(self, expression: AssignmentOperation) -> None: operation.set_expression(expression) self._result.append(operation) set_val(expression, left) + + elif ( + isinstance(left.type, UserDefinedType) + and isinstance(left.type.type, Structure) + and isinstance(right, TupleVariable) + ): + # This will result in a `NewStructure` operation where + # each field is assigned the value unpacked from the tuple + # (see `slither.vyper_parsing.type_parsing.parse_type`) + args = [] + for idx, elem in enumerate(left.type.type.elems.values()): + temp = TemporaryVariable(self._node) + temp.type = elem.type + args.append(temp) + operation = Unpack(temp, right, idx) + operation.set_expression(expression) + self._result.append(operation) + + for arg in args: + op = Argument(arg) + op.set_expression(expression) + self._result.append(op) + + operation = TmpCall( + left.type.type, len(left.type.type.elems), left, left.type.type.name + ) + operation.set_expression(expression) + self._result.append(operation) + else: operation = convert_assignment( left, right, expression.type, expression.expression_return_type @@ -417,6 +447,21 @@ def _post_index_access(self, expression: IndexAccess) -> None: set_val(expression, t) return val = ReferenceVariable(self._node) + + if ( + isinstance(left, LocalVariable) + and isinstance(left.type, UserDefinedType) + and isinstance(left.type.type, Structure) + ): + # We rewrite the index access to a tuple variable as + # an access to its field i.e. the 0th element is the field "_0" + # (see `slither.vyper_parsing.type_parsing.parse_type`) + operation = Member(left, Constant("_" + str(right)), val) + operation.set_expression(expression) + self._result.append(operation) + set_val(expression, val) + return + # access to anonymous array # such as [0,1][x] if isinstance(left, list): @@ -426,6 +471,7 @@ def _post_index_access(self, expression: IndexAccess) -> None: operation = InitArray(init_array_right, init_array_val) operation.set_expression(expression) self._result.append(operation) + operation = Index(val, left, right) operation.set_expression(expression) self._result.append(operation) diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index a7d83240ea..fc45a144c7 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -20,7 +20,7 @@ def parse_type(annotation: Union[Name, Subscript, Call], caller_context): else: contract = caller_context - assert isinstance(annotation, (Name, Subscript, Call)) + assert isinstance(annotation, (Name, Subscript, Call, Tuple)) print(annotation) if isinstance(annotation, Name): name = annotation.id @@ -54,12 +54,36 @@ def parse_type(annotation: Union[Name, Subscript, Call], caller_context): return ArrayType(type_, length) elif isinstance(annotation, Call): + # TODO event variable represented as Call return parse_type(annotation.args[0], caller_context) + elif isinstance(annotation, Tuple): + # Vyper has tuple types like python x = f() where f() -> (y,z) + # and tuple elements can be unpacked like x[0]: y and x[1]: z. + # We model these as a struct and unpack each index into a field + # e.g. accessing the 0th element is translated as x._0 + from slither.core.declarations.structure import Structure + from slither.core.variables.structure_variable import StructureVariable + + st = Structure(caller_context.compilation_unit) + st.set_offset("-1:-1:-1", caller_context.compilation_unit) + st.name = "FAKE_TUPLE" + for idx, elem_info in enumerate(annotation.elements): + elem = StructureVariable() + elem.type = parse_type(elem_info, caller_context) + elem.name = f"_{idx}" + elem.set_structure(st) + elem.set_offset("-1:-1:-1", caller_context.compilation_unit) + st.elems[elem.name] = elem + st.add_elem_in_order(elem.name) + st.name += elem.name + + return UserDefinedType(st) + else: assert False - lname = name.lower() # todo map String to string + lname = name.lower() # TODO map String to string if lname in ElementaryTypeName: return ElementaryType(lname) diff --git a/slither/vyper_parsing/variables/local_variable.py b/slither/vyper_parsing/variables/local_variable.py index d3bd0b0557..918ec344cb 100644 --- a/slither/vyper_parsing/variables/local_variable.py +++ b/slither/vyper_parsing/variables/local_variable.py @@ -1,7 +1,7 @@ from typing import Union from slither.core.variables.local_variable import LocalVariable -from slither.vyper_parsing.ast.types import Arg, Name, AnnAssign, Subscript, Call +from slither.vyper_parsing.ast.types import Arg, Name, AnnAssign, Subscript, Call, Tuple from slither.vyper_parsing.type_parsing import parse_type @@ -23,7 +23,7 @@ def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> self._variable.name = "" self._elem_to_parse = variable_data - assert isinstance(self._elem_to_parse, (Name, Subscript, Call)) + assert isinstance(self._elem_to_parse, (Name, Subscript, Call, Tuple)) self._variable.set_location("default") From 47e274c907bf5dfcb174b9caf01f6e169a972b5b Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 1 Sep 2023 19:57:11 -0500 Subject: [PATCH 108/169] consider function unimplemented if body is only pass --- slither/vyper_parsing/declarations/function.py | 5 ++++- tests/unit/core/test_function_declaration.py | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 850ff08b63..c79b7a9e4e 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -156,9 +156,11 @@ def analyze_content(self) -> None: body = self._functionNotParsed.body - if body: + if body and not isinstance(body[0], Pass): self._function.is_implemented = True self._parse_cfg(body) + else: + self._function.is_implemented = False for local_var_parser in self._local_variables_parser: local_var_parser.analyze(self._function) @@ -462,6 +464,7 @@ def parse_statement(curr_node, expr): pass elif isinstance(expr, Raise): print(expr) + # TODO # assert False pass else: diff --git a/tests/unit/core/test_function_declaration.py b/tests/unit/core/test_function_declaration.py index 2dc8192a1f..c4844074ef 100644 --- a/tests/unit/core/test_function_declaration.py +++ b/tests/unit/core/test_function_declaration.py @@ -351,6 +351,7 @@ def __default__(): assert not f.payable assert not f.view assert not f.pure + assert not f.is_implemented f = functions["__default__()"] assert f.function_type == FunctionType.FALLBACK @@ -358,6 +359,7 @@ def __default__(): assert f.payable assert not f.view assert not f.pure + assert not f.is_implemented f = functions["withdraw()"] assert f.function_type == FunctionType.NORMAL @@ -367,9 +369,11 @@ def __default__(): assert not f.pure assert f.can_send_eth() assert f.can_reenter() + assert f.is_implemented f = functions["withdraw_locked()"] assert not f.is_reentrant + assert f.is_implemented var = contract.get_state_variable_from_name("balances") assert var From 66def310e7717a3c665fd9b13aa9fe5ee0e42b68 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 1 Sep 2023 22:15:29 -0500 Subject: [PATCH 109/169] do not considered local variable that are reference types as `in_storage` --- slither/slithir/convert.py | 4 +++- slither/vyper_parsing/variables/local_variable.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index d1eaafdfac..8bb20412bf 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -576,7 +576,9 @@ def propagate_types(ir: Operation, node: "Node"): # pylint: disable=too-many-lo if isinstance(t, ArrayType) or ( isinstance(t, ElementaryType) and t.type == "bytes" ): - if ir.function_name == "push" and len(ir.arguments) <= 1: + # Solidity uses push + # Vyper uses append + if ir.function_name in ["push", "append"] and len(ir.arguments) <= 1: return convert_to_push(ir, node) if ir.function_name == "pop" and len(ir.arguments) == 0: return convert_to_pop(ir, node) diff --git a/slither/vyper_parsing/variables/local_variable.py b/slither/vyper_parsing/variables/local_variable.py index 918ec344cb..b50dea44b1 100644 --- a/slither/vyper_parsing/variables/local_variable.py +++ b/slither/vyper_parsing/variables/local_variable.py @@ -25,7 +25,9 @@ def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> assert isinstance(self._elem_to_parse, (Name, Subscript, Call, Tuple)) - self._variable.set_location("default") + # Vyper does not have data locations or storage pointers. + # If this was left as default, reference types would be considered storage by `LocalVariable.is_storage` + self._variable.set_location("memory") @property def underlying_variable(self) -> LocalVariable: From e287b2f905b2b3abb536e93e8ea79f9b030f145c Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 1 Sep 2023 23:10:13 -0500 Subject: [PATCH 110/169] fix phi placement by calling SlitherCompilationUnit.add_function --- slither/core/compilation_unit.py | 4 ++++ slither/vyper_parsing/declarations/contract.py | 6 +++++- tests/unit/slithir/vyper/test_ir_generation.py | 15 +++++++++++++-- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index 8e801ea953..556c6c7da8 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -189,6 +189,10 @@ def functions_and_modifiers(self) -> List[Function]: return self.functions + list(self.modifiers) def propagate_function_calls(self) -> None: + """This info is used to compute the rvalues of Phi operations in `fix_phi` and ultimately + is responsible for the `read` property of Phi operations which is vital to + propagating taints inter-procedurally + """ for f in self.functions_and_modifiers: for node in f.nodes: for ir in node.irs_ssa: diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index ed61bda1b7..0e2140fa1c 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -1,4 +1,5 @@ import logging +from pathlib import Path from typing import List, TYPE_CHECKING from slither.vyper_parsing.ast.types import ( Module, @@ -40,7 +41,9 @@ def __init__( self._contract: Contract = contract self._slither_parser: "VyperCompilationUnit" = slither_parser self._data = module - self._contract.name = module.name + # Vyper models only have one contract (aside from interfaces) and the name is the file path + # We use the stem to make it a more user friendly name that is easy to query via canonical name + self._contract.name = Path(module.name).stem self._contract.id = module.node_id self._is_analyzed: bool = False @@ -492,6 +495,7 @@ def parse_functions(self) -> None: func_parser = FunctionVyper(func, function, self) self._contract.add_function(func) + self._contract.compilation_unit.add_function(func) self._functions_parser.append(func_parser) self._functionsNotParsed = [] diff --git a/tests/unit/slithir/vyper/test_ir_generation.py b/tests/unit/slithir/vyper/test_ir_generation.py index 704e0d27a6..2f7c59fd37 100644 --- a/tests/unit/slithir/vyper/test_ir_generation.py +++ b/tests/unit/slithir/vyper/test_ir_generation.py @@ -64,6 +64,7 @@ def bar(): assert contract == interface assert function.signature_str == "foo() returns(int128,uint256)" + def test_phi_entry_point_internal_call(slither_from_vyper_source): with slither_from_vyper_source( """ @@ -78,5 +79,15 @@ def a(x: uint256): self.b(1) """ ) as sl: - b = sl.contracts[0].get_function_from_signature("b(uint256)") - assert len(list(filter(lambda x: isinstance(x, Phi), b.all_slithir_operations()))) == 1 + f = sl.contracts[0].get_function_from_signature("b(uint256)") + assert ( + len( + [ + ssanode + for node in f.nodes + for ssanode in node.irs_ssa + if isinstance(ssanode, Phi) + ] + ) + == 1 + ) From 81cb124e2dad5e0397209835186d7614901eb8ff Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 4 Sep 2023 13:04:52 -0500 Subject: [PATCH 111/169] support default args in calls --- slither/core/declarations/function.py | 2 ++ .../vyper_parsing/declarations/function.py | 5 +-- .../expressions/expression_parsing.py | 11 ++++++ .../unit/slithir/vyper/test_ir_generation.py | 35 +++++++++++++++++-- 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index e9f9552e94..a4a172b974 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -138,6 +138,8 @@ def __init__(self, compilation_unit: "SlitherCompilationUnit") -> None: self._parameters: List["LocalVariable"] = [] self._parameters_ssa: List["LocalIRVariable"] = [] self._parameters_src: SourceMapping = SourceMapping() + # This is used for vyper calls with default arguments + self._default_args_as_expressions: List["Expression"] = [] self._returns: List["LocalVariable"] = [] self._returns_ssa: List["LocalIRVariable"] = [] self._returns_src: SourceMapping = SourceMapping() diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index c79b7a9e4e..9ef3a547ad 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -31,7 +31,7 @@ class FunctionVyper: def __init__( self, function: Function, - function_data: Dict, + function_data: FunctionDef, contract_parser: "ContractVyper", ) -> None: @@ -503,7 +503,8 @@ def _parse_params(self, params: Arguments): print(params) self._function.parameters_src().set_offset(params.src, self._function.compilation_unit) - + if params.defaults: + self._function._default_args_as_expressions = params.defaults for param in params.args: local_var = self._add_param(param) self._function.add_parameters(local_var.underlying_variable) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 9996df8a8e..3d3d3e4f5e 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -198,6 +198,17 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # Since the AST lacks the type of the return values, we recover it. if isinstance(called.value, Function): rets = called.value.returns + # Default arguments are not represented in the AST, so we recover them as well. + if called.value._default_args_as_expressions and len(arguments) < len( + called.value.parameters + ): + arguments.extend( + [ + parse_expression(x, caller_context) + for x in called.value._default_args_as_expressions + ] + ) + elif isinstance(called.value, SolidityFunction): rets = called.value.return_type elif isinstance(called.value, Contract): diff --git a/tests/unit/slithir/vyper/test_ir_generation.py b/tests/unit/slithir/vyper/test_ir_generation.py index 2f7c59fd37..6bcdaab10e 100644 --- a/tests/unit/slithir/vyper/test_ir_generation.py +++ b/tests/unit/slithir/vyper/test_ir_generation.py @@ -10,7 +10,7 @@ from slither import Slither from slither.core.cfg.node import Node, NodeType from slither.core.declarations import Function, Contract -from slither.core.solidity_types import ArrayType +from slither.core.solidity_types import ArrayType, ElementaryType from slither.core.variables.local_variable import LocalVariable from slither.core.variables.state_variable import StateVariable from slither.slithir.operations import ( @@ -71,7 +71,7 @@ def test_phi_entry_point_internal_call(slither_from_vyper_source): counter: uint256 @internal def b(y: uint256): - self.counter = y # tainted by x, 1 + self.counter = y @external def a(x: uint256): @@ -91,3 +91,34 @@ def a(x: uint256): ) == 1 ) + + +def test_call_with_default_args(slither_from_vyper_source): + with slither_from_vyper_source( + """ +counter: uint256 +@internal +def c(y: uint256, config: bool = True): + self.counter = y +@external +def a(x: uint256): + self.c(x) + self.c(1) +@external +def b(x: uint256): + self.c(x, False) + self.c(1, False) +""" + ) as sl: + a = sl.contracts[0].get_function_from_signature("a(uint256)") + for node in a.nodes: + for op in node.irs_ssa: + if isinstance(op, InternalCall) and op.function.name == "c": + assert len(op.arguments) == 2 + assert op.arguments[1] == Constant("True", ElementaryType("bool")) + b = sl.contracts[0].get_function_from_signature("b(uint256)") + for node in b.nodes: + for op in node.irs_ssa: + if isinstance(op, InternalCall) and op.function.name == "c": + assert len(op.arguments) == 2 + assert op.arguments[1] == Constant("False", ElementaryType("bool")) From 4845a3bd261db99c77aacdbdbc6845fab9f120a8 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 4 Sep 2023 13:49:05 -0500 Subject: [PATCH 112/169] fix and refactor comparison operator, add support for raise --- .../vyper_parsing/declarations/function.py | 429 +++++++++--------- .../expressions/expression_parsing.py | 167 ++++--- .../ast_parsing__vyper_cfgir_in_bar__0.txt | 56 ++- .../ast_parsing__vyper_cfgir_in_baz__0.txt | 66 +++ .../ast_parsing__vyper_cfgir_in_foo__0.txt | 33 +- ..._parsing__vyper_cfgir_precedence_fb__0.txt | 8 + ...parsing__vyper_cfgir_precedence_foo__0.txt | 12 +- tests/e2e/vyper_parsing/test_data/in.vy | 17 +- 8 files changed, 448 insertions(+), 340 deletions(-) create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_baz__0.txt diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 9ef3a547ad..f023953faa 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -158,9 +158,11 @@ def analyze_content(self) -> None: if body and not isinstance(body[0], Pass): self._function.is_implemented = True + self._function.is_empty = False self._parse_cfg(body) else: self._function.is_implemented = False + self._function.is_empty = True for local_var_parser in self._local_variables_parser: local_var_parser.analyze(self._function) @@ -218,264 +220,257 @@ def _new_node( ################################################################################### ################################################################################### - def _parse_cfg(self, cfg: Dict) -> None: + def _parse_cfg(self, cfg: List[ASTNode]) -> None: entry_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) self._function.entry_point = entry_node.underlying_node scope = Scope(True, False, self.underlying_function) - if cfg: - self._function.is_empty = False - curr_node = entry_node - for expr in cfg: - - def parse_statement(curr_node, expr): - if isinstance(expr, AnnAssign): - local_var = LocalVariable() - local_var.set_function(self._function) - local_var.set_offset(expr.src, self._function.compilation_unit) - - local_var_parser = LocalVariableVyper(local_var, expr) - self._add_local_variable(local_var_parser) - - new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) - if expr.value is not None: - local_var.initialized = True - new_node.add_unparsed_expression(expr.value) - new_node.underlying_node.add_variable_declaration(local_var) - link_underlying_nodes(curr_node, new_node) + curr_node = entry_node + for expr in cfg: - curr_node = new_node + def parse_statement(curr_node, expr): + if isinstance(expr, AnnAssign): + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) - elif isinstance(expr, (AugAssign, Assign)): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr) - link_underlying_nodes(curr_node, new_node) + local_var_parser = LocalVariableVyper(local_var, expr) + self._add_local_variable(local_var_parser) - curr_node = new_node + new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + if expr.value is not None: + local_var.initialized = True + new_node.add_unparsed_expression(expr.value) + new_node.underlying_node.add_variable_declaration(local_var) + link_underlying_nodes(curr_node, new_node) - elif isinstance(expr, Expr): - # TODO This is a workaround to handle Vyper putting payable/view in the function body... - if not isinstance(expr.value, Name): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr.value) - link_underlying_nodes(curr_node, new_node) + curr_node = new_node - curr_node = new_node + elif isinstance(expr, (AugAssign, Assign)): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) + link_underlying_nodes(curr_node, new_node) - elif isinstance(expr, For): + curr_node = new_node - node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) - link_underlying_nodes(curr_node, node_startLoop) + elif isinstance(expr, Expr): + # TODO This is a workaround to handle Vyper putting payable/view in the function body... + if not isinstance(expr.value, Name): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr.value) + link_underlying_nodes(curr_node, new_node) - local_var = LocalVariable() - local_var.set_function(self._function) - local_var.set_offset(expr.src, self._function.compilation_unit) + curr_node = new_node - counter_var = AnnAssign( - expr.target.src, - expr.target.node_id, - target=Name("-1:-1:-1", -1, "counter_var"), - annotation=Name("-1:-1:-1", -1, "uint256"), - value=Int("-1:-1:-1", -1, 0), - ) - local_var_parser = LocalVariableVyper(local_var, counter_var) - self._add_local_variable(local_var_parser) - counter_node = self._new_node(NodeType.VARIABLE, expr.src, scope) - local_var.initialized = True - counter_node.add_unparsed_expression(counter_var.value) - counter_node.underlying_node.add_variable_declaration(local_var) - - link_underlying_nodes(node_startLoop, counter_node) - - node_condition = None - if isinstance(expr.iter, (Attribute, Name)): - # HACK - # The loop variable is not annotated so we infer its type by looking at the type of the iterator - if isinstance(expr.iter, Attribute): # state variable - iter_expr = expr.iter - loop_iterator = list( - filter( - lambda x: x._variable.name == iter_expr.attr, - self._contract_parser._variables_parser, - ) - )[0] - - else: # local variable - iter_expr = expr.iter - loop_iterator = list( - filter( - lambda x: x._variable.name == iter_expr.id, - self._local_variables_parser, - ) - )[0] - - # TODO use expr.src instead of -1:-1:1? - cond_expr = Compare( - "-1:-1:-1", - -1, - left=Name("-1:-1:-1", -1, "counter_var"), - op="<=", - right=Call( - "-1:-1:-1", - -1, - func=Name("-1:-1:-1", -1, "len"), - args=[iter_expr], - keywords=[], - keyword=None, - ), - ) - node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) - node_condition.add_unparsed_expression(cond_expr) - - if loop_iterator._elem_to_parse.value.id == "DynArray": - loop_var_annotation = ( - loop_iterator._elem_to_parse.slice.value.elements[0] + elif isinstance(expr, For): + + node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) + link_underlying_nodes(curr_node, node_startLoop) + + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) + + counter_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=Name("-1:-1:-1", -1, "counter_var"), + annotation=Name("-1:-1:-1", -1, "uint256"), + value=Int("-1:-1:-1", -1, 0), + ) + local_var_parser = LocalVariableVyper(local_var, counter_var) + self._add_local_variable(local_var_parser) + counter_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + local_var.initialized = True + counter_node.add_unparsed_expression(counter_var.value) + counter_node.underlying_node.add_variable_declaration(local_var) + + link_underlying_nodes(node_startLoop, counter_node) + + node_condition = None + if isinstance(expr.iter, (Attribute, Name)): + # HACK + # The loop variable is not annotated so we infer its type by looking at the type of the iterator + if isinstance(expr.iter, Attribute): # state variable + iter_expr = expr.iter + loop_iterator = list( + filter( + lambda x: x._variable.name == iter_expr.attr, + self._contract_parser._variables_parser, ) - else: - loop_var_annotation = loop_iterator._elem_to_parse.value + )[0] + + else: # local variable + iter_expr = expr.iter + loop_iterator = list( + filter( + lambda x: x._variable.name == iter_expr.id, + self._local_variables_parser, + ) + )[0] - value = Subscript( - "-1:-1:-1", - -1, - value=Name("-1:-1:-1", -1, loop_iterator._variable.name), - slice=Index( - "-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var") - ), - ) - loop_var = AnnAssign( - expr.target.src, - expr.target.node_id, - target=expr.target, - annotation=loop_var_annotation, - value=value, - ) - - elif isinstance(expr.iter, Call): # range - range_val = expr.iter.args[0] - cond_expr = Compare( + # TODO use expr.src instead of -1:-1:1? + cond_expr = Compare( + "-1:-1:-1", + -1, + left=Name("-1:-1:-1", -1, "counter_var"), + op="<=", + right=Call( "-1:-1:-1", -1, - left=Name("-1:-1:-1", -1, "counter_var"), - op="<=", - right=range_val, - ) - node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) - node_condition.add_unparsed_expression(cond_expr) - loop_var = AnnAssign( - expr.target.src, - expr.target.node_id, - target=expr.target, - annotation=Name("-1:-1:-1", -1, "uint256"), - value=Name("-1:-1:-1", -1, "counter_var"), - ) + func=Name("-1:-1:-1", -1, "len"), + args=[iter_expr], + keywords=[], + keyword=None, + ), + ) + node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) + node_condition.add_unparsed_expression(cond_expr) + if loop_iterator._elem_to_parse.value.id == "DynArray": + loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[ + 0 + ] else: - raise NotImplementedError - - # link - link_underlying_nodes(counter_node, node_condition) + loop_var_annotation = loop_iterator._elem_to_parse.value - # We update the index variable or range variable in the loop body - expr.body.insert(0, loop_var) - body_node = None - new_node = node_condition - for stmt in expr.body: - body_node = parse_statement(new_node, stmt) - new_node = body_node - - node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) + value = Subscript( + "-1:-1:-1", + -1, + value=Name("-1:-1:-1", -1, loop_iterator._variable.name), + slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var")), + ) + loop_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=expr.target, + annotation=loop_var_annotation, + value=value, + ) - loop_increment = AugAssign( + elif isinstance(expr.iter, Call): # range + range_val = expr.iter.args[0] + cond_expr = Compare( "-1:-1:-1", -1, - target=Name("-1:-1:-1", -1, "counter_var"), - op="+=", - value=Int("-1:-1:-1", -1, 1), + left=Name("-1:-1:-1", -1, "counter_var"), + op="<=", + right=range_val, + ) + node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) + node_condition.add_unparsed_expression(cond_expr) + loop_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=expr.target, + annotation=Name("-1:-1:-1", -1, "uint256"), + value=Name("-1:-1:-1", -1, "counter_var"), ) - node_increment = self._new_node(NodeType.EXPRESSION, expr.src, scope) - node_increment.add_unparsed_expression(loop_increment) - link_underlying_nodes(node_increment, node_condition) - if body_node is not None: - link_underlying_nodes(body_node, node_increment) + else: + raise NotImplementedError + + link_underlying_nodes(counter_node, node_condition) + + # We update the index variable or range variable in the loop body + expr.body.insert(0, loop_var) + body_node = None + new_node = node_condition + for stmt in expr.body: + body_node = parse_statement(new_node, stmt) + new_node = body_node + + node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) + + loop_increment = AugAssign( + "-1:-1:-1", + -1, + target=Name("-1:-1:-1", -1, "counter_var"), + op="+=", + value=Int("-1:-1:-1", -1, 1), + ) + node_increment = self._new_node(NodeType.EXPRESSION, expr.src, scope) + node_increment.add_unparsed_expression(loop_increment) + link_underlying_nodes(node_increment, node_condition) + + if body_node is not None: + link_underlying_nodes(body_node, node_increment) + + link_underlying_nodes(node_condition, node_endLoop) + + curr_node = node_endLoop + + elif isinstance(expr, Continue): + pass + elif isinstance(expr, Break): + pass + elif isinstance(expr, Return): + new_node = self._new_node(NodeType.RETURN, expr.src, scope) + if expr.value is not None: + new_node.add_unparsed_expression(expr.value) - link_underlying_nodes(node_condition, node_endLoop) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - curr_node = node_endLoop + elif isinstance(expr, Assert): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) - elif isinstance(expr, Continue): - pass - elif isinstance(expr, Break): - pass - elif isinstance(expr, Return): - new_node = self._new_node(NodeType.RETURN, expr.src, scope) - if expr.value is not None: - new_node.add_unparsed_expression(expr.value) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + elif isinstance(expr, Log): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr.value) - elif isinstance(expr, Assert): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + elif isinstance(expr, If): + condition_node = self._new_node(NodeType.IF, expr.test.src, scope) + condition_node.add_unparsed_expression(expr.test) - elif isinstance(expr, Log): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr.value) + endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + true_node = None + new_node = condition_node + for stmt in expr.body: + true_node = parse_statement(new_node, stmt) + new_node = true_node + # link_underlying_nodes(condition_node, true_node) + link_underlying_nodes(true_node, endIf_node) - elif isinstance(expr, If): - condition_node = self._new_node(NodeType.IF, expr.test.src, scope) - condition_node.add_unparsed_expression(expr.test) + false_node = None + new_node = condition_node + for stmt in expr.orelse: + false_node = parse_statement(new_node, stmt) + new_node = false_node - endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) + if false_node is not None: + # link_underlying_nodes(condition_node, false_node) + link_underlying_nodes(false_node, endIf_node) - true_node = None - new_node = condition_node - for stmt in expr.body: - true_node = parse_statement(new_node, stmt) - new_node = true_node - # link_underlying_nodes(condition_node, true_node) - link_underlying_nodes(true_node, endIf_node) + else: + link_underlying_nodes(condition_node, endIf_node) - false_node = None - new_node = condition_node - for stmt in expr.orelse: - false_node = parse_statement(new_node, stmt) - new_node = false_node + link_underlying_nodes(curr_node, condition_node) + curr_node = endIf_node - if false_node is not None: - # link_underlying_nodes(condition_node, false_node) - link_underlying_nodes(false_node, endIf_node) + elif isinstance(expr, Pass): + pass + elif isinstance(expr, Raise): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - else: - link_underlying_nodes(condition_node, endIf_node) - - link_underlying_nodes(curr_node, condition_node) - curr_node = endIf_node - - elif isinstance(expr, Pass): - pass - elif isinstance(expr, Raise): - print(expr) - # TODO - # assert False - pass - else: - print(f"isinstance(expr, {expr.__class__.__name__})") - assert False - return curr_node + else: + raise ParsingError(f"Statement not parsed {expr.__class__.__name__} {expr}") - curr_node = parse_statement(curr_node, expr) - # self._parse_block(cfg, node, self.underlying_function) - else: - self._function.is_empty = True + return curr_node + + curr_node = parse_statement(curr_node, expr) # endregion ################################################################################### diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 3d3d3e4f5e..3f76ea2814 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -69,6 +69,7 @@ Assign, AugAssign, VyList, + Raise, ) @@ -192,6 +193,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": else: arguments = [parse_expression(a, caller_context) for a in expression.args] + rets = None if isinstance(called, Identifier): print("called", called) print("called.value", called.value.__class__.__name__) @@ -211,6 +213,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": elif isinstance(called.value, SolidityFunction): rets = called.value.return_type + elif isinstance(called.value, Contract): # Type conversions are not explicitly represented in the AST e.g. converting address to contract/ interface, # so we infer that a type conversion is occurring if `called` is a `Contract` type. @@ -219,14 +222,12 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - else: - rets = ["tuple()"] - elif isinstance(called, MemberAccess) and called.type is not None: # (recover_type_2) Propagate the type collected to the `CallExpression` # see recover_type_1 rets = [called.type] - else: + + if rets is None: rets = ["tuple()"] def get_type_str(x): @@ -235,6 +236,13 @@ def get_type_str(x): return str(x.type) print(rets) + # def vars_to_typestr(rets: List[Expression]) -> str: + # if len(rets) == 0: + # return "" + # if len(rets) == 1: + # return str(rets[0].type) + # return f"tuple({','.join(str(ret.type) for ret in rets)})" + type_str = ( get_type_str(rets[0]) if len(rets) == 1 @@ -347,30 +355,48 @@ def get_type_str(x): if isinstance(expression, Compare): lhs = parse_expression(expression.left, caller_context) + # We assume left operand in membership comparison cannot be Array type if expression.op in ["In", "NotIn"]: - # If we see a membership operator e.g. x in [foo(), bar()] we rewrite it as if-else: - # if (x == foo()) { - # return true - # } else { - # if (x == bar()) { - # return true - # } else { - # return false - # } - # } - # We assume left operand in membership comparison cannot be Array type + # If we see a membership operator e.g. x in [foo(), bar()], we convert it to logical operations + # like (x == foo() || x == bar()) or (x != foo() && x != bar()) for "not in" + # TODO consider rewriting as if-else to accurately represent the precedence of potential side-effects + conditions = deque() - if isinstance(expression.right, VyList): + rhs = parse_expression(expression.right, caller_context) + is_tuple = isinstance(rhs, TupleExpression) + is_array = isinstance(rhs, Identifier) and isinstance(rhs.value.type, ArrayType) + if is_array: + assert rhs.value.type.is_fixed_array + if is_tuple or is_array: + length = len(rhs.expressions) if is_tuple else rhs.value.type.length_value.value inner_op = ( BinaryOperationType.get_type("!=") if expression.op == "NotIn" else BinaryOperationType.get_type("==") ) + for i in range(length): + elem_expr = ( + rhs.expressions[i] + if is_tuple + else IndexAccess(rhs, Literal(str(i), ElementaryType("uint256"))) + ) + elem_expr.set_offset(rhs.source_mapping, caller_context.compilation_unit) + parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) + parsed_expr.set_offset(lhs.source_mapping, caller_context.compilation_unit) + conditions.append(parsed_expr) + outer_op = ( BinaryOperationType.get_type("&&") if expression.op == "NotIn" else BinaryOperationType.get_type("||") ) + while len(conditions) > 1: + lhs = conditions.pop() + rhs = conditions.pop() + + conditions.appendleft(BinaryOperation(lhs, rhs, outer_op)) + + return conditions.pop() for elem in expression.right.elements: elem_expr = parse_expression(elem, caller_context) @@ -378,79 +404,31 @@ def get_type_str(x): parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) conditions.append(parsed_expr) - else: - rhs = parse_expression(expression.right, caller_context) - print(rhs) - print(rhs.__class__.__name__) - if isinstance(rhs, Identifier): - if isinstance(rhs.value.type, ArrayType): - inner_op = ( - BinaryOperationType.get_type("!=") - if expression.op == "NotIn" - else BinaryOperationType.get_type("==") - ) - outer_op = ( - BinaryOperationType.get_type("&&") - if expression.op == "NotIn" - else BinaryOperationType.get_type("||") - ) - - enum_members = rhs.value.type.length_value.value - for i in range(enum_members): - elem_expr = IndexAccess(rhs, Literal(str(i), ElementaryType("uint256"))) - elem_expr.set_offset( - rhs.source_mapping, caller_context.compilation_unit - ) - parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) - parsed_expr.set_offset( - lhs.source_mapping, caller_context.compilation_unit - ) - conditions.append(parsed_expr) - # elif isinstance(rhs.value.type, UserDefinedType): - - else: - assert False - else: - # This is an indexaccess like hashmap[address, Roles] - inner_op = BinaryOperationType.get_type( - "|" - ) # if expression.op == "NotIn" else BinaryOperationType.get_type("==") - outer_op = BinaryOperationType.get_type( - "&" - ) # if expression.op == "NotIn" else BinaryOperationType.get_type("||") - - # x, _ = find_variable(expression.right.value.attr, caller_context) - # print(x) - # print(x.type.type_to) - # print(x.type.type_to.__class__) - print(repr(rhs)) - print(rhs) - - enum_members = rhs.expression_left.value.type.type_to.type.values - # for each value, create a literal with value = 2 ^ n (0 indexed) - # and then translate to bitmasking - enum_values = [ - Literal(str(2**n), ElementaryType("uint256")) - for n in range(len(enum_members)) - ] - inner_lhs = enum_values[0] - for expr in enum_values[1:]: - inner_lhs = BinaryOperation(inner_lhs, expr, inner_op) - conditions.append(inner_lhs) - - parsed_expr = BinaryOperation(lhs, conditions[0], outer_op) - parsed_expr.set_offset(lhs.source_mapping, caller_context.compilation_unit) - return parsed_expr - - while len(conditions) > 1: - lhs = conditions.pop() - rhs = conditions.pop() - - conditions.appendleft(BinaryOperation(lhs, rhs, outer_op)) - - return conditions.pop() + else: # enum type membership check https://docs.vyperlang.org/en/stable/types.html?h#id18 + is_member_op = ( + BinaryOperationType.get_type("==") + if expression.op == "NotIn" + else BinaryOperationType.get_type("!=") + ) + # If all bits are cleared, then the lhs is not a member of the enum + # This allows representing membership in multiple enum members + # For example, if enum Foo has members A (1), B (2), and C (4), then + # (x in [Foo.A, Foo.B]) is equivalent to (x & (Foo.A | Foo.B) != 0), + # where (Foo.A | Foo.B) evaluates to 3. + # Thus, when x is 3, (x & (Foo.A | Foo.B) != 0) is true. + + enum_bit_mask = BinaryOperation( + TypeConversion(lhs, ElementaryType("uint256")), + TypeConversion(rhs, ElementaryType("uint256")), + BinaryOperationType.get_type("&"), + ) + membership_check = BinaryOperation( + enum_bit_mask, Literal("0", ElementaryType("uint256")), is_member_op + ) + membership_check.set_offset(lhs.source_mapping, caller_context.compilation_unit) + return membership_check - else: + else: # a regular logical operator rhs = parse_expression(expression.right, caller_context) op = BinaryOperationType.get_type(expression.op) @@ -501,4 +479,17 @@ def get_type_str(x): parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr + if isinstance(expression, Raise): + type_str = "tuple()" + func = ( + SolidityFunction("revert()") + if expression.exc is None + else SolidityFunction("revert(string)") + ) + args = [] if expression.exc is None else [parse_expression(expression.exc, caller_context)] + + parsed_expr = CallExpression(Identifier(func), args, type_str) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr + raise ParsingError(f"Expression not parsed {expression}") diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt index 7bf9052b8c..49552d27f9 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_bar__0.txt @@ -2,45 +2,57 @@ digraph{ 0[label="Node Type: ENTRY_POINT 0 "]; 0->1; -1[label="Node Type: NEW VARIABLE 1 +1[label="Node Type: IF 1 EXPRESSION: -a = 0 +uint256(x) & uint256(self.roles[self]) != 0 IRs: -a(int128) := 0(uint256)"]; -1->2; -2[label="Node Type: NEW VARIABLE 2 +TMP_10 = CONVERT x to uint256 +REF_4(in.Roles) -> roles[self] +TMP_11 = CONVERT REF_4 to uint256 +TMP_12(uint256) = TMP_10 & TMP_11 +TMP_13(bool) = TMP_12 != 0 +CONDITION TMP_13"]; +1->3[label="True"]; +1->2[label="False"]; +2[label="Node Type: END_IF 2 +"]; +2->4; +3[label="Node Type: RETURN 3 EXPRESSION: -b = 0 +True IRs: -b(int128) := 0(uint256)"]; -2->3; -3[label="Node Type: IF 3 +RETURN True"]; +3->2; +4[label="Node Type: IF 4 EXPRESSION: -x & 1 | 2 +uint256(x) & uint256(self.roles[self]) == 0 IRs: -TMP_0(uint256) = 1 | 2 -TMP_1(in.Roles) = x & TMP_0 -CONDITION TMP_1"]; -3->5[label="True"]; -3->4[label="False"]; -4[label="Node Type: END_IF 4 +TMP_14 = CONVERT x to uint256 +REF_5(in.Roles) -> roles[self] +TMP_15 = CONVERT REF_5 to uint256 +TMP_16(uint256) = TMP_14 & TMP_15 +TMP_17(bool) = TMP_16 == 0 +CONDITION TMP_17"]; +4->6[label="True"]; +4->5[label="False"]; +5[label="Node Type: END_IF 5 "]; -4->6; -5[label="Node Type: RETURN 5 +5->7; +6[label="Node Type: RETURN 6 EXPRESSION: -True +False IRs: -RETURN True"]; -5->4; -6[label="Node Type: RETURN 6 +RETURN False"]; +6->5; +7[label="Node Type: RETURN 7 EXPRESSION: False diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_baz__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_baz__0.txt new file mode 100644 index 0000000000..95328dad99 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_baz__0.txt @@ -0,0 +1,66 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: IF 1 + +EXPRESSION: +uint256(x) & uint256(Roles.A | Roles.B) != 0 + +IRs: +TMP_0 = CONVERT x to uint256 +REF_0(in.Roles) -> Roles.A +REF_1(in.Roles) -> Roles.B +TMP_1(in.Roles) = REF_0 | REF_1 +TMP_2 = CONVERT TMP_1 to uint256 +TMP_3(uint256) = TMP_0 & TMP_2 +TMP_4(bool) = TMP_3 != 0 +CONDITION TMP_4"]; +1->3[label="True"]; +1->2[label="False"]; +2[label="Node Type: END_IF 2 +"]; +2->4; +3[label="Node Type: RETURN 3 + +EXPRESSION: +True + +IRs: +RETURN True"]; +3->2; +4[label="Node Type: IF 4 + +EXPRESSION: +uint256(x) & uint256(Roles.A | Roles.B) == 0 + +IRs: +TMP_5 = CONVERT x to uint256 +REF_2(in.Roles) -> Roles.A +REF_3(in.Roles) -> Roles.B +TMP_6(in.Roles) = REF_2 | REF_3 +TMP_7 = CONVERT TMP_6 to uint256 +TMP_8(uint256) = TMP_5 & TMP_7 +TMP_9(bool) = TMP_8 == 0 +CONDITION TMP_9"]; +4->6[label="True"]; +4->5[label="False"]; +5[label="Node Type: END_IF 5 +"]; +5->7; +6[label="Node Type: RETURN 6 + +EXPRESSION: +False + +IRs: +RETURN False"]; +6->5; +7[label="Node Type: RETURN 7 + +EXPRESSION: +False + +IRs: +RETURN False"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt index b9d3da07ea..cd1e34bf1a 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_in_foo__0.txt @@ -24,10 +24,10 @@ EXPRESSION: x == b || x == a IRs: -TMP_2(bool) = x == b -TMP_3(bool) = x == a -TMP_4(bool) = TMP_2 || TMP_3 -CONDITION TMP_4"]; +TMP_18(bool) = x == b +TMP_19(bool) = x == a +TMP_20(bool) = TMP_18 || TMP_19 +CONDITION TMP_20"]; 3->5[label="True"]; 3->4[label="False"]; 4[label="Node Type: END_IF 4 @@ -41,7 +41,30 @@ True IRs: RETURN True"]; 5->4; -6[label="Node Type: RETURN 6 +6[label="Node Type: IF 6 + +EXPRESSION: +x != b && x != a + +IRs: +TMP_21(bool) = x != b +TMP_22(bool) = x != a +TMP_23(bool) = TMP_21 && TMP_22 +CONDITION TMP_23"]; +6->8[label="True"]; +6->7[label="False"]; +7[label="Node Type: END_IF 7 +"]; +7->9; +8[label="Node Type: EXPRESSION 8 + +EXPRESSION: +revert(string)(nope) + +IRs: +TMP_24(None) = SOLIDITY_CALL revert(string)(nope)"]; +8->7; +9[label="Node Type: RETURN 9 EXPRESSION: False diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt index b799f07d43..0c204c9fa2 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_fb__0.txt @@ -1,4 +1,12 @@ digraph{ 0[label="Node Type: ENTRY_POINT 0 "]; +0->1; +1[label="Node Type: EXPRESSION 1 + +EXPRESSION: +revert()() + +IRs: +TMP_0(None) = SOLIDITY_CALL revert()()"]; } diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt index 2355fd513a..2180c6eb12 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_precedence_foo__0.txt @@ -8,10 +8,10 @@ EXPRESSION: x != self.fb() && x != self.fa() IRs: -TMP_0(uint256) = INTERNAL_CALL, precedence.fb()() -TMP_1(bool) = x != TMP_0 -TMP_2(uint256) = INTERNAL_CALL, precedence.fa()() -TMP_3(bool) = x != TMP_2 -TMP_4(bool) = TMP_1 && TMP_3 -RETURN TMP_4"]; +TMP_1(uint256) = INTERNAL_CALL, precedence.fb()() +TMP_2(bool) = x != TMP_1 +TMP_3(uint256) = INTERNAL_CALL, precedence.fa()() +TMP_4(bool) = x != TMP_3 +TMP_5(bool) = TMP_2 && TMP_4 +RETURN TMP_5"]; } diff --git a/tests/e2e/vyper_parsing/test_data/in.vy b/tests/e2e/vyper_parsing/test_data/in.vy index e08f71a749..5d4827ca1d 100644 --- a/tests/e2e/vyper_parsing/test_data/in.vy +++ b/tests/e2e/vyper_parsing/test_data/in.vy @@ -4,13 +4,23 @@ enum Roles: roles: public(HashMap[address, Roles]) +@external +def baz(x: Roles) -> bool: + if x in (Roles.A | Roles.B): + return True + if x not in (Roles.A | Roles.B): + return False + + return False + @external def bar(x: Roles) -> bool: - a: int128 = 0 - b: int128 = 0 if x in self.roles[self]: return True + if x not in self.roles[self]: + return False + return False @external @@ -20,4 +30,7 @@ def foo(x: int128) -> bool: if x in [a, b]: return True + if x not in [a, b]: + raise "nope" + return False \ No newline at end of file From 9fdc7dc22878a1acda4c16f25fe59d80e414d2ce Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 4 Sep 2023 13:54:52 -0500 Subject: [PATCH 113/169] conditionally apply refinements to Solidity --- slither/slithir/convert.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 8bb20412bf..91fe30da7f 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -114,8 +114,8 @@ def convert_expression(expression: Expression, node: "Node") -> List[Operation]: visitor = ExpressionToSlithIR(expression, node) result = visitor.result() - - result = apply_ir_heuristics(result, node) + is_solidity = node.compilation_unit.is_solidity + result = apply_ir_heuristics(result, node, is_solidity) if result: if node.type in [NodeType.IF, NodeType.IFLOOP]: @@ -1910,7 +1910,7 @@ def _find_source_mapping_references(irs: List[Operation]) -> None: ################################################################################### -def apply_ir_heuristics(irs: List[Operation], node: "Node") -> List[Operation]: +def apply_ir_heuristics(irs: List[Operation], node: "Node", is_solidity: bool) -> List[Operation]: """ Apply a set of heuristic to improve slithIR """ @@ -1920,9 +1920,11 @@ def apply_ir_heuristics(irs: List[Operation], node: "Node") -> List[Operation]: irs = propagate_type_and_convert_call(irs, node) irs = remove_unused(irs) find_references_origin(irs) - # TODO refine only for Solidity - # convert_constant_types(irs) - convert_delete(irs) + + # These are heuristics that are only applied to Solidity + if is_solidity: + convert_constant_types(irs) + convert_delete(irs) _find_source_mapping_references(irs) From 16140f29c854e6db7ba43f94a3c0c9cd640944e1 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 4 Sep 2023 13:55:28 -0500 Subject: [PATCH 114/169] cleanup and formatting --- .../core/declarations/solidity_variables.py | 45 +++++++++---------- slither/vyper_parsing/ast/types.py | 3 -- slither/vyper_parsing/declarations/struct.py | 6 +-- .../vyper_parsing/variables/event_variable.py | 7 ++- .../vyper_parsing/vyper_compilation_unit.py | 4 +- tests/unit/core/test_source_mapping.py | 3 +- 6 files changed, 33 insertions(+), 35 deletions(-) diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index 03fd81f041..d5aec009f7 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -40,7 +40,6 @@ "chain.id": "uint256", "block.prevhash": "bytes32", "self.balance": "uint256", - } SOLIDITY_FUNCTIONS: Dict[str, List[str]] = { @@ -89,30 +88,30 @@ "code(address)": ["bytes"], "codehash(address)": ["bytes32"], # Vyper - "create_from_blueprint()":[], - "empty()":[], - "convert()":[], # TODO make type conversion - "len()":["uint256"], - "method_id()":[], + "create_from_blueprint()": [], + "empty()": [], + "convert()": [], # TODO make type conversion + "len()": ["uint256"], + "method_id()": [], "unsafe_sub()": [], "unsafe_add()": [], - "unsafe_div()":[], - "unsafe_mul()":[], - "pow_mod256()":[], - "max_value()":[], - "min_value()":[], - "concat()":[], - "ecrecover()":[], - "isqrt()":[], - "range()":[], - "min()":[], - "max()":[], - "shift()":[], - "abs()":[], - "raw_call()":["bool", "bytes32"], - "_abi_encode()":[], - "slice()":[], - "uint2str()":["string"], + "unsafe_div()": [], + "unsafe_mul()": [], + "pow_mod256()": [], + "max_value()": [], + "min_value()": [], + "concat()": [], + "ecrecover()": [], + "isqrt()": [], + "range()": [], + "min()": [], + "max()": [], + "shift()": [], + "abs()": [], + "raw_call()": ["bool", "bytes32"], + "_abi_encode()": [], + "slice()": [], + "uint2str()": ["string"], } diff --git a/slither/vyper_parsing/ast/types.py b/slither/vyper_parsing/ast/types.py index e07e6d2132..6eff6d2527 100644 --- a/slither/vyper_parsing/ast/types.py +++ b/slither/vyper_parsing/ast/types.py @@ -85,9 +85,6 @@ class Index(ASTNode): value: ASTNode -# TODO CONSTANT? - - @dataclass class Bytes(ASTNode): value: bytes diff --git a/slither/vyper_parsing/declarations/struct.py b/slither/vyper_parsing/declarations/struct.py index 0da2c7fed0..70a6bd7b72 100644 --- a/slither/vyper_parsing/declarations/struct.py +++ b/slither/vyper_parsing/declarations/struct.py @@ -7,17 +7,15 @@ class StructVyper: - def __init__( # pylint: disable=too-many-arguments + def __init__( self, st: Structure, struct: StructDef, ) -> None: - print(struct) - self._structure = st st.name = struct.name - # st.canonical_name = canonicalName + st.canonical_name = struct.name + self._structure.contract.name self._elemsNotParsed: List[AnnAssign] = struct.body diff --git a/slither/vyper_parsing/variables/event_variable.py b/slither/vyper_parsing/variables/event_variable.py index 2dc5db5441..5167610a80 100644 --- a/slither/vyper_parsing/variables/event_variable.py +++ b/slither/vyper_parsing/variables/event_variable.py @@ -10,8 +10,11 @@ def __init__(self, variable: EventVariable, variable_data: AnnAssign): print(variable_data) self._variable = variable self._variable.name = variable_data.target.id - if isinstance(variable_data.annotation, Call) and variable_data.annotation.func.id == "indexed": - self._variable.indexed = True + if ( + isinstance(variable_data.annotation, Call) + and variable_data.annotation.func.id == "indexed" + ): + self._variable.indexed = True else: self._variable.indexed = False self._elem_to_parse = variable_data.annotation diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index 2650ffe8e7..d4ebf8415a 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -52,12 +52,12 @@ def analyze_contracts(self) -> None: if not self._parsed: raise SlitherException("Parse the contract before running analyses") - for contract, contract_parser in self._underlying_contract_to_parser.items(): + for contract_parser in self._underlying_contract_to_parser.values(): # State variables are analyzed for all contracts because interfaces may # reference them, specifically, constants. contract_parser.analyze_state_variables() - for contract, contract_parser in self._underlying_contract_to_parser.items(): + for contract_parser in self._underlying_contract_to_parser.values(): contract_parser.analyze() self._convert_to_slithir() diff --git a/tests/unit/core/test_source_mapping.py b/tests/unit/core/test_source_mapping.py index 16a26215b6..552c08dc95 100644 --- a/tests/unit/core/test_source_mapping.py +++ b/tests/unit/core/test_source_mapping.py @@ -114,6 +114,7 @@ def test_references_user_defined_types_when_casting(solc_binary_path): lines = _sort_references_lines(a.references) assert lines == [12, 18] + def test_references_self_identifier(): """ Tests that shadowing state variables with local variables does not affect references. @@ -125,4 +126,4 @@ def test_references_self_identifier(): a = contracts[0].state_variables[0] assert len(a.references) == 1 lines = _sort_references_lines(a.references) - assert lines == [4] \ No newline at end of file + assert lines == [4] From 9c4bc505d39be9d4d7083caf7eda26ab2ffe3c2c Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 07:44:03 -0500 Subject: [PATCH 115/169] handle break/continue --- .../vyper_parsing/declarations/function.py | 65 ++++--- ..._parsing__vyper_cfgir_for2_for_loop__0.txt | 40 ++--- ...ast_parsing__vyper_cfgir_for3_get_D__0.txt | 40 ++--- ...g__vyper_cfgir_for_break_continue_f__0.txt | 164 ++++++++++++++++++ ...t_parsing__vyper_cfgir_for_for_loop__0.txt | 40 ++--- 5 files changed, 268 insertions(+), 81 deletions(-) create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_break_continue_f__0.txt diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index f023953faa..9932a7c226 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -229,7 +229,12 @@ def _parse_cfg(self, cfg: List[ASTNode]) -> None: curr_node = entry_node for expr in cfg: - def parse_statement(curr_node, expr): + def parse_statement( + curr_node: NodeVyper, + expr: ASTNode, + continue_destination=None, + break_destination=None, + ) -> NodeVyper: if isinstance(expr, AnnAssign): local_var = LocalVariable() local_var.set_function(self._function) @@ -266,6 +271,8 @@ def parse_statement(curr_node, expr): elif isinstance(expr, For): node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) + node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) + link_underlying_nodes(curr_node, node_startLoop) local_var = LocalVariable() @@ -371,18 +378,10 @@ def parse_statement(curr_node, expr): else: raise NotImplementedError + # After creating condition node, we link it declaration of the loop variable link_underlying_nodes(counter_node, node_condition) - # We update the index variable or range variable in the loop body - expr.body.insert(0, loop_var) - body_node = None - new_node = node_condition - for stmt in expr.body: - body_node = parse_statement(new_node, stmt) - new_node = body_node - - node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) - + # Create an expression for the loop increment (counter_var += 1) loop_increment = AugAssign( "-1:-1:-1", -1, @@ -394,6 +393,25 @@ def parse_statement(curr_node, expr): node_increment.add_unparsed_expression(loop_increment) link_underlying_nodes(node_increment, node_condition) + prev_continue_destination = continue_destination + prev_break_destination = break_destination + continue_destination = node_increment + break_destination = node_endLoop + + # We assign the index variable or range variable in the loop body on each iteration + expr.body.insert(0, loop_var) + body_node = None + new_node = node_condition + for stmt in expr.body: + body_node = parse_statement( + new_node, stmt, continue_destination, break_destination + ) + new_node = body_node + + # Reset to previous jump destinations for nested loops + continue_destination = prev_continue_destination + break_destination = prev_break_destination + if body_node is not None: link_underlying_nodes(body_node, node_increment) @@ -402,9 +420,15 @@ def parse_statement(curr_node, expr): curr_node = node_endLoop elif isinstance(expr, Continue): - pass + new_node = self._new_node(NodeType.CONTINUE, expr.src, scope) + link_underlying_nodes(curr_node, new_node) + link_underlying_nodes(new_node, continue_destination) + elif isinstance(expr, Break): - pass + new_node = self._new_node(NodeType.BREAK, expr.src, scope) + link_underlying_nodes(curr_node, new_node) + link_underlying_nodes(new_node, break_destination) + elif isinstance(expr, Return): new_node = self._new_node(NodeType.RETURN, expr.src, scope) if expr.value is not None: @@ -436,19 +460,22 @@ def parse_statement(curr_node, expr): true_node = None new_node = condition_node for stmt in expr.body: - true_node = parse_statement(new_node, stmt) + true_node = parse_statement( + new_node, stmt, continue_destination, break_destination + ) new_node = true_node - # link_underlying_nodes(condition_node, true_node) + link_underlying_nodes(true_node, endIf_node) false_node = None new_node = condition_node for stmt in expr.orelse: - false_node = parse_statement(new_node, stmt) + false_node = parse_statement( + new_node, stmt, continue_destination, break_destination + ) new_node = false_node if false_node is not None: - # link_underlying_nodes(condition_node, false_node) link_underlying_nodes(false_node, endIf_node) else: @@ -481,13 +508,11 @@ def _add_param(self, param: Arg, initialized: bool = False) -> LocalVariableVype local_var = LocalVariable() local_var.set_function(self._function) local_var.set_offset(param.src, self._function.compilation_unit) - print("add_param", param) local_var_parser = LocalVariableVyper(local_var, param) if initialized: local_var.initialized = True - # see https://solidity.readthedocs.io/en/v0.4.24/types.html?highlight=storage%20location#data-location if local_var.location == "default": local_var.set_location("memory") @@ -496,7 +521,6 @@ def _add_param(self, param: Arg, initialized: bool = False) -> LocalVariableVype def _parse_params(self, params: Arguments): - print(params) self._function.parameters_src().set_offset(params.src, self._function.compilation_unit) if params.defaults: self._function._default_args_as_expressions = params.defaults @@ -506,7 +530,6 @@ def _parse_params(self, params: Arguments): def _parse_returns(self, returns: Union[Name, Tuple, Subscript]): - print(returns) self._function.returns_src().set_offset(returns.src, self._function.compilation_unit) # Only the type of the arg is given, not a name. We create an an `Arg` with an empty name # so that the function has the correct return type in its signature but doesn't clash with diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt index 949e814fff..c1f5f2f13d 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt @@ -12,16 +12,18 @@ _strategies(address[3]) = ['strategies(address[3])']"]; 1->2; 2[label="Node Type: BEGIN_LOOP 2 "]; -2->3; -3[label="Node Type: NEW VARIABLE 3 +2->4; +3[label="Node Type: END_LOOP 3 +"]; +4[label="Node Type: NEW VARIABLE 4 EXPRESSION: counter_var = 0 IRs: counter_var(uint256) := 0(uint256)"]; -3->4; -4[label="Node Type: IF_LOOP 4 +4->5; +5[label="Node Type: IF_LOOP 5 EXPRESSION: counter_var <= 10 @@ -29,17 +31,25 @@ counter_var <= 10 IRs: TMP_0(bool) = counter_var <= 10 CONDITION TMP_0"]; -4->5[label="True"]; -4->7[label="False"]; -5[label="Node Type: NEW VARIABLE 5 +5->7[label="True"]; +5->3[label="False"]; +6[label="Node Type: EXPRESSION 6 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +6->5; +7[label="Node Type: NEW VARIABLE 7 EXPRESSION: i = counter_var IRs: i(uint256) := counter_var(uint256)"]; -5->6; -6[label="Node Type: NEW VARIABLE 6 +7->8; +8[label="Node Type: NEW VARIABLE 8 EXPRESSION: max_withdraw = IStrategy(_strategies[i]).maxWithdraw(self) @@ -49,15 +59,5 @@ REF_0(address) -> _strategies[i] TMP_1 = CONVERT REF_0 to IStrategy TMP_2(uint256) = HIGH_LEVEL_CALL, dest:TMP_1(IStrategy), function:maxWithdraw, arguments:['self'] max_withdraw(uint256) := TMP_2(uint256)"]; -6->8; -7[label="Node Type: END_LOOP 7 -"]; -8[label="Node Type: EXPRESSION 8 - -EXPRESSION: -counter_var += 1 - -IRs: -counter_var(uint256) = counter_var (c)+ 1"]; -8->4; +8->6; } diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt index ae6d397b05..f8ab6cef9a 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for3_get_D__0.txt @@ -12,16 +12,18 @@ S(uint256) := 0(uint256)"]; 1->2; 2[label="Node Type: BEGIN_LOOP 2 "]; -2->3; -3[label="Node Type: NEW VARIABLE 3 +2->4; +3[label="Node Type: END_LOOP 3 +"]; +4[label="Node Type: NEW VARIABLE 4 EXPRESSION: counter_var = 0 IRs: counter_var(uint256) := 0(uint256)"]; -3->4; -4[label="Node Type: IF_LOOP 4 +4->5; +5[label="Node Type: IF_LOOP 5 EXPRESSION: counter_var <= len()(_xp) @@ -30,33 +32,31 @@ IRs: TMP_0(uint256) = SOLIDITY_CALL len()(_xp) TMP_1(bool) = counter_var <= TMP_0 CONDITION TMP_1"]; -4->5[label="True"]; -4->7[label="False"]; -5[label="Node Type: NEW VARIABLE 5 +5->7[label="True"]; +5->3[label="False"]; +6[label="Node Type: EXPRESSION 6 EXPRESSION: -x = _xp[counter_var] +counter_var += 1 IRs: -REF_0(uint256) -> _xp[counter_var] -x(uint256) := REF_0(uint256)"]; -5->6; -6[label="Node Type: EXPRESSION 6 +counter_var(uint256) = counter_var (c)+ 1"]; +6->5; +7[label="Node Type: NEW VARIABLE 7 EXPRESSION: -S += x +x = _xp[counter_var] IRs: -S(uint256) = S (c)+ x"]; -6->8; -7[label="Node Type: END_LOOP 7 -"]; +REF_0(uint256) -> _xp[counter_var] +x(uint256) := REF_0(uint256)"]; +7->8; 8[label="Node Type: EXPRESSION 8 EXPRESSION: -counter_var += 1 +S += x IRs: -counter_var(uint256) = counter_var (c)+ 1"]; -8->4; +S(uint256) = S (c)+ x"]; +8->6; } diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_break_continue_f__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_break_continue_f__0.txt new file mode 100644 index 0000000000..b35bdaa944 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_break_continue_f__0.txt @@ -0,0 +1,164 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: BEGIN_LOOP 1 +"]; +1->3; +2[label="Node Type: END_LOOP 2 +"]; +3[label="Node Type: NEW VARIABLE 3 + +EXPRESSION: +counter_var = 0 + +IRs: +counter_var(uint256) := 0(uint256)"]; +3->4; +4[label="Node Type: IF_LOOP 4 + +EXPRESSION: +counter_var <= 100 + +IRs: +TMP_0(bool) = counter_var <= 100 +CONDITION TMP_0"]; +4->6[label="True"]; +4->2[label="False"]; +5[label="Node Type: EXPRESSION 5 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +5->4; +6[label="Node Type: NEW VARIABLE 6 + +EXPRESSION: +i = counter_var + +IRs: +i(uint256) := counter_var(uint256)"]; +6->7; +7[label="Node Type: IF 7 + +EXPRESSION: +i > 100 + +IRs: +TMP_1(bool) = i > 100 +CONDITION TMP_1"]; +7->9[label="True"]; +7->8[label="False"]; +8[label="Node Type: END_IF 8 +"]; +8->10; +9[label="Node Type: BREAK 9 +"]; +9->2; +10[label="Node Type: IF 10 + +EXPRESSION: +i < 3 + +IRs: +TMP_2(bool) = i < 3 +CONDITION TMP_2"]; +10->12[label="True"]; +10->11[label="False"]; +11[label="Node Type: END_IF 11 +"]; +11->13; +12[label="Node Type: CONTINUE 12 +"]; +12->5; +13[label="Node Type: NEW VARIABLE 13 + +EXPRESSION: +x = 10 + +IRs: +x(uint256) := 10(uint256)"]; +13->14; +14[label="Node Type: BEGIN_LOOP 14 +"]; +14->16; +15[label="Node Type: END_LOOP 15 +"]; +15->5; +16[label="Node Type: NEW VARIABLE 16 + +EXPRESSION: +counter_var_scope_0 = 0 + +IRs: +counter_var_scope_0(uint256) := 0(uint256)"]; +16->17; +17[label="Node Type: IF_LOOP 17 + +EXPRESSION: +counter_var <= 10 + +IRs: +TMP_3(bool) = counter_var <= 10 +CONDITION TMP_3"]; +17->19[label="True"]; +17->15[label="False"]; +18[label="Node Type: EXPRESSION 18 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +18->17; +19[label="Node Type: NEW VARIABLE 19 + +EXPRESSION: +j = counter_var + +IRs: +j(uint256) := counter_var(uint256)"]; +19->20; +20[label="Node Type: IF 20 + +EXPRESSION: +j > 10 + +IRs: +TMP_4(bool) = j > 10 +CONDITION TMP_4"]; +20->22[label="True"]; +20->21[label="False"]; +21[label="Node Type: END_IF 21 +"]; +21->23; +22[label="Node Type: CONTINUE 22 +"]; +22->18; +23[label="Node Type: IF 23 + +EXPRESSION: +j < 3 + +IRs: +TMP_5(bool) = j < 3 +CONDITION TMP_5"]; +23->25[label="True"]; +23->24[label="False"]; +24[label="Node Type: END_IF 24 +"]; +24->26; +25[label="Node Type: BREAK 25 +"]; +25->15; +26[label="Node Type: EXPRESSION 26 + +EXPRESSION: +x -= 1 + +IRs: +x(uint256) = x (c)- 1"]; +26->18; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt index 5c4123662f..575f0d55f3 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for_for_loop__0.txt @@ -4,16 +4,18 @@ digraph{ 0->1; 1[label="Node Type: BEGIN_LOOP 1 "]; -1->2; -2[label="Node Type: NEW VARIABLE 2 +1->3; +2[label="Node Type: END_LOOP 2 +"]; +3[label="Node Type: NEW VARIABLE 3 EXPRESSION: counter_var = 0 IRs: counter_var(uint256) := 0(uint256)"]; -2->3; -3[label="Node Type: IF_LOOP 3 +3->4; +4[label="Node Type: IF_LOOP 4 EXPRESSION: counter_var <= len()(self.strategies) @@ -22,9 +24,17 @@ IRs: TMP_0(uint256) = SOLIDITY_CALL len()(strategies) TMP_1(bool) = counter_var <= TMP_0 CONDITION TMP_1"]; -3->4[label="True"]; -3->6[label="False"]; -4[label="Node Type: NEW VARIABLE 4 +4->6[label="True"]; +4->2[label="False"]; +5[label="Node Type: EXPRESSION 5 + +EXPRESSION: +counter_var += 1 + +IRs: +counter_var(uint256) = counter_var (c)+ 1"]; +5->4; +6[label="Node Type: NEW VARIABLE 6 EXPRESSION: strategy = strategies[counter_var] @@ -32,8 +42,8 @@ strategy = strategies[counter_var] IRs: REF_0(address) -> strategies[counter_var] strategy(address) := REF_0(address)"]; -4->5; -5[label="Node Type: NEW VARIABLE 5 +6->7; +7[label="Node Type: NEW VARIABLE 7 EXPRESSION: z = IStrategy(strategy).asset() @@ -42,15 +52,5 @@ IRs: TMP_2 = CONVERT strategy to IStrategy TMP_3(address) = HIGH_LEVEL_CALL, dest:TMP_2(IStrategy), function:asset, arguments:[] z(address) := TMP_3(address)"]; -5->7; -6[label="Node Type: END_LOOP 6 -"]; -7[label="Node Type: EXPRESSION 7 - -EXPRESSION: -counter_var += 1 - -IRs: -counter_var(uint256) = counter_var (c)+ 1"]; -7->3; +7->5; } From 9df54e9c3a52859c42195ae24890e52f42079f3f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 07:44:39 -0500 Subject: [PATCH 116/169] update tests --- ...ast_parsing__vyper_cfgir_builtins_c__0.txt | 38 +++++++++++++ ..._vyper_cfgir_builtins_test_builtins__0.txt | 9 +-- ...parsing__vyper_cfgir_default_args_a__0.txt | 28 +++++++++ ...parsing__vyper_cfgir_default_args_b__0.txt | 24 ++++++++ ...slitherConstructorConstantVariables__0.txt | 9 +++ ...yper_cfgir_interface_conversion_bar__0.txt | 57 +++++++++++++++++++ ...yper_cfgir_interface_conversion_foo__0.txt | 12 ++++ ..._vyper_cfgir_tuple_struct___default__0.txt | 28 +++++++++ ...slitherConstructorConstantVariables__0.txt | 9 +++ tests/e2e/vyper_parsing/test_data/ERC20.vy | 13 ----- tests/e2e/vyper_parsing/test_data/builtins.vy | 21 +++---- tests/e2e/vyper_parsing/test_data/chain.vy | 4 -- .../vyper_parsing/test_data/default_args.vy | 12 ++++ tests/e2e/vyper_parsing/test_data/for.vy | 3 - .../test_data/for_break_continue.vy | 17 ++++++ tests/e2e/vyper_parsing/test_data/initarry.vy | 4 +- .../{tricky.vy => interface_constant.vy} | 0 .../{tuple.vy => interface_conversion.vy} | 2 - .../vyper_parsing/test_data/tuple_struct.vy | 10 ++++ .../test_data/{literal.vy => types.vy} | 4 -- 20 files changed, 258 insertions(+), 46 deletions(-) create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_a__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_b__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_bar__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_foo__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_struct___default__0.txt create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_types_slitherConstructorConstantVariables__0.txt delete mode 100644 tests/e2e/vyper_parsing/test_data/chain.vy create mode 100644 tests/e2e/vyper_parsing/test_data/default_args.vy create mode 100644 tests/e2e/vyper_parsing/test_data/for_break_continue.vy rename tests/e2e/vyper_parsing/test_data/{tricky.vy => interface_constant.vy} (100%) rename tests/e2e/vyper_parsing/test_data/{tuple.vy => interface_conversion.vy} (99%) create mode 100644 tests/e2e/vyper_parsing/test_data/tuple_struct.vy rename tests/e2e/vyper_parsing/test_data/{literal.vy => types.vy} (99%) diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt new file mode 100644 index 0000000000..3c6eaec3e1 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt @@ -0,0 +1,38 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +user_shares = () + +IRs: +user_shares(uint256[10]) = []"]; +1->2; +2[label="Node Type: EXPRESSION 2 + +EXPRESSION: +user_shares.append(1) + +IRs: +REF_1 -> LENGTH user_shares +TMP_3(uint256) := REF_1(uint256) +TMP_4(uint256) = TMP_3 (c)+ 1 +REF_1(uint256) (->user_shares) := TMP_4(uint256) +REF_2(uint256) -> user_shares[TMP_3] +REF_2(uint256) (->user_shares) := 1(uint256)"]; +2->3; +3[label="Node Type: EXPRESSION 3 + +EXPRESSION: +user_shares.pop() + +IRs: +REF_4 -> LENGTH user_shares +TMP_6(uint256) = REF_4 (c)- 1 +REF_5(uint256) -> user_shares[TMP_6] +REF_5 = delete REF_5 +REF_6 -> LENGTH user_shares +REF_6(uint256) (->user_shares) := TMP_6(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt index 07141a2b12..9b7768a6b5 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt @@ -53,10 +53,11 @@ f(uint256) := block.timestamp(uint256)"]; 7[label="Node Type: NEW VARIABLE 7 EXPRESSION: -h = chain.id +h = bytes32(chain.id) IRs: -h(uint256) := chain.id(uint256)"]; +TMP_0 = CONVERT chain.id to bytes32 +h(bytes32) := TMP_0(bytes32)"]; 7->8; 8[label="Node Type: NEW VARIABLE 8 @@ -64,8 +65,8 @@ EXPRESSION: i = slice()(msg.data,0,32) IRs: -TMP_0(None) = SOLIDITY_CALL slice()(msg.data,0,32) -i(bytes[32]) = ['TMP_0(None)']"]; +TMP_1(None) = SOLIDITY_CALL slice()(msg.data,0,32) +i(bytes[32]) = ['TMP_1(None)']"]; 8->9; 9[label="Node Type: NEW VARIABLE 9 diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_a__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_a__0.txt new file mode 100644 index 0000000000..2f0451a520 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_a__0.txt @@ -0,0 +1,28 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: EXPRESSION 1 + +EXPRESSION: +self.b(x,True) + +IRs: +INTERNAL_CALL, default_args.b()(x,True)"]; +1->2; +2[label="Node Type: EXPRESSION 2 + +EXPRESSION: +self.b(1,self.config) + +IRs: +INTERNAL_CALL, default_args.b()(1,config)"]; +2->3; +3[label="Node Type: EXPRESSION 3 + +EXPRESSION: +self.b(1,z) + +IRs: +INTERNAL_CALL, default_args.b()(1,z)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_b__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_b__0.txt new file mode 100644 index 0000000000..23126acaec --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_default_args_b__0.txt @@ -0,0 +1,24 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: IF 1 + +EXPRESSION: +config + +IRs: +CONDITION config"]; +1->3[label="True"]; +1->2[label="False"]; +2[label="Node Type: END_IF 2 +"]; +3[label="Node Type: EXPRESSION 3 + +EXPRESSION: +self.counter = y + +IRs: +counter(uint256) := y(uint256)"]; +3->2; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt new file mode 100644 index 0000000000..753f5a9385 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt @@ -0,0 +1,9 @@ +digraph{ +0[label="Node Type: OTHER_ENTRYPOINT 0 + +EXPRESSION: +MAX_TICKS_UINT = 50 + +IRs: +MAX_TICKS_UINT(uint256) := 50(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_bar__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_bar__0.txt new file mode 100644 index 0000000000..1a19c56145 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_bar__0.txt @@ -0,0 +1,57 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +a = 0 + +IRs: +a(int128) := 0(uint256)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +b = 0 + +IRs: +b(int128) := 0(uint256)"]; +2->3; +3[label="Node Type: EXPRESSION 3 + +EXPRESSION: +(a,b) = self.foo() + +IRs: +TUPLE_0(int128,int128) = INTERNAL_CALL, interface_conversion.foo()() +a(int128)= UNPACK TUPLE_0 index: 0 +b(int128)= UNPACK TUPLE_0 index: 1 "]; +3->4; +4[label="Node Type: NEW VARIABLE 4 + +EXPRESSION: +x = 0x0000000000000000000000000000000000000000 + +IRs: +x(address) := 0(address)"]; +4->5; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +c = 0 + +IRs: +c(uint256) := 0(uint256)"]; +5->6; +6[label="Node Type: EXPRESSION 6 + +EXPRESSION: +(a,c) = Test(x).foo() + +IRs: +TMP_0 = CONVERT x to Test +TUPLE_1(int128,uint256) = HIGH_LEVEL_CALL, dest:TMP_0(Test), function:foo, arguments:[] +a(int128)= UNPACK TUPLE_1 index: 0 +c(uint256)= UNPACK TUPLE_1 index: 1 "]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_foo__0.txt new file mode 100644 index 0000000000..8d1c1166b2 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_foo__0.txt @@ -0,0 +1,12 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: RETURN 1 + +EXPRESSION: +(2,3) + +IRs: +RETURN 2,3"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_struct___default__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_struct___default__0.txt new file mode 100644 index 0000000000..7587cdfa2d --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_struct___default__0.txt @@ -0,0 +1,28 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +chainlink_lrd = Test(msg.sender).get() + +IRs: +TMP_0 = CONVERT msg.sender to Test +TUPLE_0(uint80,int256,uint256,uint256,uint80) = HIGH_LEVEL_CALL, dest:TMP_0(Test), function:get, arguments:[] +TMP_1(uint80)= UNPACK TUPLE_0 index: 0 +TMP_2(int256)= UNPACK TUPLE_0 index: 1 +TMP_3(uint256)= UNPACK TUPLE_0 index: 2 +TMP_4(uint256)= UNPACK TUPLE_0 index: 3 +TMP_5(uint80)= UNPACK TUPLE_0 index: 4 +chainlink_lrd(FAKE_TUPLE_0_1_2_3_4) = new FAKE_TUPLE_0_1_2_3_4(TMP_1,TMP_2,TMP_3,TMP_4,TMP_5)"]; +1->2; +2[label="Node Type: RETURN 2 + +EXPRESSION: +chainlink_lrd[0] + +IRs: +REF_1(uint80) -> chainlink_lrd._0 +RETURN REF_1"]; +} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_types_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_types_slitherConstructorConstantVariables__0.txt new file mode 100644 index 0000000000..b53263a8d7 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_types_slitherConstructorConstantVariables__0.txt @@ -0,0 +1,9 @@ +digraph{ +0[label="Node Type: OTHER_ENTRYPOINT 0 + +EXPRESSION: +MAX_BANDS = 10 + +IRs: +MAX_BANDS(uint256) := 10(uint256)"]; +} diff --git a/tests/e2e/vyper_parsing/test_data/ERC20.vy b/tests/e2e/vyper_parsing/test_data/ERC20.vy index 682b8cf268..a3bb62694b 100644 --- a/tests/e2e/vyper_parsing/test_data/ERC20.vy +++ b/tests/e2e/vyper_parsing/test_data/ERC20.vy @@ -1,22 +1,9 @@ interface ERC20: - def totalSupply() -> uint256: view - - - def balanceOf(_owner: address) -> uint256: view - - - def allowance(_owner: address, _spender: address) -> uint256: view - - def transfer(_to: address, _value: uint256) -> bool: nonpayable - - def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable - - def approve(_spender: address, _value: uint256) -> bool: nonpayable diff --git a/tests/e2e/vyper_parsing/test_data/builtins.vy b/tests/e2e/vyper_parsing/test_data/builtins.vy index 4fb908a094..4c4a72927c 100644 --- a/tests/e2e/vyper_parsing/test_data/builtins.vy +++ b/tests/e2e/vyper_parsing/test_data/builtins.vy @@ -3,29 +3,22 @@ @external def test_builtins(): a: address = block.coinbase - b: uint256 = block.difficulty - c: uint256 = block.prevrandao - d: uint256 = block.number - e: bytes32 = block.prevhash - f: uint256 = block.timestamp - - h: uint256 = chain.id - + h: bytes32 = convert(chain.id, bytes32) i: Bytes[32] = slice(msg.data, 0, 32) - j: uint256 = msg.gas - k: address = msg.sender - l: uint256 = msg.value - m: address = tx.origin - n: uint256 = tx.gasprice - x: uint256 = self.balance + +@external +def c(x: uint256): + user_shares: DynArray[uint256, 10] = [] + user_shares.append(1) + user_shares.pop() diff --git a/tests/e2e/vyper_parsing/test_data/chain.vy b/tests/e2e/vyper_parsing/test_data/chain.vy deleted file mode 100644 index 81a7704794..0000000000 --- a/tests/e2e/vyper_parsing/test_data/chain.vy +++ /dev/null @@ -1,4 +0,0 @@ - -@external -def test(): - x: bytes32 = convert(chain.id, bytes32) \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/default_args.vy b/tests/e2e/vyper_parsing/test_data/default_args.vy new file mode 100644 index 0000000000..10115363b4 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/default_args.vy @@ -0,0 +1,12 @@ +counter: uint256 +config: bool +@internal +def b(y: uint256, config: bool = True): + if config: + self.counter = y + +@external +def a(x: uint256, z: bool): + self.b(x) + self.b(1, self.config) + self.b(1, z) \ No newline at end of file diff --git a/tests/e2e/vyper_parsing/test_data/for.vy b/tests/e2e/vyper_parsing/test_data/for.vy index b9f09bf6f6..7df83bbbb7 100644 --- a/tests/e2e/vyper_parsing/test_data/for.vy +++ b/tests/e2e/vyper_parsing/test_data/for.vy @@ -16,9 +16,6 @@ interface IStrategy: def convertToShares(assets: uint256) -> uint256: view def previewWithdraw(assets: uint256) -> uint256: view - - - struct X: y: int8 diff --git a/tests/e2e/vyper_parsing/test_data/for_break_continue.vy b/tests/e2e/vyper_parsing/test_data/for_break_continue.vy new file mode 100644 index 0000000000..3ea8e6cbd1 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/for_break_continue.vy @@ -0,0 +1,17 @@ +@external +def f(): + for i in range(100): + if (i > 100): + break + + if (i < 3): + continue + x: uint256 = 10 + for j in range(10): + if (j > 10): + continue + + if (j < 3): + break + + x -= 1 diff --git a/tests/e2e/vyper_parsing/test_data/initarry.vy b/tests/e2e/vyper_parsing/test_data/initarry.vy index bfbd29a27f..35c3c06937 100644 --- a/tests/e2e/vyper_parsing/test_data/initarry.vy +++ b/tests/e2e/vyper_parsing/test_data/initarry.vy @@ -3,8 +3,8 @@ interface ERC20: def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable def approve(_spender: address, _value: uint256) -> bool: nonpayable -BORROWED_TOKEN: immutable(ERC20) # x -COLLATERAL_TOKEN: immutable(ERC20) # x +BORROWED_TOKEN: immutable(ERC20) +COLLATERAL_TOKEN: immutable(ERC20) @external def __init__(x: address, y: address): diff --git a/tests/e2e/vyper_parsing/test_data/tricky.vy b/tests/e2e/vyper_parsing/test_data/interface_constant.vy similarity index 100% rename from tests/e2e/vyper_parsing/test_data/tricky.vy rename to tests/e2e/vyper_parsing/test_data/interface_constant.vy diff --git a/tests/e2e/vyper_parsing/test_data/tuple.vy b/tests/e2e/vyper_parsing/test_data/interface_conversion.vy similarity index 99% rename from tests/e2e/vyper_parsing/test_data/tuple.vy rename to tests/e2e/vyper_parsing/test_data/interface_conversion.vy index f0c7e66fe8..4bdbd72773 100644 --- a/tests/e2e/vyper_parsing/test_data/tuple.vy +++ b/tests/e2e/vyper_parsing/test_data/interface_conversion.vy @@ -1,5 +1,3 @@ - - interface Test: def foo() -> (int128, uint256): nonpayable diff --git a/tests/e2e/vyper_parsing/test_data/tuple_struct.vy b/tests/e2e/vyper_parsing/test_data/tuple_struct.vy new file mode 100644 index 0000000000..1bcb57b850 --- /dev/null +++ b/tests/e2e/vyper_parsing/test_data/tuple_struct.vy @@ -0,0 +1,10 @@ +interface Test: + def get() -> (uint80, int256, uint256, uint256, uint80): view +@external +def __default__() -> uint80: + chainlink_lrd: (uint80, int256, uint256, uint256, uint80) = Test(msg.sender).get() + return chainlink_lrd[0] + + + + diff --git a/tests/e2e/vyper_parsing/test_data/literal.vy b/tests/e2e/vyper_parsing/test_data/types.vy similarity index 99% rename from tests/e2e/vyper_parsing/test_data/literal.vy rename to tests/e2e/vyper_parsing/test_data/types.vy index e0686301e7..02f18fe5ae 100644 --- a/tests/e2e/vyper_parsing/test_data/literal.vy +++ b/tests/e2e/vyper_parsing/test_data/types.vy @@ -3,13 +3,9 @@ symbol: public(String[32]) decimals: public(uint256) totalSupply: public(uint256) - - - balances: HashMap[address, uint256] allowances: HashMap[address, HashMap[address, uint256]] - MAX_BANDS: constant(uint256) = 10 x: public(uint256[3][4]) From a6209dfe5315b5ceb01582d834e379905b315aa9 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 07:45:12 -0500 Subject: [PATCH 117/169] cleanup --- .../vyper_parsing/declarations/contract.py | 2 - .../expressions/expression_parsing.py | 28 ++----------- .../expressions/find_variable.py | 41 +++++++------------ slither/vyper_parsing/type_parsing.py | 6 +-- .../vyper_parsing/variables/event_variable.py | 1 - 5 files changed, 19 insertions(+), 59 deletions(-) diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index 0e2140fa1c..a4e098942a 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -459,7 +459,6 @@ def parse_structs(self) -> None: def parse_state_variables(self) -> None: for varNotParsed in self._variablesNotParsed: - print(varNotParsed) var = StateVariable() var.set_contract(self._contract) var.set_offset(varNotParsed.src, self._contract.compilation_unit) @@ -506,7 +505,6 @@ def analyze_state_variables(self): var_parser.analyze(self._contract) def analyze(self) -> None: - print("Analyze", self._contract._name) for struct_parser in self._structures_parser: struct_parser.analyze(self._contract) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 3f76ea2814..aec07143cc 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -74,9 +74,6 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": - print("parse_expression") - print(expression, "\n") - # assert False if isinstance(expression, Int): literal = Literal(str(expression.value), ElementaryType("uint256")) @@ -106,8 +103,6 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": return literal if isinstance(expression, Call): - print("Call") - print(expression) called = parse_expression(expression.func, caller_context) if isinstance(called, Identifier) and isinstance(called.value, SolidityFunction): if called.value.name == "empty()": @@ -195,8 +190,6 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": rets = None if isinstance(called, Identifier): - print("called", called) - print("called.value", called.value.__class__.__name__) # Since the AST lacks the type of the return values, we recover it. if isinstance(called.value, Function): rets = called.value.returns @@ -235,7 +228,6 @@ def get_type_str(x): return x return str(x.type) - print(rets) # def vars_to_typestr(rets: List[Expression]) -> str: # if len(rets) == 0: # return "" @@ -248,7 +240,6 @@ def get_type_str(x): if len(rets) == 1 else f"tuple({','.join(map(get_type_str, rets))})" ) - print(arguments) parsed_expr = CallExpression(called, arguments, type_str) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr @@ -258,9 +249,7 @@ def get_type_str(x): if isinstance(expression.value, Name): # TODO this is ambiguous because it could be a state variable or a call to balance if expression.value.id == "self" and member_name != "balance": - var, was_created = find_variable(member_name, caller_context, is_self=True) - if was_created: - var.set_offset(expression.src, caller_context.compilation_unit) + var = find_variable(member_name, caller_context, is_self=True) parsed_expr = SelfIdentifier(var) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) var.references.append(parsed_expr.source_mapping) @@ -286,12 +275,9 @@ def get_type_str(x): # (recover_type_1) This may be a call to an interface and we don't have the return types, # so we see if there's a function identifier with `member_name` and propagate the type to # its enclosing `CallExpression` - print(expr) - print(expr.__class__.__name__) - if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType): # If we access a member of an interface, needs to be interface instead of self namespace - var, was_created = find_variable(member_name, expr.type.type) + var = find_variable(member_name, expr.type.type) if isinstance(var, Function): rets = var.returns @@ -313,9 +299,7 @@ def get_type_str(x): return member_access if isinstance(expression, Name): - var, was_created = find_variable(expression.id, caller_context) - if was_created: - var.set_offset(expression.src, caller_context.compilation_unit) + var = find_variable(expression.id, caller_context) parsed_expr = Identifier(var) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr @@ -398,12 +382,6 @@ def get_type_str(x): return conditions.pop() - for elem in expression.right.elements: - elem_expr = parse_expression(elem, caller_context) - print("elem", repr(elem_expr)) - parsed_expr = BinaryOperation(lhs, elem_expr, inner_op) - parsed_expr.set_offset(expression.src, caller_context.compilation_unit) - conditions.append(parsed_expr) else: # enum type membership check https://docs.vyperlang.org/en/stable/types.html?h#id18 is_member_op = ( BinaryOperationType.get_type("==") diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index e888aa0148..06fcce995d 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -35,7 +35,6 @@ def _find_variable_in_function_parser( if function_parser is None: return None func_variables = function_parser.variables_as_dict - print("func_variables", func_variables) if var_name in func_variables: return func_variables[var_name] @@ -51,13 +50,11 @@ def _find_in_contract( return None # variable are looked from the contract declarer - print(contract) contract_variables = contract.variables_as_dict if var_name in contract_variables: return contract_variables[var_name] functions = {f.name: f for f in contract.functions if not f.is_shadowed} - # print(functions) if var_name in functions: return functions[var_name] @@ -74,7 +71,7 @@ def _find_in_contract( if var_name in enums: return enums[var_name] - # If the enum is refered as its name rather than its canonicalName + # If the enum is referred as its name rather than its canonicalName enums = {e.name: e for e in contract.enums} if var_name in enums: return enums[var_name] @@ -84,7 +81,7 @@ def _find_in_contract( def find_variable( var_name: str, - caller_context, + caller_context: Union[FunctionContract, Contract], is_self: bool = False, ) -> Tuple[ Union[ @@ -96,8 +93,7 @@ def find_variable( Event, Enum, Structure, - ], - bool, + ] ]: """ Return the variable found and a boolean indicating if the variable was created @@ -107,6 +103,8 @@ def find_variable( :type var_name: :param caller_context: :type caller_context: + :param is_self: + :type is_self: :return: :rtype: """ @@ -114,59 +112,48 @@ def find_variable( from slither.vyper_parsing.declarations.contract import ContractVyper from slither.vyper_parsing.declarations.function import FunctionVyper - print("caller_context") - print(caller_context) - print(caller_context.__class__.__name__) - print("var", var_name) if isinstance(caller_context, Contract): - direct_contracts = [caller_context] - direct_functions = caller_context.functions_declared current_scope = caller_context.file_scope next_context = caller_context else: - direct_contracts = [caller_context.contract] - direct_functions = caller_context.contract.functions_declared current_scope = caller_context.contract.file_scope next_context = caller_context.contract - # print(direct_functions) function_parser: Optional[FunctionVyper] = ( caller_context if isinstance(caller_context, FunctionContract) else None ) - # print("function_parser", function_parser) + # If a local shadows a state variable but the attribute is `self`, we want to # return the state variable and not the local. if not is_self: ret1 = _find_variable_in_function_parser(var_name, function_parser) if ret1: - return ret1, False + return ret1 ret = _find_in_contract(var_name, next_context, caller_context) if ret: - return ret, False + return ret - # print(current_scope.variables) if var_name in current_scope.variables: - return current_scope.variables[var_name], False + return current_scope.variables[var_name] # Could refer to any enum all_enumss = [c.enums_as_dict for c in current_scope.contracts.values()] all_enums = {k: v for d in all_enumss for k, v in d.items()} if var_name in all_enums: - return all_enums[var_name], False + return all_enums[var_name] contracts = current_scope.contracts if var_name in contracts: - return contracts[var_name], False + return contracts[var_name] if var_name in SOLIDITY_VARIABLES: - return SolidityVariable(var_name), False + return SolidityVariable(var_name) if f"{var_name}()" in SOLIDITY_FUNCTIONS: - return SolidityFunction(f"{var_name}()"), False + return SolidityFunction(f"{var_name}()") - print(next_context.events_as_dict) if f"{var_name}()" in next_context.events_as_dict: - return next_context.events_as_dict[f"{var_name}()"], False + return next_context.events_as_dict[f"{var_name}()"] raise VariableNotFound(f"Variable not found: {var_name} (context {caller_context})") diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index fc45a144c7..b8f9b468e2 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -12,7 +12,7 @@ from slither.core.declarations.function_contract import FunctionContract -def parse_type(annotation: Union[Name, Subscript, Call], caller_context): +def parse_type(annotation: Union[Name, Subscript, Call, Tuple], caller_context): from slither.vyper_parsing.expressions.expression_parsing import parse_expression if isinstance(caller_context, FunctionContract): @@ -21,7 +21,7 @@ def parse_type(annotation: Union[Name, Subscript, Call], caller_context): contract = caller_context assert isinstance(annotation, (Name, Subscript, Call, Tuple)) - print(annotation) + if isinstance(annotation, Name): name = annotation.id elif isinstance(annotation, Subscript): @@ -90,11 +90,9 @@ def parse_type(annotation: Union[Name, Subscript, Call], caller_context): if name in contract.structures_as_dict: return UserDefinedType(contract.structures_as_dict[name]) - print(contract.enums_as_dict) if name in contract.enums_as_dict: return UserDefinedType(contract.enums_as_dict[name]) - print(contract.file_scope.contracts) if name in contract.file_scope.contracts: return UserDefinedType(contract.file_scope.contracts[name]) assert False diff --git a/slither/vyper_parsing/variables/event_variable.py b/slither/vyper_parsing/variables/event_variable.py index 5167610a80..2f7fe7c850 100644 --- a/slither/vyper_parsing/variables/event_variable.py +++ b/slither/vyper_parsing/variables/event_variable.py @@ -7,7 +7,6 @@ class EventVariableVyper: def __init__(self, variable: EventVariable, variable_data: AnnAssign): - print(variable_data) self._variable = variable self._variable.name = variable_data.target.id if ( From c21798021c3aebbb39348898ba1ed611370d4d28 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 10:11:00 -0500 Subject: [PATCH 118/169] fix some lint warnings --- slither/core/compilation_unit.py | 6 +- slither/slither.py | 3 +- .../visitors/slithir/expression_to_slithir.py | 4 +- slither/vyper_parsing/ast/types.py | 5 +- slither/vyper_parsing/cfg/node.py | 2 +- .../vyper_parsing/declarations/contract.py | 1 - slither/vyper_parsing/declarations/event.py | 1 - .../vyper_parsing/declarations/function.py | 457 +++++++++--------- slither/vyper_parsing/declarations/struct.py | 2 +- .../expressions/expression_parsing.py | 23 +- .../expressions/find_variable.py | 17 +- slither/vyper_parsing/type_parsing.py | 7 +- .../vyper_parsing/variables/event_variable.py | 2 - .../vyper_parsing/variables/state_variable.py | 2 - .../variables/structure_variable.py | 3 - .../vyper_parsing/vyper_compilation_unit.py | 2 +- tests/e2e/vyper_parsing/test_ast_parsing.py | 1 - .../unit/slithir/vyper/test_ir_generation.py | 27 +- 18 files changed, 249 insertions(+), 316 deletions(-) diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index 556c6c7da8..c1ce98d37e 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -38,10 +38,10 @@ class Language(Enum): def from_str(label: str): if label == "solc": return Language.SOLIDITY - elif label == "vyper": + if label == "vyper": return Language.VYPER - else: - raise ValueError(f"Unknown language: {label}") + + raise ValueError(f"Unknown language: {label}") # pylint: disable=too-many-instance-attributes,too-many-public-methods diff --git a/slither/slither.py b/slither/slither.py index 07444c72f8..b434cfccb5 100644 --- a/slither/slither.py +++ b/slither/slither.py @@ -13,6 +13,7 @@ from slither.solc_parsing.slither_compilation_unit_solc import SlitherCompilationUnitSolc from slither.vyper_parsing.vyper_compilation_unit import VyperCompilationUnit from slither.utils.output import Output +from slither.vyper_parsing.ast.ast import parse logger = logging.getLogger("Slither") logging.basicConfig() @@ -103,8 +104,6 @@ def __init__(self, target: Union[str, CryticCompile], **kwargs) -> None: if compilation_unit_slither.is_vyper: vyper_parser = VyperCompilationUnit(compilation_unit_slither) for path, ast in compilation_unit.asts.items(): - from slither.vyper_parsing.ast.ast import parse - ast_nodes = parse(ast["ast"]) vyper_parser.parse_module(ast_nodes, path) self._parsers.append(vyper_parser) diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index fa8cef8e3b..c43b2507f2 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -171,7 +171,9 @@ def __init__(self, expression: Expression, node: "Node") -> None: def result(self) -> List[Operation]: return self._result - def _post_assignement_operation(self, expression: AssignmentOperation) -> None: + def _post_assignement_operation( + self, expression: AssignmentOperation + ) -> None: # pylint: disable=too-many-branches,too-many-statements left = get(expression.expression_left) right = get(expression.expression_right) operation: Operation diff --git a/slither/vyper_parsing/ast/types.py b/slither/vyper_parsing/ast/types.py index 6eff6d2527..d62bf6fb45 100644 --- a/slither/vyper_parsing/ast/types.py +++ b/slither/vyper_parsing/ast/types.py @@ -1,5 +1,5 @@ from __future__ import annotations -from typing import List, Optional, Dict, Union, ForwardRef +from typing import List, Optional, Union from dataclasses import dataclass @@ -167,9 +167,6 @@ class Raise(ASTNode): exc: ASTNode -from enum import Enum - - @dataclass class Expr(ASTNode): value: ASTNode diff --git a/slither/vyper_parsing/cfg/node.py b/slither/vyper_parsing/cfg/node.py index 3d5ffee91e..5a584fe164 100644 --- a/slither/vyper_parsing/cfg/node.py +++ b/slither/vyper_parsing/cfg/node.py @@ -1,4 +1,4 @@ -from typing import Union, Optional, Dict, TYPE_CHECKING +from typing import Optional, Dict from slither.core.cfg.node import Node from slither.core.cfg.node import NodeType diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index a4e098942a..2cd14f1d0b 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -1,4 +1,3 @@ -import logging from pathlib import Path from typing import List, TYPE_CHECKING from slither.vyper_parsing.ast.types import ( diff --git a/slither/vyper_parsing/declarations/event.py b/slither/vyper_parsing/declarations/event.py index e6ed5a12e3..b73e462113 100644 --- a/slither/vyper_parsing/declarations/event.py +++ b/slither/vyper_parsing/declarations/event.py @@ -1,7 +1,6 @@ """ Event module """ -from typing import TYPE_CHECKING, Dict from slither.core.variables.event_variable import EventVariable from slither.vyper_parsing.variables.event_variable import EventVariableVyper diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 9932a7c226..17d77cfb94 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -1,16 +1,13 @@ -import logging -from typing import Dict, Optional, Union, List, TYPE_CHECKING, Tuple, Set +from typing import Dict, Union, List, TYPE_CHECKING, Tuple -from slither.core.cfg.node import NodeType, link_nodes, insert_node, Node +from slither.core.cfg.node import NodeType, link_nodes, Node from slither.core.cfg.scope import Scope -from slither.core.declarations.contract import Contract from slither.core.declarations.function import ( Function, FunctionType, ) from slither.core.declarations.function import ModifierStatements from slither.core.declarations.modifier import Modifier -from slither.core.expressions import AssignmentOperation from slither.core.source_mapping.source_mapping import Source from slither.core.variables.local_variable import LocalVariable from slither.vyper_parsing.cfg.node import NodeVyper @@ -41,6 +38,7 @@ def __init__( self._functionNotParsed = function_data self._decoratorNotParsed = None self._local_variables_parser: List[LocalVariableVyper] = [] + self._variables_renamed = [] self._contract_parser = contract_parser self._node_to_NodeVyper: Dict[Node, NodeVyper] = {} @@ -226,277 +224,268 @@ def _parse_cfg(self, cfg: List[ASTNode]) -> None: self._function.entry_point = entry_node.underlying_node scope = Scope(True, False, self.underlying_function) - curr_node = entry_node - for expr in cfg: + def parse_statement( + curr_node: NodeVyper, + expr: ASTNode, + continue_destination=None, + break_destination=None, + ) -> NodeVyper: + if isinstance(expr, AnnAssign): + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) + + local_var_parser = LocalVariableVyper(local_var, expr) + self._add_local_variable(local_var_parser) + + new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + if expr.value is not None: + local_var.initialized = True + new_node.add_unparsed_expression(expr.value) + new_node.underlying_node.add_variable_declaration(local_var) + link_underlying_nodes(curr_node, new_node) - def parse_statement( - curr_node: NodeVyper, - expr: ASTNode, - continue_destination=None, - break_destination=None, - ) -> NodeVyper: - if isinstance(expr, AnnAssign): - local_var = LocalVariable() - local_var.set_function(self._function) - local_var.set_offset(expr.src, self._function.compilation_unit) - - local_var_parser = LocalVariableVyper(local_var, expr) - self._add_local_variable(local_var_parser) - - new_node = self._new_node(NodeType.VARIABLE, expr.src, scope) - if expr.value is not None: - local_var.initialized = True - new_node.add_unparsed_expression(expr.value) - new_node.underlying_node.add_variable_declaration(local_var) - link_underlying_nodes(curr_node, new_node) + curr_node = new_node - curr_node = new_node + elif isinstance(expr, (AugAssign, Assign)): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) + link_underlying_nodes(curr_node, new_node) - elif isinstance(expr, (AugAssign, Assign)): + curr_node = new_node + + elif isinstance(expr, Expr): + # TODO This is a workaround to handle Vyper putting payable/view in the function body... + if not isinstance(expr.value, Name): new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr) + new_node.add_unparsed_expression(expr.value) link_underlying_nodes(curr_node, new_node) curr_node = new_node - elif isinstance(expr, Expr): - # TODO This is a workaround to handle Vyper putting payable/view in the function body... - if not isinstance(expr.value, Name): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr.value) - link_underlying_nodes(curr_node, new_node) + elif isinstance(expr, For): - curr_node = new_node + node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) + node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) - elif isinstance(expr, For): + link_underlying_nodes(curr_node, node_startLoop) - node_startLoop = self._new_node(NodeType.STARTLOOP, expr.src, scope) - node_endLoop = self._new_node(NodeType.ENDLOOP, expr.src, scope) + local_var = LocalVariable() + local_var.set_function(self._function) + local_var.set_offset(expr.src, self._function.compilation_unit) - link_underlying_nodes(curr_node, node_startLoop) - - local_var = LocalVariable() - local_var.set_function(self._function) - local_var.set_offset(expr.src, self._function.compilation_unit) - - counter_var = AnnAssign( - expr.target.src, - expr.target.node_id, - target=Name("-1:-1:-1", -1, "counter_var"), - annotation=Name("-1:-1:-1", -1, "uint256"), - value=Int("-1:-1:-1", -1, 0), - ) - local_var_parser = LocalVariableVyper(local_var, counter_var) - self._add_local_variable(local_var_parser) - counter_node = self._new_node(NodeType.VARIABLE, expr.src, scope) - local_var.initialized = True - counter_node.add_unparsed_expression(counter_var.value) - counter_node.underlying_node.add_variable_declaration(local_var) - - link_underlying_nodes(node_startLoop, counter_node) - - node_condition = None - if isinstance(expr.iter, (Attribute, Name)): - # HACK - # The loop variable is not annotated so we infer its type by looking at the type of the iterator - if isinstance(expr.iter, Attribute): # state variable - iter_expr = expr.iter - loop_iterator = list( - filter( - lambda x: x._variable.name == iter_expr.attr, - self._contract_parser._variables_parser, - ) - )[0] - - else: # local variable - iter_expr = expr.iter - loop_iterator = list( - filter( - lambda x: x._variable.name == iter_expr.id, - self._local_variables_parser, - ) - )[0] - - # TODO use expr.src instead of -1:-1:1? - cond_expr = Compare( - "-1:-1:-1", - -1, - left=Name("-1:-1:-1", -1, "counter_var"), - op="<=", - right=Call( - "-1:-1:-1", - -1, - func=Name("-1:-1:-1", -1, "len"), - args=[iter_expr], - keywords=[], - keyword=None, - ), - ) - node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) - node_condition.add_unparsed_expression(cond_expr) - - if loop_iterator._elem_to_parse.value.id == "DynArray": - loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[ - 0 - ] - else: - loop_var_annotation = loop_iterator._elem_to_parse.value - - value = Subscript( - "-1:-1:-1", - -1, - value=Name("-1:-1:-1", -1, loop_iterator._variable.name), - slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var")), - ) - loop_var = AnnAssign( - expr.target.src, - expr.target.node_id, - target=expr.target, - annotation=loop_var_annotation, - value=value, - ) - - elif isinstance(expr.iter, Call): # range - range_val = expr.iter.args[0] - cond_expr = Compare( + counter_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=Name("-1:-1:-1", -1, "counter_var"), + annotation=Name("-1:-1:-1", -1, "uint256"), + value=Int("-1:-1:-1", -1, 0), + ) + local_var_parser = LocalVariableVyper(local_var, counter_var) + self._add_local_variable(local_var_parser) + counter_node = self._new_node(NodeType.VARIABLE, expr.src, scope) + local_var.initialized = True + counter_node.add_unparsed_expression(counter_var.value) + counter_node.underlying_node.add_variable_declaration(local_var) + + link_underlying_nodes(node_startLoop, counter_node) + + node_condition = None + if isinstance(expr.iter, (Attribute, Name)): + # HACK + # The loop variable is not annotated so we infer its type by looking at the type of the iterator + if isinstance(expr.iter, Attribute): # state variable + iter_expr = expr.iter + loop_iterator = list( + filter( + lambda x: x._variable.name == iter_expr.attr, + self._contract_parser._variables_parser, + ) + )[0] + + else: # local variable + iter_expr = expr.iter + loop_iterator = list( + filter( + lambda x: x._variable.name == iter_expr.id, + self._local_variables_parser, + ) + )[0] + + # TODO use expr.src instead of -1:-1:1? + cond_expr = Compare( + "-1:-1:-1", + -1, + left=Name("-1:-1:-1", -1, "counter_var"), + op="<=", + right=Call( "-1:-1:-1", -1, - left=Name("-1:-1:-1", -1, "counter_var"), - op="<=", - right=range_val, - ) - node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) - node_condition.add_unparsed_expression(cond_expr) - loop_var = AnnAssign( - expr.target.src, - expr.target.node_id, - target=expr.target, - annotation=Name("-1:-1:-1", -1, "uint256"), - value=Name("-1:-1:-1", -1, "counter_var"), - ) + func=Name("-1:-1:-1", -1, "len"), + args=[iter_expr], + keywords=[], + keyword=None, + ), + ) + node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) + node_condition.add_unparsed_expression(cond_expr) + if loop_iterator._elem_to_parse.value.id == "DynArray": + loop_var_annotation = loop_iterator._elem_to_parse.slice.value.elements[0] else: - raise NotImplementedError + loop_var_annotation = loop_iterator._elem_to_parse.value - # After creating condition node, we link it declaration of the loop variable - link_underlying_nodes(counter_node, node_condition) + value = Subscript( + "-1:-1:-1", + -1, + value=Name("-1:-1:-1", -1, loop_iterator._variable.name), + slice=Index("-1:-1:-1", -1, value=Name("-1:-1:-1", -1, "counter_var")), + ) + loop_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=expr.target, + annotation=loop_var_annotation, + value=value, + ) - # Create an expression for the loop increment (counter_var += 1) - loop_increment = AugAssign( + elif isinstance(expr.iter, Call): # range + range_val = expr.iter.args[0] + cond_expr = Compare( "-1:-1:-1", -1, - target=Name("-1:-1:-1", -1, "counter_var"), - op="+=", - value=Int("-1:-1:-1", -1, 1), + left=Name("-1:-1:-1", -1, "counter_var"), + op="<=", + right=range_val, + ) + node_condition = self._new_node(NodeType.IFLOOP, expr.src, scope) + node_condition.add_unparsed_expression(cond_expr) + loop_var = AnnAssign( + expr.target.src, + expr.target.node_id, + target=expr.target, + annotation=Name("-1:-1:-1", -1, "uint256"), + value=Name("-1:-1:-1", -1, "counter_var"), ) - node_increment = self._new_node(NodeType.EXPRESSION, expr.src, scope) - node_increment.add_unparsed_expression(loop_increment) - link_underlying_nodes(node_increment, node_condition) - - prev_continue_destination = continue_destination - prev_break_destination = break_destination - continue_destination = node_increment - break_destination = node_endLoop - - # We assign the index variable or range variable in the loop body on each iteration - expr.body.insert(0, loop_var) - body_node = None - new_node = node_condition - for stmt in expr.body: - body_node = parse_statement( - new_node, stmt, continue_destination, break_destination - ) - new_node = body_node - - # Reset to previous jump destinations for nested loops - continue_destination = prev_continue_destination - break_destination = prev_break_destination - - if body_node is not None: - link_underlying_nodes(body_node, node_increment) - - link_underlying_nodes(node_condition, node_endLoop) - - curr_node = node_endLoop - - elif isinstance(expr, Continue): - new_node = self._new_node(NodeType.CONTINUE, expr.src, scope) - link_underlying_nodes(curr_node, new_node) - link_underlying_nodes(new_node, continue_destination) - elif isinstance(expr, Break): - new_node = self._new_node(NodeType.BREAK, expr.src, scope) - link_underlying_nodes(curr_node, new_node) - link_underlying_nodes(new_node, break_destination) + else: + raise NotImplementedError + + # After creating condition node, we link it declaration of the loop variable + link_underlying_nodes(counter_node, node_condition) + + # Create an expression for the loop increment (counter_var += 1) + loop_increment = AugAssign( + "-1:-1:-1", + -1, + target=Name("-1:-1:-1", -1, "counter_var"), + op="+=", + value=Int("-1:-1:-1", -1, 1), + ) + node_increment = self._new_node(NodeType.EXPRESSION, expr.src, scope) + node_increment.add_unparsed_expression(loop_increment) + link_underlying_nodes(node_increment, node_condition) + + continue_destination = node_increment + break_destination = node_endLoop + + # We assign the index variable or range variable in the loop body on each iteration + expr.body.insert(0, loop_var) + body_node = None + new_node = node_condition + for stmt in expr.body: + body_node = parse_statement( + new_node, stmt, continue_destination, break_destination + ) + new_node = body_node - elif isinstance(expr, Return): - new_node = self._new_node(NodeType.RETURN, expr.src, scope) - if expr.value is not None: - new_node.add_unparsed_expression(expr.value) + if body_node is not None: + link_underlying_nodes(body_node, node_increment) - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + link_underlying_nodes(node_condition, node_endLoop) - elif isinstance(expr, Assert): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr) + curr_node = node_endLoop - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + elif isinstance(expr, Continue): + new_node = self._new_node(NodeType.CONTINUE, expr.src, scope) + link_underlying_nodes(curr_node, new_node) + link_underlying_nodes(new_node, continue_destination) - elif isinstance(expr, Log): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + elif isinstance(expr, Break): + new_node = self._new_node(NodeType.BREAK, expr.src, scope) + link_underlying_nodes(curr_node, new_node) + link_underlying_nodes(new_node, break_destination) + + elif isinstance(expr, Return): + new_node = self._new_node(NodeType.RETURN, expr.src, scope) + if expr.value is not None: new_node.add_unparsed_expression(expr.value) - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - elif isinstance(expr, If): - condition_node = self._new_node(NodeType.IF, expr.test.src, scope) - condition_node.add_unparsed_expression(expr.test) + elif isinstance(expr, Assert): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) - endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - true_node = None - new_node = condition_node - for stmt in expr.body: - true_node = parse_statement( - new_node, stmt, continue_destination, break_destination - ) - new_node = true_node + elif isinstance(expr, Log): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr.value) - link_underlying_nodes(true_node, endIf_node) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node - false_node = None - new_node = condition_node - for stmt in expr.orelse: - false_node = parse_statement( - new_node, stmt, continue_destination, break_destination - ) - new_node = false_node + elif isinstance(expr, If): + condition_node = self._new_node(NodeType.IF, expr.test.src, scope) + condition_node.add_unparsed_expression(expr.test) - if false_node is not None: - link_underlying_nodes(false_node, endIf_node) + endIf_node = self._new_node(NodeType.ENDIF, expr.src, scope) - else: - link_underlying_nodes(condition_node, endIf_node) + true_node = None + new_node = condition_node + for stmt in expr.body: + true_node = parse_statement( + new_node, stmt, continue_destination, break_destination + ) + new_node = true_node - link_underlying_nodes(curr_node, condition_node) - curr_node = endIf_node + link_underlying_nodes(true_node, endIf_node) - elif isinstance(expr, Pass): - pass - elif isinstance(expr, Raise): - new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) - new_node.add_unparsed_expression(expr) - link_underlying_nodes(curr_node, new_node) - curr_node = new_node + false_node = None + new_node = condition_node + for stmt in expr.orelse: + false_node = parse_statement( + new_node, stmt, continue_destination, break_destination + ) + new_node = false_node + + if false_node is not None: + link_underlying_nodes(false_node, endIf_node) else: - raise ParsingError(f"Statement not parsed {expr.__class__.__name__} {expr}") + link_underlying_nodes(condition_node, endIf_node) + + link_underlying_nodes(curr_node, condition_node) + curr_node = endIf_node - return curr_node + elif isinstance(expr, Pass): + pass + elif isinstance(expr, Raise): + new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) + new_node.add_unparsed_expression(expr) + link_underlying_nodes(curr_node, new_node) + curr_node = new_node + + else: + raise ParsingError(f"Statement not parsed {expr.__class__.__name__} {expr}") + return curr_node + + curr_node = entry_node + for expr in cfg: curr_node = parse_statement(curr_node, expr) # endregion diff --git a/slither/vyper_parsing/declarations/struct.py b/slither/vyper_parsing/declarations/struct.py index 70a6bd7b72..308dbcb2bd 100644 --- a/slither/vyper_parsing/declarations/struct.py +++ b/slither/vyper_parsing/declarations/struct.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Dict, List +from typing import List from slither.core.declarations.structure import Structure from slither.core.variables.structure_variable import StructureVariable diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index aec07143cc..a5a031ecfe 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -1,8 +1,5 @@ -import logging -import re -from typing import Union, Dict, TYPE_CHECKING, List, Any - -import slither.core.expressions.type_conversion +from typing import Dict, TYPE_CHECKING +from collections import deque from slither.core.declarations.solidity_variables import ( SOLIDITY_VARIABLES_COMPOSED, SolidityVariableComposed, @@ -10,16 +7,11 @@ from slither.core.declarations import SolidityFunction, Function from slither.core.expressions import ( CallExpression, - ConditionalExpression, ElementaryTypeNameExpression, Identifier, IndexAccess, Literal, MemberAccess, - NewArray, - NewContract, - NewElementaryType, - SuperCallExpression, SelfIdentifier, TupleExpression, TypeConversion, @@ -43,12 +35,6 @@ from slither.vyper_parsing.expressions.find_variable import find_variable from slither.vyper_parsing.type_parsing import parse_type from slither.all_exceptions import ParsingError - -if TYPE_CHECKING: - from slither.core.expressions.expression import Expression - - -from collections import deque from slither.vyper_parsing.ast.types import ( Int, Call, @@ -72,8 +58,11 @@ Raise, ) +if TYPE_CHECKING: + from slither.core.expressions.expression import Expression + -def parse_expression(expression: Dict, caller_context) -> "Expression": +def parse_expression(expression: Dict, caller_context) -> "Expression": # pylint if isinstance(expression, Int): literal = Literal(str(expression.value), ElementaryType("uint256")) diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index 06fcce995d..cc6a48ae74 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -1,27 +1,17 @@ -from typing import TYPE_CHECKING, Optional, Union, List, Tuple +from typing import TYPE_CHECKING, Optional, Union, Tuple from slither.core.declarations import Event, Enum, Structure from slither.core.declarations.contract import Contract from slither.core.declarations.custom_error import CustomError from slither.core.declarations.function import Function from slither.core.declarations.function_contract import FunctionContract -from slither.core.declarations.function_top_level import FunctionTopLevel -from slither.core.declarations.solidity_import_placeholder import SolidityImportPlaceHolder from slither.core.declarations.solidity_variables import ( SOLIDITY_FUNCTIONS, SOLIDITY_VARIABLES, SolidityFunction, SolidityVariable, ) -from slither.core.scope.scope import FileScope -from slither.core.solidity_types import ( - ArrayType, - FunctionType, - MappingType, - TypeAlias, -) from slither.core.variables.variable import Variable -from slither.exceptions import SlitherError from slither.solc_parsing.exceptions import VariableNotFound if TYPE_CHECKING: @@ -109,8 +99,9 @@ def find_variable( :rtype: """ - from slither.vyper_parsing.declarations.contract import ContractVyper - from slither.vyper_parsing.declarations.function import FunctionVyper + from slither.vyper_parsing.declarations.function import ( + FunctionVyper, + ) # pylint: disable=import-outside-toplevel if isinstance(caller_context, Contract): current_scope = caller_context.file_scope diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index b8f9b468e2..21d91e513c 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -12,7 +12,9 @@ from slither.core.declarations.function_contract import FunctionContract -def parse_type(annotation: Union[Name, Subscript, Call, Tuple], caller_context): +def parse_type( + annotation: Union[Name, Subscript, Call, Tuple], caller_context +): # pylint disable=too-many-branches,too-many-return-statements,import-outside-toplevel from slither.vyper_parsing.expressions.expression_parsing import parse_expression if isinstance(caller_context, FunctionContract): @@ -33,8 +35,7 @@ def parse_type(annotation: Union[Name, Subscript, Call, Tuple], caller_context): type_ = parse_type(annotation.slice.value.elements[0], caller_context) length = parse_expression(annotation.slice.value.elements[1], caller_context) return ArrayType(type_, length) - else: - assert annotation.value.id == "HashMap" + if annotation.value.id == "HashMap": type_from = parse_type(annotation.slice.value.elements[0], caller_context) type_to = parse_type(annotation.slice.value.elements[1], caller_context) diff --git a/slither/vyper_parsing/variables/event_variable.py b/slither/vyper_parsing/variables/event_variable.py index 2f7fe7c850..507c17665e 100644 --- a/slither/vyper_parsing/variables/event_variable.py +++ b/slither/vyper_parsing/variables/event_variable.py @@ -1,5 +1,3 @@ -from typing import Dict - from slither.core.variables.event_variable import EventVariable from slither.vyper_parsing.type_parsing import parse_type from slither.vyper_parsing.ast.types import AnnAssign, Call diff --git a/slither/vyper_parsing/variables/state_variable.py b/slither/vyper_parsing/variables/state_variable.py index a2e925a6ea..361bbaba6e 100644 --- a/slither/vyper_parsing/variables/state_variable.py +++ b/slither/vyper_parsing/variables/state_variable.py @@ -1,5 +1,3 @@ -from typing import Dict - from slither.core.variables.state_variable import StateVariable from slither.vyper_parsing.ast.types import VariableDecl from slither.vyper_parsing.type_parsing import parse_type diff --git a/slither/vyper_parsing/variables/structure_variable.py b/slither/vyper_parsing/variables/structure_variable.py index eab7a71c4e..7bef8712ea 100644 --- a/slither/vyper_parsing/variables/structure_variable.py +++ b/slither/vyper_parsing/variables/structure_variable.py @@ -1,6 +1,3 @@ -from typing import Dict - - from slither.core.variables.structure_variable import StructureVariable from slither.vyper_parsing.type_parsing import parse_type from slither.vyper_parsing.ast.types import AnnAssign diff --git a/slither/vyper_parsing/vyper_compilation_unit.py b/slither/vyper_parsing/vyper_compilation_unit.py index d4ebf8415a..2a47d9864d 100644 --- a/slither/vyper_parsing/vyper_compilation_unit.py +++ b/slither/vyper_parsing/vyper_compilation_unit.py @@ -25,7 +25,7 @@ def parse_module(self, data: Module, filename: str): sourceUnit = int(sourceUnit_candidates[0]) self._compilation_unit.source_units[sourceUnit] = filename - if os.path.isfile(filename) and not filename in self._compilation_unit.core.source_code: + if os.path.isfile(filename) and filename not in self._compilation_unit.core.source_code: self._compilation_unit.core.add_source_code(filename) scope = self._compilation_unit.get_scope(filename) diff --git a/tests/e2e/vyper_parsing/test_ast_parsing.py b/tests/e2e/vyper_parsing/test_ast_parsing.py index 8529f3e1c0..7ca8184364 100644 --- a/tests/e2e/vyper_parsing/test_ast_parsing.py +++ b/tests/e2e/vyper_parsing/test_ast_parsing.py @@ -1,4 +1,3 @@ -from typing import Dict from pathlib import Path from slither import Slither diff --git a/tests/unit/slithir/vyper/test_ir_generation.py b/tests/unit/slithir/vyper/test_ir_generation.py index 6bcdaab10e..73c9b5e70b 100644 --- a/tests/unit/slithir/vyper/test_ir_generation.py +++ b/tests/unit/slithir/vyper/test_ir_generation.py @@ -1,38 +1,13 @@ # # pylint: disable=too-many-lines -import pathlib -from argparse import ArgumentTypeError -from collections import defaultdict -from inspect import getsourcefile -from typing import Union, List, Dict, Callable -import pytest -from slither import Slither -from slither.core.cfg.node import Node, NodeType -from slither.core.declarations import Function, Contract -from slither.core.solidity_types import ArrayType, ElementaryType -from slither.core.variables.local_variable import LocalVariable -from slither.core.variables.state_variable import StateVariable +from slither.core.solidity_types import ElementaryType from slither.slithir.operations import ( - OperationWithLValue, Phi, - Assignment, - HighLevelCall, - Return, - Operation, - Binary, - BinaryType, InternalCall, - Index, - InitArray, ) -from slither.slithir.utils.ssa import is_used_later from slither.slithir.variables import ( Constant, - ReferenceVariable, - LocalIRVariable, - StateIRVariable, - TemporaryVariableSSA, ) From e80238d8e94b5adce5447d39767fbce85ce0a411 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 13:09:49 -0500 Subject: [PATCH 119/169] add struct defs to file scope --- slither/vyper_parsing/declarations/contract.py | 2 ++ slither/vyper_parsing/type_parsing.py | 3 +++ ...ant_slitherConstructorConstantVariables__0.txt | 4 ++-- .../vyper_parsing/test_data/interface_constant.vy | 15 +++++---------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index 2cd14f1d0b..e1b8ffd671 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -453,6 +453,8 @@ def parse_structs(self) -> None: st_parser = StructVyper(st, struct) self._contract.structures_as_dict[st.name] = st self._structures_parser.append(st_parser) + # Interfaces can refer to struct defs + self._contract.file_scope.structures[st.name] = st self._structuresNotParsed = [] diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index 21d91e513c..e11a4a9f79 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -96,4 +96,7 @@ def parse_type( if name in contract.file_scope.contracts: return UserDefinedType(contract.file_scope.contracts[name]) + + if name in contract.file_scope.structures: + return UserDefinedType(contract.file_scope.structures[name]) assert False diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt index 753f5a9385..31ff6d4085 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_constant_slitherConstructorConstantVariables__0.txt @@ -2,8 +2,8 @@ digraph{ 0[label="Node Type: OTHER_ENTRYPOINT 0 EXPRESSION: -MAX_TICKS_UINT = 50 +MY_CONSTANT = 50 IRs: -MAX_TICKS_UINT(uint256) := 50(uint256)"]; +MY_CONSTANT(uint256) := 50(uint256)"]; } diff --git a/tests/e2e/vyper_parsing/test_data/interface_constant.vy b/tests/e2e/vyper_parsing/test_data/interface_constant.vy index 4a5b718518..7e6612c68f 100644 --- a/tests/e2e/vyper_parsing/test_data/interface_constant.vy +++ b/tests/e2e/vyper_parsing/test_data/interface_constant.vy @@ -1,12 +1,7 @@ -interface LMGauge: - def callback_collateral_shares(n: int256, collateral_per_share: DynArray[uint256, MAX_TICKS_UINT]): nonpayable - def callback_user_shares(user: address, n: int256, user_shares: DynArray[uint256, MAX_TICKS_UINT]): nonpayable +struct MyStruct: + liquidation_range: address +MY_CONSTANT: constant(uint256) = 50 +interface MyInterface: + def my_func(a: int256, b: DynArray[uint256, MY_CONSTANT]) -> MyStruct: nonpayable -MAX_TICKS_UINT: constant(uint256) = 50 - - -struct Loan: - liquidation_range: LMGauge - -x: public(Loan) \ No newline at end of file From 239369c853d5e8817f2fc9ed3f806450fb77340e Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 13:14:54 -0500 Subject: [PATCH 120/169] propagate return type on call to state variable with interface type --- .../expressions/expression_parsing.py | 24 +++++++- ...yper_cfgir_interface_conversion_baz__0.txt | 56 +++++++++++++++++++ .../test_data/interface_conversion.vy | 12 ++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_baz__0.txt diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index a5a031ecfe..50dd05cf26 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -5,6 +5,7 @@ SolidityVariableComposed, ) from slither.core.declarations import SolidityFunction, Function +from slither.core.variables.state_variable import StateVariable from slither.core.expressions import ( CallExpression, ElementaryTypeNameExpression, @@ -63,6 +64,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylint + print("parse_expression", expression) if isinstance(expression, Int): literal = Literal(str(expression.value), ElementaryType("uint256")) @@ -178,8 +180,8 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylin arguments = [parse_expression(a, caller_context) for a in expression.args] rets = None + # Since the AST lacks the type of the return values, we recover it. if isinstance(called, Identifier): - # Since the AST lacks the type of the return values, we recover it. if isinstance(called.value, Function): rets = called.value.returns # Default arguments are not represented in the AST, so we recover them as well. @@ -264,7 +266,25 @@ def get_type_str(x): # (recover_type_1) This may be a call to an interface and we don't have the return types, # so we see if there's a function identifier with `member_name` and propagate the type to # its enclosing `CallExpression` - if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType): + if isinstance(expr, Identifier) and isinstance(expr.value, StateVariable) and isinstance(expr.value.type, UserDefinedType) and isinstance(expr.value.type.type, Contract): + # If we access a member of an interface, needs to be interface instead of self namespace + var = find_variable(member_name, expr.value.type.type) + if isinstance(var, Function): + rets = var.returns + + def get_type_str(x): + if isinstance(x, str): + return x + return str(x.type) + + type_str = ( + get_type_str(rets[0]) + if len(rets) == 1 + else f"tuple({','.join(map(get_type_str, rets))})" + ) + member_name_ret_type = type_str + + if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType) and isinstance(expr.type.type, Contract): # If we access a member of an interface, needs to be interface instead of self namespace var = find_variable(member_name, expr.type.type) if isinstance(var, Function): diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_baz__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_baz__0.txt new file mode 100644 index 0000000000..4280229d00 --- /dev/null +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_interface_conversion_baz__0.txt @@ -0,0 +1,56 @@ +digraph{ +0[label="Node Type: ENTRY_POINT 0 +"]; +0->1; +1[label="Node Type: NEW VARIABLE 1 + +EXPRESSION: +a = 0 + +IRs: +a(int128) := 0(uint256)"]; +1->2; +2[label="Node Type: NEW VARIABLE 2 + +EXPRESSION: +b = 0 + +IRs: +b(int128) := 0(uint256)"]; +2->3; +3[label="Node Type: EXPRESSION 3 + +EXPRESSION: +(a,b) = self.foo() + +IRs: +TUPLE_2(int128,int128) = INTERNAL_CALL, interface_conversion.foo()() +a(int128)= UNPACK TUPLE_2 index: 0 +b(int128)= UNPACK TUPLE_2 index: 1 "]; +3->4; +4[label="Node Type: NEW VARIABLE 4 + +EXPRESSION: +x = 0x0000000000000000000000000000000000000000 + +IRs: +x(address) := 0(address)"]; +4->5; +5[label="Node Type: NEW VARIABLE 5 + +EXPRESSION: +c = 0 + +IRs: +c(uint256) := 0(uint256)"]; +5->6; +6[label="Node Type: EXPRESSION 6 + +EXPRESSION: +(a,c) = self.tester.foo() + +IRs: +TUPLE_3(int128,uint256) = HIGH_LEVEL_CALL, dest:tester(Test), function:foo, arguments:[] +a(int128)= UNPACK TUPLE_3 index: 0 +c(uint256)= UNPACK TUPLE_3 index: 1 "]; +} diff --git a/tests/e2e/vyper_parsing/test_data/interface_conversion.vy b/tests/e2e/vyper_parsing/test_data/interface_conversion.vy index 4bdbd72773..ad30f0ebfd 100644 --- a/tests/e2e/vyper_parsing/test_data/interface_conversion.vy +++ b/tests/e2e/vyper_parsing/test_data/interface_conversion.vy @@ -1,6 +1,8 @@ interface Test: def foo() -> (int128, uint256): nonpayable +tester: Test + @internal def foo() -> (int128, int128): return 2, 3 @@ -15,3 +17,13 @@ def bar(): c: uint256 = 0 a, c = Test(x).foo() +@external +def baz(): + a: int128 = 0 + b: int128 = 0 + (a, b) = self.foo() + + x: address = 0x0000000000000000000000000000000000000000 + c: uint256 = 0 + a, c = self.tester.foo() + From e8fa8b85fa039dc303628fe545c618f39db8b5a5 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 13:15:41 -0500 Subject: [PATCH 121/169] more cleanup --- slither/core/compilation_unit.py | 4 ++ slither/core/declarations/function.py | 8 +-- .../core/declarations/solidity_variables.py | 4 +- slither/core/expressions/identifier.py | 1 - slither/detectors/abstract_detector.py | 2 +- .../visitors/slithir/expression_to_slithir.py | 1 - ...ast_parsing__vyper_cfgir_chain_test__0.txt | 13 ---- ...st_parsing__vyper_cfgir_if_compute__0.txt} | 72 +++++++++---------- ...slitherConstructorConstantVariables__0.txt | 9 --- ...slitherConstructorConstantVariables__0.txt | 9 --- .../ast_parsing__vyper_cfgir_tuple_bar__0.txt | 57 --------------- .../ast_parsing__vyper_cfgir_tuple_foo__0.txt | 12 ---- tests/e2e/vyper_parsing/test_data/if.vy | 37 +++++----- 13 files changed, 64 insertions(+), 165 deletions(-) delete mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt rename tests/e2e/vyper_parsing/snapshots/{ast_parsing__vyper_cfgir_if_limit_p_o__0.txt => ast_parsing__vyper_cfgir_if_compute__0.txt} (65%) delete mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt delete mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt delete mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt delete mode 100644 tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index c1ce98d37e..23387e6fc9 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -97,6 +97,10 @@ def source_units(self) -> Dict[int, str]: # region Compiler ################################################################################### ################################################################################### + @property + def language(self) -> Language: + return self._language + @property def is_vyper(self) -> bool: return self._language == Language.VYPER diff --git a/slither/core/declarations/function.py b/slither/core/declarations/function.py index a4a172b974..e803154d00 100644 --- a/slither/core/declarations/function.py +++ b/slither/core/declarations/function.py @@ -107,7 +107,6 @@ def _filter_state_variables_written(expressions: List["Expression"]): return ret -# TODO replace class FunctionLanguage(Enum): Solidity = 0 Yul = 1 @@ -220,8 +219,9 @@ def __init__(self, compilation_unit: "SlitherCompilationUnit") -> None: self.compilation_unit: "SlitherCompilationUnit" = compilation_unit - # Assume we are analyzing Solidity by default - self.function_language: FunctionLanguage = FunctionLanguage.Solidity + self.function_language: FunctionLanguage = ( + FunctionLanguage.Solidity if compilation_unit.is_solidity else FunctionLanguage.Vyper + ) self._id: Optional[str] = None @@ -1527,7 +1527,6 @@ def is_reentrant(self) -> bool: def _analyze_read_write(self) -> None: """Compute variables read/written/...""" write_var = [x.variables_written_as_expression for x in self.nodes] - print(write_var) write_var = [x for x in write_var if x] write_var = [item for sublist in write_var for item in sublist] write_var = list(set(write_var)) @@ -1763,7 +1762,6 @@ def fix_phi( node.irs_ssa = [ir for ir in node.irs_ssa if not self._unchange_phi(ir)] def generate_slithir_and_analyze(self) -> None: - print("generate_slithir_and_analyze") for node in self.nodes: node.slithir_generation() diff --git a/slither/core/declarations/solidity_variables.py b/slither/core/declarations/solidity_variables.py index d5aec009f7..7c81266bf6 100644 --- a/slither/core/declarations/solidity_variables.py +++ b/slither/core/declarations/solidity_variables.py @@ -17,6 +17,7 @@ "block": "", "super": "", "chain": "", + "ZERO_ADDRESS": "address", } SOLIDITY_VARIABLES_COMPOSED = { @@ -89,8 +90,9 @@ "codehash(address)": ["bytes32"], # Vyper "create_from_blueprint()": [], + "create_minimal_proxy_to()": [], "empty()": [], - "convert()": [], # TODO make type conversion + "convert()": [], "len()": ["uint256"], "method_id()": [], "unsafe_sub()": [], diff --git a/slither/core/expressions/identifier.py b/slither/core/expressions/identifier.py index d4c4261008..5cd29a9f5d 100644 --- a/slither/core/expressions/identifier.py +++ b/slither/core/expressions/identifier.py @@ -26,7 +26,6 @@ def __init__( ], ) -> None: super().__init__() - assert value # pylint: disable=import-outside-toplevel from slither.core.declarations import Contract, SolidityVariable, SolidityFunction from slither.solc_parsing.yul.evm_functions import YulBuiltin diff --git a/slither/detectors/abstract_detector.py b/slither/detectors/abstract_detector.py index c3f661a112..8baf9bb3c7 100644 --- a/slither/detectors/abstract_detector.py +++ b/slither/detectors/abstract_detector.py @@ -182,7 +182,7 @@ def _is_applicable_detector(self) -> bool: and self.compilation_unit.solc_version in self.VULNERABLE_SOLC_VERSIONS ) if self.LANGUAGE: - return self.compilation_unit._language.value == self.LANGUAGE + return self.compilation_unit.language.value == self.LANGUAGE return True @abc.abstractmethod diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index c43b2507f2..ff26166a99 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -482,7 +482,6 @@ def _post_index_access(self, expression: IndexAccess) -> None: def _post_literal(self, expression: Literal) -> None: expression_type = expression.type assert isinstance(expression_type, ElementaryType) - print(expression.value) cst = Constant(expression.value, expression_type, expression.subdenomination) set_val(expression, cst) diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt deleted file mode 100644 index 6f12cb5302..0000000000 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_chain_test__0.txt +++ /dev/null @@ -1,13 +0,0 @@ -digraph{ -0[label="Node Type: ENTRY_POINT 0 -"]; -0->1; -1[label="Node Type: NEW VARIABLE 1 - -EXPRESSION: -x = bytes32(chain.id) - -IRs: -TMP_0 = CONVERT chain.id to bytes32 -x(bytes32) := TMP_0(bytes32)"]; -} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_compute__0.txt similarity index 65% rename from tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt rename to tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_compute__0.txt index 0c7ae7d7ad..b623aa188e 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_limit_p_o__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_if_compute__0.txt @@ -5,34 +5,34 @@ digraph{ 1[label="Node Type: NEW VARIABLE 1 EXPRESSION: -p_new = p +a = p IRs: -p_new(uint256) := p(uint256)"]; +a(uint256) := p(uint256)"]; 1->2; 2[label="Node Type: NEW VARIABLE 2 EXPRESSION: -dt = 1 +b = 1 IRs: -dt(uint256) := 1(uint256)"]; +b(uint256) := 1(uint256)"]; 2->3; 3[label="Node Type: NEW VARIABLE 3 EXPRESSION: -ratio = 0 +c = 0 IRs: -ratio(uint256) := 0(uint256)"]; +c(uint256) := 0(uint256)"]; 3->4; 4[label="Node Type: IF 4 EXPRESSION: -dt > 0 +b > 0 IRs: -TMP_0(bool) = dt > 0 +TMP_0(bool) = b > 0 CONDITION TMP_0"]; 4->6[label="True"]; 4->5[label="False"]; @@ -41,26 +41,26 @@ CONDITION TMP_0"]; 6[label="Node Type: NEW VARIABLE 6 EXPRESSION: -old_p_o = 1 +old_a = 1 IRs: -old_p_o(uint256) := 1(uint256)"]; +old_a(uint256) := 1(uint256)"]; 6->7; 7[label="Node Type: NEW VARIABLE 7 EXPRESSION: -old_ratio = 2 +old_c = 2 IRs: -old_ratio(uint256) := 2(uint256)"]; +old_c(uint256) := 2(uint256)"]; 7->8; 8[label="Node Type: IF 8 EXPRESSION: -p > old_p_o +p > old_a IRs: -TMP_1(bool) = p > old_p_o +TMP_1(bool) = p > old_a CONDITION TMP_1"]; 8->10[label="True"]; 8->15[label="False"]; @@ -70,23 +70,23 @@ CONDITION TMP_1"]; 10[label="Node Type: EXPRESSION 10 EXPRESSION: -ratio = unsafe_div()(old_p_o * 10 ** 18,p) +c = unsafe_div()(old_a * 10 ** 18,p) IRs: TMP_2(uint256) = 10 (c)** 18 -TMP_3(uint256) = old_p_o (c)* TMP_2 +TMP_3(uint256) = old_a (c)* TMP_2 TMP_4(None) = SOLIDITY_CALL unsafe_div()(TMP_3,p) -ratio(uint256) := TMP_4(None)"]; +c(uint256) := TMP_4(None)"]; 10->11; 11[label="Node Type: IF 11 EXPRESSION: -ratio < 10 ** 36 / 1 +c < 10 ** 36 / 1 IRs: TMP_5(uint256) = 10 (c)** 36 TMP_6(uint256) = TMP_5 (c)/ 1 -TMP_7(bool) = ratio < TMP_6 +TMP_7(bool) = c < TMP_6 CONDITION TMP_7"]; 11->13[label="True"]; 11->12[label="False"]; @@ -96,44 +96,44 @@ CONDITION TMP_7"]; 13[label="Node Type: EXPRESSION 13 EXPRESSION: -p_new = unsafe_div()(old_p_o * 1,10 ** 18) +a = unsafe_div()(old_a * 1,10 ** 18) IRs: -TMP_8(uint256) = old_p_o (c)* 1 +TMP_8(uint256) = old_a (c)* 1 TMP_9(uint256) = 10 (c)** 18 TMP_10(None) = SOLIDITY_CALL unsafe_div()(TMP_8,TMP_9) -p_new(uint256) := TMP_10(None)"]; +a(uint256) := TMP_10(None)"]; 13->14; 14[label="Node Type: EXPRESSION 14 EXPRESSION: -ratio = 10 ** 36 / 1 +c = 10 ** 36 / 1 IRs: TMP_11(uint256) = 10 (c)** 36 TMP_12(uint256) = TMP_11 (c)/ 1 -ratio(uint256) := TMP_12(uint256)"]; +c(uint256) := TMP_12(uint256)"]; 14->12; 15[label="Node Type: EXPRESSION 15 EXPRESSION: -ratio = unsafe_div()(p * 10 ** 18,old_p_o) +c = unsafe_div()(p * 10 ** 18,old_a) IRs: TMP_13(uint256) = 10 (c)** 18 TMP_14(uint256) = p (c)* TMP_13 -TMP_15(None) = SOLIDITY_CALL unsafe_div()(TMP_14,old_p_o) -ratio(uint256) := TMP_15(None)"]; +TMP_15(None) = SOLIDITY_CALL unsafe_div()(TMP_14,old_a) +c(uint256) := TMP_15(None)"]; 15->16; 16[label="Node Type: IF 16 EXPRESSION: -ratio < 10 ** 36 / 1 +c < 10 ** 36 / 1 IRs: TMP_16(uint256) = 10 (c)** 36 TMP_17(uint256) = TMP_16 (c)/ 1 -TMP_18(bool) = ratio < TMP_17 +TMP_18(bool) = c < TMP_17 CONDITION TMP_18"]; 16->18[label="True"]; 16->17[label="False"]; @@ -143,30 +143,30 @@ CONDITION TMP_18"]; 18[label="Node Type: EXPRESSION 18 EXPRESSION: -p_new = unsafe_div()(old_p_o * 10 ** 18,1) +a = unsafe_div()(old_a * 10 ** 18,1) IRs: TMP_19(uint256) = 10 (c)** 18 -TMP_20(uint256) = old_p_o (c)* TMP_19 +TMP_20(uint256) = old_a (c)* TMP_19 TMP_21(None) = SOLIDITY_CALL unsafe_div()(TMP_20,1) -p_new(uint256) := TMP_21(None)"]; +a(uint256) := TMP_21(None)"]; 18->19; 19[label="Node Type: EXPRESSION 19 EXPRESSION: -ratio = 10 ** 36 / 1 +c = 10 ** 36 / 1 IRs: TMP_22(uint256) = 10 (c)** 36 TMP_23(uint256) = TMP_22 (c)/ 1 -ratio(uint256) := TMP_23(uint256)"]; +c(uint256) := TMP_23(uint256)"]; 19->17; 20[label="Node Type: EXPRESSION 20 EXPRESSION: -ratio = 1 +c = 1 IRs: -ratio(uint256) := 1(uint256)"]; +c(uint256) := 1(uint256)"]; 20->5; } diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt deleted file mode 100644 index b53263a8d7..0000000000 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_literal_slitherConstructorConstantVariables__0.txt +++ /dev/null @@ -1,9 +0,0 @@ -digraph{ -0[label="Node Type: OTHER_ENTRYPOINT 0 - -EXPRESSION: -MAX_BANDS = 10 - -IRs: -MAX_BANDS(uint256) := 10(uint256)"]; -} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt deleted file mode 100644 index 753f5a9385..0000000000 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tricky_slitherConstructorConstantVariables__0.txt +++ /dev/null @@ -1,9 +0,0 @@ -digraph{ -0[label="Node Type: OTHER_ENTRYPOINT 0 - -EXPRESSION: -MAX_TICKS_UINT = 50 - -IRs: -MAX_TICKS_UINT(uint256) := 50(uint256)"]; -} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt deleted file mode 100644 index 0d2540498a..0000000000 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_bar__0.txt +++ /dev/null @@ -1,57 +0,0 @@ -digraph{ -0[label="Node Type: ENTRY_POINT 0 -"]; -0->1; -1[label="Node Type: NEW VARIABLE 1 - -EXPRESSION: -a = 0 - -IRs: -a(int128) := 0(uint256)"]; -1->2; -2[label="Node Type: NEW VARIABLE 2 - -EXPRESSION: -b = 0 - -IRs: -b(int128) := 0(uint256)"]; -2->3; -3[label="Node Type: EXPRESSION 3 - -EXPRESSION: -(a,b) = self.foo() - -IRs: -TUPLE_0(int128,int128) = INTERNAL_CALL, tuple.foo()() -a(int128)= UNPACK TUPLE_0 index: 0 -b(int128)= UNPACK TUPLE_0 index: 1 "]; -3->4; -4[label="Node Type: NEW VARIABLE 4 - -EXPRESSION: -x = 0x0000000000000000000000000000000000000000 - -IRs: -x(address) := 0(address)"]; -4->5; -5[label="Node Type: NEW VARIABLE 5 - -EXPRESSION: -c = 0 - -IRs: -c(uint256) := 0(uint256)"]; -5->6; -6[label="Node Type: EXPRESSION 6 - -EXPRESSION: -(a,c) = Test(x).foo() - -IRs: -TMP_0 = CONVERT x to Test -TUPLE_1(int128,uint256) = HIGH_LEVEL_CALL, dest:TMP_0(Test), function:foo, arguments:[] -a(int128)= UNPACK TUPLE_1 index: 0 -c(uint256)= UNPACK TUPLE_1 index: 1 "]; -} diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt deleted file mode 100644 index 8d1c1166b2..0000000000 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_tuple_foo__0.txt +++ /dev/null @@ -1,12 +0,0 @@ -digraph{ -0[label="Node Type: ENTRY_POINT 0 -"]; -0->1; -1[label="Node Type: RETURN 1 - -EXPRESSION: -(2,3) - -IRs: -RETURN 2,3"]; -} diff --git a/tests/e2e/vyper_parsing/test_data/if.vy b/tests/e2e/vyper_parsing/test_data/if.vy index 23483ca455..e706b9c0e1 100644 --- a/tests/e2e/vyper_parsing/test_data/if.vy +++ b/tests/e2e/vyper_parsing/test_data/if.vy @@ -1,25 +1,22 @@ @external @view -def limit_p_o(p: uint256): - p_new: uint256 = p - dt: uint256 = 1 - ratio: uint256 = 0 +def compute(p: uint256): + a: uint256 = p + b: uint256 = 1 + c: uint256 = 0 - if dt > 0: - old_p_o: uint256 = 1 - old_ratio: uint256 = 2 - # ratio = p_o_min / p_o_max - if p > old_p_o: - ratio = unsafe_div(old_p_o * 10**18, p) - if ratio < 10**36 / 1: - p_new = unsafe_div(old_p_o * 1, 10**18) - ratio = 10**36 / 1 + if b > 0: + old_a: uint256 = 1 + old_c: uint256 = 2 + if p > old_a: + c = unsafe_div(old_a * 10**18, p) + if c < 10**36 / 1: + a = unsafe_div(old_a * 1, 10**18) + c = 10**36 / 1 else: - ratio = unsafe_div(p * 10**18, old_p_o) - if ratio < 10**36 / 1: - p_new = unsafe_div(old_p_o * 10**18, 1) - ratio = 10**36 / 1 + c = unsafe_div(p * 10**18, old_a) + if c < 10**36 / 1: + a = unsafe_div(old_a * 10**18, 1) + c = 10**36 / 1 - # ratio is guaranteed to be less than 1e18 - # Also guaranteed to be limited, therefore can have all ops unsafe - ratio = 1 + c = 1 From 961db4563ffd4a0e30707b28355e869fa32f815a Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 13:50:50 -0500 Subject: [PATCH 122/169] address lints and improve typing --- .../visitors/slithir/expression_to_slithir.py | 5 +- slither/vyper_parsing/ast/ast.py | 46 ++++- .../vyper_parsing/declarations/contract.py | 3 +- slither/vyper_parsing/declarations/event.py | 2 +- .../vyper_parsing/declarations/function.py | 39 ++++- slither/vyper_parsing/declarations/struct.py | 2 +- .../expressions/expression_parsing.py | 161 ++++++++---------- .../expressions/find_variable.py | 4 +- slither/vyper_parsing/type_parsing.py | 13 +- 9 files changed, 162 insertions(+), 113 deletions(-) diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index ff26166a99..1a2a85b2d2 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -171,9 +171,8 @@ def __init__(self, expression: Expression, node: "Node") -> None: def result(self) -> List[Operation]: return self._result - def _post_assignement_operation( - self, expression: AssignmentOperation - ) -> None: # pylint: disable=too-many-branches,too-many-statements + # pylint: disable=too-many-branches,too-many-statements + def _post_assignement_operation(self, expression: AssignmentOperation) -> None: left = get(expression.expression_left) right = get(expression.expression_right) operation: Operation diff --git a/slither/vyper_parsing/ast/ast.py b/slither/vyper_parsing/ast/ast.py index 228805c895..f05a167dc2 100644 --- a/slither/vyper_parsing/ast/ast.py +++ b/slither/vyper_parsing/ast/ast.py @@ -1,6 +1,48 @@ from typing import Dict, Callable, List -from slither.vyper_parsing.ast.types import ASTNode -from slither.vyper_parsing.ast.types import * +from slither.vyper_parsing.ast.types import ( + ASTNode, + Module, + ImportFrom, + EventDef, + AnnAssign, + Name, + Call, + StructDef, + VariableDecl, + Subscript, + Index, + Hex, + Int, + Str, + Tuple, + FunctionDef, + Assign, + Raise, + Attribute, + Assert, + Keyword, + Arguments, + Arg, + UnaryOp, + BinOp, + Expr, + Log, + Return, + VyDict, + VyList, + NameConstant, + If, + Compare, + For, + Break, + Continue, + Pass, + InterfaceDef, + EnumDef, + Bytes, + AugAssign, + BoolOp, +) class ParsingError(Exception): diff --git a/slither/vyper_parsing/declarations/contract.py b/slither/vyper_parsing/declarations/contract.py index e1b8ffd671..6ca9c6557f 100644 --- a/slither/vyper_parsing/declarations/contract.py +++ b/slither/vyper_parsing/declarations/contract.py @@ -32,7 +32,7 @@ from slither.vyper_parsing.vyper_compilation_unit import VyperCompilationUnit -class ContractVyper: +class ContractVyper: # pylint: disable=too-many-instance-attributes def __init__( self, slither_parser: "VyperCompilationUnit", contract: Contract, module: Module ) -> None: @@ -426,6 +426,7 @@ def _parse_contract_items(self) -> None: contract_parser = ContractVyper(self._slither_parser, contract, node) self._contract.file_scope.contracts[contract.name] = contract + # pylint: disable=protected-access self._slither_parser._underlying_contract_to_parser[contract] = contract_parser elif isinstance(node, AnnAssign): # implements: ERC20 diff --git a/slither/vyper_parsing/declarations/event.py b/slither/vyper_parsing/declarations/event.py index b73e462113..43d7814394 100644 --- a/slither/vyper_parsing/declarations/event.py +++ b/slither/vyper_parsing/declarations/event.py @@ -11,7 +11,7 @@ from slither.vyper_parsing.ast.types import EventDef -class EventVyper: +class EventVyper: # pylint: disable=too-few-public-methods """ Event class """ diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 17d77cfb94..5a898aaf2e 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -1,4 +1,4 @@ -from typing import Dict, Union, List, TYPE_CHECKING, Tuple +from typing import Dict, Union, List, TYPE_CHECKING from slither.core.cfg.node import NodeType, link_nodes, Node from slither.core.cfg.scope import Scope @@ -13,7 +13,33 @@ from slither.vyper_parsing.cfg.node import NodeVyper from slither.solc_parsing.exceptions import ParsingError from slither.vyper_parsing.variables.local_variable import LocalVariableVyper -from slither.vyper_parsing.ast.types import * +from slither.vyper_parsing.ast.types import ( + Int, + Call, + Attribute, + Name, + Tuple as TupleVyper, + ASTNode, + AnnAssign, + FunctionDef, + Return, + Assert, + Compare, + Log, + Subscript, + If, + Pass, + Assign, + AugAssign, + Raise, + Expr, + For, + Index, + Arg, + Arguments, + Continue, + Break, +) if TYPE_CHECKING: from slither.core.compilation_unit import SlitherCompilationUnit @@ -24,7 +50,7 @@ def link_underlying_nodes(node1: NodeVyper, node2: NodeVyper): link_nodes(node1.underlying_node, node2.underlying_node) -class FunctionVyper: +class FunctionVyper: # pylint: disable=too-many-instance-attributes def __init__( self, function: Function, @@ -183,7 +209,7 @@ def _analyze_decorator(self) -> None: contract = self._contract_parser.underlying_contract compilation_unit = self._contract_parser.underlying_contract.compilation_unit modifier = Modifier(compilation_unit) - modifier._name = name + modifier.name = name modifier.set_offset(decorator.src, compilation_unit) modifier.set_contract(contract) modifier.set_contract_declarer(contract) @@ -218,6 +244,7 @@ def _new_node( ################################################################################### ################################################################################### + # pylint: disable=too-many-branches,too-many-statements,protected-access,too-many-locals def _parse_cfg(self, cfg: List[ASTNode]) -> None: entry_node = self._new_node(NodeType.ENTRYPOINT, "-1:-1:-1", self.underlying_function) @@ -517,7 +544,7 @@ def _parse_params(self, params: Arguments): local_var = self._add_param(param) self._function.add_parameters(local_var.underlying_variable) - def _parse_returns(self, returns: Union[Name, Tuple, Subscript]): + def _parse_returns(self, returns: Union[Name, TupleVyper, Subscript]): self._function.returns_src().set_offset(returns.src, self._function.compilation_unit) # Only the type of the arg is given, not a name. We create an an `Arg` with an empty name @@ -527,7 +554,7 @@ def _parse_returns(self, returns: Union[Name, Tuple, Subscript]): local_var = self._add_param(Arg(returns.src, returns.node_id, "", annotation=returns)) self._function.add_return(local_var.underlying_variable) else: - assert isinstance(returns, Tuple) + assert isinstance(returns, TupleVyper) for ret in returns.elements: local_var = self._add_param(Arg(ret.src, ret.node_id, "", annotation=ret)) self._function.add_return(local_var.underlying_variable) diff --git a/slither/vyper_parsing/declarations/struct.py b/slither/vyper_parsing/declarations/struct.py index 308dbcb2bd..3a3ccf7b87 100644 --- a/slither/vyper_parsing/declarations/struct.py +++ b/slither/vyper_parsing/declarations/struct.py @@ -6,7 +6,7 @@ from slither.vyper_parsing.ast.types import StructDef, AnnAssign -class StructVyper: +class StructVyper: # pylint: disable=too-few-public-methods def __init__( self, st: Structure, diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 50dd05cf26..6edc46f74a 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -1,10 +1,10 @@ -from typing import Dict, TYPE_CHECKING +from typing import Optional, List, Union, TYPE_CHECKING from collections import deque from slither.core.declarations.solidity_variables import ( SOLIDITY_VARIABLES_COMPOSED, SolidityVariableComposed, ) -from slither.core.declarations import SolidityFunction, Function +from slither.core.declarations import SolidityFunction, FunctionContract from slither.core.variables.state_variable import StateVariable from slither.core.expressions import ( CallExpression, @@ -57,14 +57,25 @@ AugAssign, VyList, Raise, + ASTNode, ) if TYPE_CHECKING: from slither.core.expressions.expression import Expression -def parse_expression(expression: Dict, caller_context) -> "Expression": # pylint - print("parse_expression", expression) +def vars_to_typestr(rets: Optional[List["Expression"]]) -> str: + if rets is None: + return "tuple()" + if len(rets) == 1: + return str(rets[0].type) + return f"tuple({','.join(str(ret.type) for ret in rets)})" + + +# pylint: disable=too-many-branches,too-many-statements,too-many-locals +def parse_expression( + expression: ASTNode, caller_context: Union[FunctionContract, Contract] +) -> "Expression": if isinstance(expression, Int): literal = Literal(str(expression.value), ElementaryType("uint256")) @@ -103,14 +114,14 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylin parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - elif called.value.name == "convert()": + if called.value.name == "convert()": arg = parse_expression(expression.args[0], caller_context) type_to = parse_type(expression.args[1], caller_context) parsed_expr = TypeConversion(arg, type_to) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - elif called.value.name == "min_value()": + if called.value.name == "min_value()": type_to = parse_type(expression.args[0], caller_context) member_type = str(type_to) # TODO return Literal @@ -126,7 +137,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylin parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - elif called.value.name == "max_value()": + if called.value.name == "max_value()": type_to = parse_type(expression.args[0], caller_context) member_type = str(type_to) # TODO return Literal @@ -142,7 +153,7 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylin parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr - elif called.value.name == "raw_call()": + if called.value.name == "raw_call()": args = [parse_expression(a, caller_context) for a in expression.args] # This is treated specially in order to force `extract_tmp_call` to treat this as a `HighLevelCall` which will be converted # to a `LowLevelCall` by `convert_to_low_level`. This is an artifact of the late conversion of Solidity... @@ -182,9 +193,10 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylin rets = None # Since the AST lacks the type of the return values, we recover it. if isinstance(called, Identifier): - if isinstance(called.value, Function): + if isinstance(called.value, FunctionContract): rets = called.value.returns # Default arguments are not represented in the AST, so we recover them as well. + # pylint: disable=protected-access if called.value._default_args_as_expressions and len(arguments) < len( called.value.parameters ): @@ -209,28 +221,9 @@ def parse_expression(expression: Dict, caller_context) -> "Expression": # pylin elif isinstance(called, MemberAccess) and called.type is not None: # (recover_type_2) Propagate the type collected to the `CallExpression` # see recover_type_1 - rets = [called.type] - - if rets is None: - rets = ["tuple()"] - - def get_type_str(x): - if isinstance(x, str): - return x - return str(x.type) - - # def vars_to_typestr(rets: List[Expression]) -> str: - # if len(rets) == 0: - # return "" - # if len(rets) == 1: - # return str(rets[0].type) - # return f"tuple({','.join(str(ret.type) for ret in rets)})" - - type_str = ( - get_type_str(rets[0]) - if len(rets) == 1 - else f"tuple({','.join(map(get_type_str, rets))})" - ) + rets = [called] + + type_str = vars_to_typestr(rets) parsed_expr = CallExpression(called, arguments, type_str) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) return parsed_expr @@ -266,41 +259,28 @@ def get_type_str(x): # (recover_type_1) This may be a call to an interface and we don't have the return types, # so we see if there's a function identifier with `member_name` and propagate the type to # its enclosing `CallExpression` - if isinstance(expr, Identifier) and isinstance(expr.value, StateVariable) and isinstance(expr.value.type, UserDefinedType) and isinstance(expr.value.type.type, Contract): + if ( + isinstance(expr, Identifier) + and isinstance(expr.value, StateVariable) + and isinstance(expr.value.type, UserDefinedType) + and isinstance(expr.value.type.type, Contract) + ): # If we access a member of an interface, needs to be interface instead of self namespace var = find_variable(member_name, expr.value.type.type) - if isinstance(var, Function): + if isinstance(var, FunctionContract): rets = var.returns + member_name_ret_type = vars_to_typestr(rets) - def get_type_str(x): - if isinstance(x, str): - return x - return str(x.type) - - type_str = ( - get_type_str(rets[0]) - if len(rets) == 1 - else f"tuple({','.join(map(get_type_str, rets))})" - ) - member_name_ret_type = type_str - - if isinstance(expr, TypeConversion) and isinstance(expr.type, UserDefinedType) and isinstance(expr.type.type, Contract): + if ( + isinstance(expr, TypeConversion) + and isinstance(expr.type, UserDefinedType) + and isinstance(expr.type.type, Contract) + ): # If we access a member of an interface, needs to be interface instead of self namespace var = find_variable(member_name, expr.type.type) - if isinstance(var, Function): + if isinstance(var, FunctionContract): rets = var.returns - - def get_type_str(x): - if isinstance(x, str): - return x - return str(x.type) - - type_str = ( - get_type_str(rets[0]) - if len(rets) == 1 - else f"tuple({','.join(map(get_type_str, rets))})" - ) - member_name_ret_type = type_str + member_name_ret_type = vars_to_typestr(rets) member_access = MemberAccess(member_name, member_name_ret_type, expr) @@ -359,7 +339,9 @@ def get_type_str(x): is_tuple = isinstance(rhs, TupleExpression) is_array = isinstance(rhs, Identifier) and isinstance(rhs.value.type, ArrayType) if is_array: - assert rhs.value.type.is_fixed_array + assert ( + rhs.value.type.is_fixed_array + ), "Dynamic arrays are not supported in comparison operators" if is_tuple or is_array: length = len(rhs.expressions) if is_tuple else rhs.value.type.length_value.value inner_op = ( @@ -391,37 +373,36 @@ def get_type_str(x): return conditions.pop() - else: # enum type membership check https://docs.vyperlang.org/en/stable/types.html?h#id18 - is_member_op = ( - BinaryOperationType.get_type("==") - if expression.op == "NotIn" - else BinaryOperationType.get_type("!=") - ) - # If all bits are cleared, then the lhs is not a member of the enum - # This allows representing membership in multiple enum members - # For example, if enum Foo has members A (1), B (2), and C (4), then - # (x in [Foo.A, Foo.B]) is equivalent to (x & (Foo.A | Foo.B) != 0), - # where (Foo.A | Foo.B) evaluates to 3. - # Thus, when x is 3, (x & (Foo.A | Foo.B) != 0) is true. - - enum_bit_mask = BinaryOperation( - TypeConversion(lhs, ElementaryType("uint256")), - TypeConversion(rhs, ElementaryType("uint256")), - BinaryOperationType.get_type("&"), - ) - membership_check = BinaryOperation( - enum_bit_mask, Literal("0", ElementaryType("uint256")), is_member_op - ) - membership_check.set_offset(lhs.source_mapping, caller_context.compilation_unit) - return membership_check - - else: # a regular logical operator - rhs = parse_expression(expression.right, caller_context) - op = BinaryOperationType.get_type(expression.op) + # enum type membership check https://docs.vyperlang.org/en/stable/types.html?h#id18 + is_member_op = ( + BinaryOperationType.get_type("==") + if expression.op == "NotIn" + else BinaryOperationType.get_type("!=") + ) + # If all bits are cleared, then the lhs is not a member of the enum + # This allows representing membership in multiple enum members + # For example, if enum Foo has members A (1), B (2), and C (4), then + # (x in [Foo.A, Foo.B]) is equivalent to (x & (Foo.A | Foo.B) != 0), + # where (Foo.A | Foo.B) evaluates to 3. + # Thus, when x is 3, (x & (Foo.A | Foo.B) != 0) is true. + enum_bit_mask = BinaryOperation( + TypeConversion(lhs, ElementaryType("uint256")), + TypeConversion(rhs, ElementaryType("uint256")), + BinaryOperationType.get_type("&"), + ) + membership_check = BinaryOperation( + enum_bit_mask, Literal("0", ElementaryType("uint256")), is_member_op + ) + membership_check.set_offset(lhs.source_mapping, caller_context.compilation_unit) + return membership_check + + # a regular logical operator + rhs = parse_expression(expression.right, caller_context) + op = BinaryOperationType.get_type(expression.op) - parsed_expr = BinaryOperation(lhs, rhs, op) - parsed_expr.set_offset(expression.src, caller_context.compilation_unit) - return parsed_expr + parsed_expr = BinaryOperation(lhs, rhs, op) + parsed_expr.set_offset(expression.src, caller_context.compilation_unit) + return parsed_expr if isinstance(expression, BinOp): lhs = parse_expression(expression.left, caller_context) diff --git a/slither/vyper_parsing/expressions/find_variable.py b/slither/vyper_parsing/expressions/find_variable.py index cc6a48ae74..0509a29d73 100644 --- a/slither/vyper_parsing/expressions/find_variable.py +++ b/slither/vyper_parsing/expressions/find_variable.py @@ -98,10 +98,10 @@ def find_variable( :return: :rtype: """ - + # pylint: disable=import-outside-toplevel from slither.vyper_parsing.declarations.function import ( FunctionVyper, - ) # pylint: disable=import-outside-toplevel + ) if isinstance(caller_context, Contract): current_scope = caller_context.file_scope diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index e11a4a9f79..9156118669 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -1,20 +1,19 @@ +from typing import Union from slither.core.solidity_types.elementary_type import ( ElementaryType, ElementaryTypeName, ) # TODO rename solidity type from slither.core.solidity_types.array_type import ArrayType from slither.core.solidity_types.mapping_type import MappingType - from slither.vyper_parsing.ast.types import Name, Subscript, Call, Index, Tuple -from typing import Union from slither.core.solidity_types.user_defined_type import UserDefinedType +from slither.core.declarations import FunctionContract, Contract -from slither.core.declarations.function_contract import FunctionContract - - +# pylint: disable=too-many-branches,too-many-return-statements,import-outside-toplevel,too-many-locals def parse_type( - annotation: Union[Name, Subscript, Call, Tuple], caller_context -): # pylint disable=too-many-branches,too-many-return-statements,import-outside-toplevel + annotation: Union[Name, Subscript, Call, Tuple], + caller_context: Union[FunctionContract, Contract], +): from slither.vyper_parsing.expressions.expression_parsing import parse_expression if isinstance(caller_context, FunctionContract): From 404914cdfa574ce51b88c0faa04b9d71d1b979ec Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 5 Sep 2023 14:22:41 -0500 Subject: [PATCH 123/169] link issues for TODO comments, lint --- .../vyper_parsing/declarations/function.py | 2 +- .../expressions/expression_parsing.py | 11 +++-- slither/vyper_parsing/type_parsing.py | 46 +++++++++---------- .../vyper_parsing/variables/local_variable.py | 9 ++-- tests/unit/core/test_function_declaration.py | 5 ++ 5 files changed, 37 insertions(+), 36 deletions(-) diff --git a/slither/vyper_parsing/declarations/function.py b/slither/vyper_parsing/declarations/function.py index 5a898aaf2e..70e04c8e51 100644 --- a/slither/vyper_parsing/declarations/function.py +++ b/slither/vyper_parsing/declarations/function.py @@ -282,7 +282,7 @@ def parse_statement( curr_node = new_node elif isinstance(expr, Expr): - # TODO This is a workaround to handle Vyper putting payable/view in the function body... + # TODO This is a workaround to handle Vyper putting payable/view in the function body... https://github.com/vyperlang/vyper/issues/3578 if not isinstance(expr.value, Name): new_node = self._new_node(NodeType.EXPRESSION, expr.src, scope) new_node.add_unparsed_expression(expr.value) diff --git a/slither/vyper_parsing/expressions/expression_parsing.py b/slither/vyper_parsing/expressions/expression_parsing.py index 6edc46f74a..d51467fab4 100644 --- a/slither/vyper_parsing/expressions/expression_parsing.py +++ b/slither/vyper_parsing/expressions/expression_parsing.py @@ -83,7 +83,7 @@ def parse_expression( return literal if isinstance(expression, Hex): - # TODO this is an implicit conversion and could potentially be bytes20 or other? + # TODO this is an implicit conversion and could potentially be bytes20 or other? https://github.com/vyperlang/vyper/issues/3580 literal = Literal(str(expression.value), ElementaryType("address")) literal.set_offset(expression.src, caller_context.compilation_unit) return literal @@ -191,7 +191,7 @@ def parse_expression( arguments = [parse_expression(a, caller_context) for a in expression.args] rets = None - # Since the AST lacks the type of the return values, we recover it. + # Since the AST lacks the type of the return values, we recover it. https://github.com/vyperlang/vyper/issues/3581 if isinstance(called, Identifier): if isinstance(called.value, FunctionContract): rets = called.value.returns @@ -212,7 +212,7 @@ def parse_expression( elif isinstance(called.value, Contract): # Type conversions are not explicitly represented in the AST e.g. converting address to contract/ interface, - # so we infer that a type conversion is occurring if `called` is a `Contract` type. + # so we infer that a type conversion is occurring if `called` is a `Contract` type. https://github.com/vyperlang/vyper/issues/3580 type_to = parse_type(expression.func, caller_context) parsed_expr = TypeConversion(arguments[0], type_to) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) @@ -231,7 +231,7 @@ def parse_expression( if isinstance(expression, Attribute): member_name = expression.attr if isinstance(expression.value, Name): - # TODO this is ambiguous because it could be a state variable or a call to balance + # TODO this is ambiguous because it could be a state variable or a call to balance https://github.com/vyperlang/vyper/issues/3582 if expression.value.id == "self" and member_name != "balance": var = find_variable(member_name, caller_context, is_self=True) parsed_expr = SelfIdentifier(var) @@ -241,6 +241,7 @@ def parse_expression( expr = parse_expression(expression.value, caller_context) # TODO this is ambiguous because it could be a type conversion of an interface or a member access + # see https://github.com/vyperlang/vyper/issues/3580 and ttps://github.com/vyperlang/vyper/issues/3582 if expression.attr == "address": parsed_expr = TypeConversion(expr, ElementaryType("address")) parsed_expr.set_offset(expression.src, caller_context.compilation_unit) @@ -258,7 +259,7 @@ def parse_expression( member_name_ret_type = None # (recover_type_1) This may be a call to an interface and we don't have the return types, # so we see if there's a function identifier with `member_name` and propagate the type to - # its enclosing `CallExpression` + # its enclosing `CallExpression`. https://github.com/vyperlang/vyper/issues/3581 if ( isinstance(expr, Identifier) and isinstance(expr.value, StateVariable) diff --git a/slither/vyper_parsing/type_parsing.py b/slither/vyper_parsing/type_parsing.py index 9156118669..34c76cc6e3 100644 --- a/slither/vyper_parsing/type_parsing.py +++ b/slither/vyper_parsing/type_parsing.py @@ -5,9 +5,10 @@ ) # TODO rename solidity type from slither.core.solidity_types.array_type import ArrayType from slither.core.solidity_types.mapping_type import MappingType -from slither.vyper_parsing.ast.types import Name, Subscript, Call, Index, Tuple from slither.core.solidity_types.user_defined_type import UserDefinedType from slither.core.declarations import FunctionContract, Contract +from slither.vyper_parsing.ast.types import Name, Subscript, Call, Index, Tuple +from slither.solc_parsing.exceptions import ParsingError # pylint: disable=too-many-branches,too-many-return-statements,import-outside-toplevel,too-many-locals def parse_type( @@ -25,9 +26,24 @@ def parse_type( if isinstance(annotation, Name): name = annotation.id + lname = name.lower() # map `String` to string + if lname in ElementaryTypeName: + return ElementaryType(lname) + + if name in contract.structures_as_dict: + return UserDefinedType(contract.structures_as_dict[name]) + + if name in contract.enums_as_dict: + return UserDefinedType(contract.enums_as_dict[name]) + + if name in contract.file_scope.contracts: + return UserDefinedType(contract.file_scope.contracts[name]) + + if name in contract.file_scope.structures: + return UserDefinedType(contract.file_scope.structures[name]) elif isinstance(annotation, Subscript): assert isinstance(annotation.slice, Index) - # This is also a strange construct... + # This is also a strange construct... https://github.com/vyperlang/vyper/issues/3577 if isinstance(annotation.slice.value, Tuple): assert isinstance(annotation.value, Name) if annotation.value.id == "DynArray": @@ -44,17 +60,17 @@ def parse_type( type_ = parse_type(annotation.value, caller_context) elif isinstance(annotation.value, Name): - # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression, so we grab the value. - # Subscript(src='13:10:0', node_id=7, value=Name(src='13:6:0', node_id=8, id='String'), slice=Index(src='13:10:0', node_id=12, value=Int(src='20:2:0', node_id=10, value=64))) + # TODO it is weird that the ast_type is `Index` when it's a type annotation and not an expression, so we grab the value. https://github.com/vyperlang/vyper/issues/3577 type_ = parse_type(annotation.value, caller_context) if annotation.value.id == "String": + # This is an elementary type return type_ length = parse_expression(annotation.slice.value, caller_context) return ArrayType(type_, length) elif isinstance(annotation, Call): - # TODO event variable represented as Call + # TODO event variable represented as Call https://github.com/vyperlang/vyper/issues/3579 return parse_type(annotation.args[0], caller_context) elif isinstance(annotation, Tuple): @@ -80,22 +96,4 @@ def parse_type( return UserDefinedType(st) - else: - assert False - - lname = name.lower() # TODO map String to string - if lname in ElementaryTypeName: - return ElementaryType(lname) - - if name in contract.structures_as_dict: - return UserDefinedType(contract.structures_as_dict[name]) - - if name in contract.enums_as_dict: - return UserDefinedType(contract.enums_as_dict[name]) - - if name in contract.file_scope.contracts: - return UserDefinedType(contract.file_scope.contracts[name]) - - if name in contract.file_scope.structures: - return UserDefinedType(contract.file_scope.structures[name]) - assert False + raise ParsingError(f"Type name not found {name} context {caller_context}") diff --git a/slither/vyper_parsing/variables/local_variable.py b/slither/vyper_parsing/variables/local_variable.py index b50dea44b1..1195743e17 100644 --- a/slither/vyper_parsing/variables/local_variable.py +++ b/slither/vyper_parsing/variables/local_variable.py @@ -6,7 +6,7 @@ class LocalVariableVyper: - def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> None: + def __init__(self, variable: LocalVariable, variable_data: Union[Arg, AnnAssign, Name]) -> None: self._variable: LocalVariable = variable if isinstance(variable_data, Arg): @@ -15,12 +15,9 @@ def __init__(self, variable: LocalVariable, variable_data: Union[Arg, Name]) -> elif isinstance(variable_data, AnnAssign): self._variable.name = variable_data.target.id self._elem_to_parse = variable_data.annotation - elif isinstance(variable_data, Name): - self._variable.name = variable_data.id - self._elem_to_parse = variable_data else: - # param Subscript - self._variable.name = "" + assert isinstance(variable_data, Name) + self._variable.name = variable_data.id self._elem_to_parse = variable_data assert isinstance(self._elem_to_parse, (Name, Subscript, Call, Tuple)) diff --git a/tests/unit/core/test_function_declaration.py b/tests/unit/core/test_function_declaration.py index c4844074ef..cea207613a 100644 --- a/tests/unit/core/test_function_declaration.py +++ b/tests/unit/core/test_function_declaration.py @@ -305,6 +305,7 @@ def test_public_variable(solc_binary_path) -> None: assert var.type == ElementaryType("bytes32") +# pylint: disable=too-many-statements def test_vyper_functions(slither_from_vyper_source) -> None: with slither_from_vyper_source( """ @@ -352,6 +353,7 @@ def __default__(): assert not f.view assert not f.pure assert not f.is_implemented + assert f.is_empty f = functions["__default__()"] assert f.function_type == FunctionType.FALLBACK @@ -360,6 +362,7 @@ def __default__(): assert not f.view assert not f.pure assert not f.is_implemented + assert f.is_empty f = functions["withdraw()"] assert f.function_type == FunctionType.NORMAL @@ -370,10 +373,12 @@ def __default__(): assert f.can_send_eth() assert f.can_reenter() assert f.is_implemented + assert not f.is_empty f = functions["withdraw_locked()"] assert not f.is_reentrant assert f.is_implemented + assert not f.is_empty var = contract.get_state_variable_from_name("balances") assert var From c95b953b2c706a78be5362761fc5586cdc138d50 Mon Sep 17 00:00:00 2001 From: Simone Date: Thu, 7 Sep 2023 17:22:02 +0200 Subject: [PATCH 124/169] Prioritize checking canonical_name for type inference --- slither/solc_parsing/solidity_types/type_parsing.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index e12290722f..3d7639829e 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -82,9 +82,9 @@ def _find_from_type_name( # pylint: disable=too-many-locals,too-many-branches,t # all_enums = [c.enums for c in contracts] # all_enums = [item for sublist in all_enums for item in sublist] # all_enums += contract.slither.enums_top_level - var_type = next((e for e in all_enums if e.name == enum_name), None) + var_type = next((e for e in all_enums if e.canonical_name == enum_name), None) if not var_type: - var_type = next((e for e in all_enums if e.canonical_name == enum_name), None) + var_type = next((e for e in all_enums if e.name == enum_name), None) if not var_type: # any contract can refer to another contract's structure name_struct = name @@ -94,9 +94,9 @@ def _find_from_type_name( # pylint: disable=too-many-locals,too-many-branches,t # all_structures = [c.structures for c in contracts] # all_structures = [item for sublist in all_structures for item in sublist] # all_structures += contract.slither.structures_top_level - var_type = next((st for st in all_structures if st.name == name_struct), None) + var_type = next((st for st in all_structures if st.canonical_name == name_struct), None) if not var_type: - var_type = next((st for st in all_structures if st.canonical_name == name_struct), None) + var_type = next((st for st in all_structures if st.name == name_struct), None) # case where struct xxx.xx[] where not well formed in the AST if not var_type: depth = 0 From ff52901e6d1240fcd6633e5cee59577226adde66 Mon Sep 17 00:00:00 2001 From: joodiewoodo <38355190+dokzai@users.noreply.github.com> Date: Thu, 7 Sep 2023 23:03:56 -0400 Subject: [PATCH 125/169] Allow underscore in variable naming convention for internal state variables (#2110) * fix: allow underscore in variable naming convention for internal state variables and update test_detector tests snapshot * change set visibility of _myPublic to public, update test snapshots --- .../naming_convention/naming_convention.py | 2 +- ...ention_0_4_25_naming_convention_sol__0.txt | 14 +++++++------- ...ention_0_5_16_naming_convention_sol__0.txt | 14 +++++++------- ...ention_0_6_11_naming_convention_sol__0.txt | 14 +++++++------- ...vention_0_7_6_naming_convention_sol__0.txt | 14 +++++++------- .../0.4.25/naming_convention.sol | 3 ++- .../0.4.25/naming_convention.sol-0.4.25.zip | Bin 3545 -> 3659 bytes ...arning_for_public_constants.sol-0.4.25.zip | Bin 1377 -> 1380 bytes .../0.5.16/naming_convention.sol | 3 ++- .../0.5.16/naming_convention.sol-0.5.16.zip | Bin 3563 -> 3671 bytes ...arning_for_public_constants.sol-0.5.16.zip | Bin 1382 -> 1387 bytes .../0.6.11/naming_convention.sol | 3 ++- .../0.6.11/naming_convention.sol-0.6.11.zip | Bin 3566 -> 3688 bytes ...arning_for_public_constants.sol-0.6.11.zip | Bin 1402 -> 1409 bytes .../0.7.6/naming_convention.sol | 3 ++- .../0.7.6/naming_convention.sol-0.7.6.zip | Bin 3481 -> 3605 bytes ...warning_for_public_constants.sol-0.7.6.zip | Bin 1357 -> 1367 bytes 17 files changed, 37 insertions(+), 33 deletions(-) diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 02deb719e7..0633799e56 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -167,7 +167,7 @@ def _detect(self) -> List[Output]: results.append(res) else: - if var.visibility == "private": + if var.visibility in ["private", "internal"]: correct_naming = self.is_mixed_case_with_underscore(var.name) else: correct_naming = self.is_mixed_case(var.name) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt index ed4177ca17..e4a643678d 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.4.25 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt index 35c11193f5..96f6aab3c6 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.5.16 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt index f692e211b8..f1986fb781 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.6.11 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt index af17cabe8f..b471cbfa2f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_co Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.7.6/ Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol index 7181ca9110..add7867e07 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol @@ -53,7 +53,8 @@ contract Test { contract T { uint private _myPrivateVar; - uint _myPublicVar; + uint internal _myInternalVar; + uint public _myPublicVar; function test(uint _unused, uint _used) public returns(uint){ diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip index c7aaae071dbf8633c6c3ccd451a16b70b9ddd938..fe35f0c006f2a1526c143d8def79ef54a25e15c3 100644 GIT binary patch delta 3541 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 delta 1213 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 delta 3444 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol index 7181ca9110..add7867e07 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol @@ -53,7 +53,8 @@ contract Test { contract T { uint private _myPrivateVar; - uint _myPublicVar; + uint internal _myInternalVar; + uint public _myPublicVar; function test(uint _unused, uint _used) public returns(uint){ diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol-0.6.11.zip b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol-0.6.11.zip index 3e6277ac1b0975ae85638b853cbde20646ccd7d2..b91697087411d7fed7effcb98875fdbf53f7a74f 100644 GIT binary patch delta 3577 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 ZR_r<*r#cM)0BC)a6%I`Xfeiov0078)u@wLS diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/no_warning_for_public_constants.sol-0.6.11.zip b/tests/e2e/detectors/test_data/naming-convention/0.6.11/no_warning_for_public_constants.sol-0.6.11.zip index 67f8eff7ee737a57bf2ee1036db7d482c4926445..ed813d07b9be8e890dcdba4f865b432c1a77860b 100644 GIT binary patch delta 1245 zcmV<31S0$T3V{n4P)h>@KL7#%4ghJHCs+1C%$%_V006iTkr-fqO_*8QcqqqPRb~nJ zWXL2H807psVK9!fD&p|6=0Ku$knG4&vYB3y^^P$vjeL2gg{xK7S=SBtKOl888a$}y z?7meBGBj`~m&-#p=E9&=Y#IZ!d=kIw6mvH2#t-Bf3L+x|hA9LYtG{(*ZO9he`Pt%@ z99+AjzSX&+R+e}~Xj(A3cl383y=mPAtt?kF!S3%I z%x>Iof-%-1gqi30R7jx=7s^%4s@M{t*PZ_xP0M7F4PG z$!m5QoXiRjj)H&uA{a$6bX|c_&6y`Ox#Tc{!Qd|)H#t~;eF>ONb4~ju`Zz&?pRDj8i|yex+5G`u4?t)Lpd~j9^S}rh9Cp#k;jGJ=b_f z_)qqQ?E!RuMDQ$$Wj=608lsSFpFu*}Cmk+?qv~{lu>s>ST}?DCvf{ns3R&${S;Opk zaI50}CpU47&(DSJMXyygN@c`0&}jO~HN|7%tOPX5Xj{=caw1qO(jRGxlugKS|a+h^9SH*e8%p80gO6 z{|tYB&Ad&-m=TpI)$G!%ERM4mZi?038GgP_Z>ArmSEw>nF!?nMFwvgCx{)F;i^sd7 zFrWp&_P4Uf={&* z-vteL16V!4rhf?{1wB9TN4kswUJ-yW^7}FJK>~p3MfhVdB-H{+>TCKGInZ1H2_Ijx|D*!IiJA6vAfSJ575h_&=kFY zxYUpF`V6GD=sf$=Heix76~07<21Gc?gCyE+jRcCjsG%ypjKe12u_@*1-XT|K+$SUc zjGXF60_xFe3BoBJxQ|7m25TY03U&{B0>KZ*0oJ-_RZ6HtZZW_h%&td>yi^9d&;aFP zvHb@yHuxR!`CtkHMawIYCKBEjZJZv`=bWm@3yXr+0M0 zY007Z2F}?WoA10_DMIJ`gPkZ)O928u06zc%01g0YnI~8FLCl=71ONcI50e=MTLuON H00000LXc6v delta 1245 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 ZDF6Tf000000001!Qw=}{s0{!B008*kzpnrQ delta 3371 zcmV+`4b<|L9GM#!P)h>@KL7#%4gflhcUF;~_EF^w007)}kr+~cJ|EX}y%sU?M-PRi zm0nlZdjJq|?-l5q5W}VAK!X$~yhYNz{x3$S;g((ndY>|}t(Qr6=UkA>bk%pZW|Xyk zrQe*weUr^{sm6cpDO$iDB*CHMNRwTfo2H=(-2h^wapFN?YxqKoZtFvP5aN{#_`GpBe;_dB>1ucsrcc4Gu`y8m;&&DQT#K;&&Klj zsa@BPH2f}3)6x4#@8+#uHhICV4YGpU!`bX$bmpVh0@zSi-(ZAX?nk-nhW!o!ps1;_?0<0>( zoBY@_XS7m(=`$IHCSv{Vy*_{Ut0(5yHNLw2d3;&_1^GP@rQVc&IL-NNA2Lh+O+~wR zmFK~Wcj3m?uAP4gB<&>plXRq#@s>|v2(Va7r=MQwPRAuU9D(awa(VoG;L$JKdiouOAK`~7~kR;r#+p_0fY=A#%rRtu1Iu=Mh$jS+n9YaPNEIFd3)XbnMv zVd#c`hM7|J2^m?~(U$s$SGOAir7lc9B=igrCPJ;GlP;}$iJ$Ls&92#t;5{p_Ux?1{ zV*zR}=nE*Wg>>`Eg?I&jL9}`zQr{o2w4NMgFT=cQB@`6 z1y@w}KFuAJVStA2WypBUHn9QlQ(+I-W%8RtJlc2D3=MG>wTVEkSio8Rs8|&So?{#Dc3rIVt;Ih{6R0>uQ6V@%n zjvMO!vT`=VC5Pc7UgMh0B8=S0(Um%e4t+GZ7Fg(mB>)mo`V+9Ak!sVz?NTXMuz=_3zNx z?a-f`Q<4kCsc8c>Dl;BS|1rfVdL^a^eKsf|=7~=Cw~fvUxhh8izV#4`WtfQ7$)iTu;Le`_0g zzTXrh=3sR1--Ensef%t4t1)SZ$mSEd22J!4=UQF{!{b) z#O-NO_Az}{UMIo&6iU?SVqTRvPxbenK+L?O)N+31dfD3g;I>8^kP+(Q-m=#N6nlfl zK5f3{>n&JYF$K1TgnH0hi1xyGrV0LIypX3=)VktZBo&#xsXH@&@xI0Bc%cR|B2kxU zM+J>Apabs9I~^^)Fs%Pv@gv_>6m#296JTXsM5cjP_ z6#*J9pCTFBMsXv_xAAsopjqPnv~5S5!J!}(Zd%xsUvgwq zXzvBhX>t!+Y9^RV?A&D@ROUY9p>HI*tk&B*qYAb;1;FqNn(0E^xtheZz&@MPda|>l z6#5~5tq{x&qb__ic$F75*hi~~*p@1py}c3Iir|^vvT%*JR;Mo)2GcQ0maSWL-hy>4 zD}`mA69+WvMG2e-U7fvTCQ}{B6v`2P{I_2J1>#th%i+BdAj1qNfo0e14nrz&+$F~< zv-zoGV$Q(KHs}gL@aH=1&Nm7_V&LRK{B_-bN?HvXz9-OE?#mZ(A=XFiIE_(=-FJ-E zeW1@@rK|oqWi;IH^l0;PD&DOVea9ErPdCMvwNFJwyo?dI_ktQl9-M~62zP8S>KhK| zVyT|%56nGM(M#byLTMzg{R67r0x_qpt`Zswz`|Y2p=Tn=VTK&Ee_<&NL)ilPh3`y% zneaNM=%~xe|5Rh8Lcveq288Y%0sWQI7dZAz;A7SgN@EJYF@k zMOoVLFL{;KM@^-ua#Bb;A)SOM(nSEq&I4;++rH7HyTu82?7!WiCJT30+@-)vY2du) zTn=}kG5(duRuiX-%E#2idt#rDI3N0dclU08%vl66q`grD;kC=DIq<;*@!=ke+Kh$9 z|6bpcz$OxbmDCVX=KV>%YK$VOe&3Teg|g5#m~>?&*LJOQ#VqnH;emIVaRHZ`6E_c< z`_)Y%XmNlq78%EQ4Q7S9TSW%wCnM9dU)bLs9l<7N8JnG8$_~8*aR3Y9vt<8&UDEIU z^v6=qs&s=j<3Z|&eMK91@@QP$s;VN8Q}40YjmZCsQ-Z3v3C+)wR#6tFqU$GlC6zCi za12Y`FqU4B&E%4xM0zAX&oU|RH1vFYi19^$*QokzS#8&|jh@J4F5%ANezY%gbz$hO z9>SLjm(rcnNn?eeiYIqQUlm?f)soex_7@VgA=mQ93kF2rP<3@gOW2VSo8us5NAHs8;j5 zH2A8&cvM!1skW-NBjE5oH1DO928u13v%)01f~;jdxa&pY~DZ3;+P!b^rh=000000001!%nd^ZEDZnv004Oc Bn=b$W diff --git a/tests/e2e/detectors/test_data/naming-convention/0.7.6/no_warning_for_public_constants.sol-0.7.6.zip b/tests/e2e/detectors/test_data/naming-convention/0.7.6/no_warning_for_public_constants.sol-0.7.6.zip index 7b304b5c0c51361e8d7eb38abb0c614fcc9b6015..9f2c1a1a7d5a108a3277c3cdde3a8e3958a51c5d 100644 GIT binary patch delta 1210 zcmV;r1V#JJ3fBr7P)h>@KL7#%4ghJHCs#WZb_|CE002S{001|W{RBFZRU>~*m|5C* zD92k>W(oLY$RrgQ3gjxjEce0ipYt5wxm?mMg1 z!?aES#YRK*y$&n>uC}UR(=!r7N~MGhMaQF&CtYP=swZ=xV(;-?C)ok`oa6^%<{q}9 zP1E2tL&?33pTFiG9aPi!NlJeN;~-U1_3Xxy;Q=5dfq7MNZmxntGvFysyGS4jq8GQbT$C;ac%IIn^W51f+T>z{X}0 zMbwD*2^_!yJ?!-W2&iy3y#Zox(S+HZ!fAM|BJdCoaom6xSFsWEw?BW$W+Z4$y4dDV zujTrnr}Rf7tWuhG9c$O{ccThSHO$`0Ke(L&dp7=<)MEFJBTPE4BLW!Tw4W; z!)qdAj-o|9rOVTcO3~(j`lx+q0PRdocTr#Hy@)QU+7$bA`o%Awa5(FnpNsrrFuhyt$CWCv zVv+M$dg{x)yBU8zG85pE@w48F-}y;?Yt_7M*LCv}T0YHqh%RHqOHp-CV7AVG642)X zqW!`dtQHIkx4o+Loj8=RzTal$o1*Uen{#i9YmE#eA7I=qOXpRkO|NwmM9xQ(^L5o{Ml?U)J4?+&K&42j z1!J)8I_=DF6S50Xlk6O928u06zc%01g0YnI~5} Y6m|y;hXeosLJyPd1X~8&1ONa40C4q9J^%m! delta 1195 zcmV;c1XTOi3e5@_P)h>@KL7#%4gfoicUC(~IvITg002D^kr-fqJ|EX}y%sU?M-PRi zm0nlZdjJq|?-l5q5W}VAK!X$~yhYNz{x3$S;g((ndY>|}t(Qr6=UkA>bk%pZW|Xyk zrQe*weOeB`)1lL#N+Lu>=!z=sQlS87o3+&huXYgLmwM+m3uP)To~Hn zL@5p8M8E0G-izgbkV^<^EJ&Bdy>q@3k5lY(P;?^K+u39yKr$~9q%p%E<7|9U9=e%1 znE=A7qeF=B!WF2b_=b%V6mKS701A(sQ|0>pC2ohLaAEO@SC%p3GA}1*?YF}wCV@>i zVx$qli}G^$P?gpI2BC ztFxNQgyU1chQb@n>%uM@I2veB^Qdl7bgpFO=57sw3Hg%DO;I!J25Aypkzd_5f9qTg zljpR6@j(amrZ1S^O4&Vk)FF|l?@D_xt>Bf*ctae^08V?8YRSo<)vK!X6MVZ4v+!hE ze|L7=ZR5ays2dYNOXbH7{5ui~ID-U|Fl+L68*f-s(}((dFK#DLlO`C}!AuP(haP5CRbj5S>X+9d+&VH`LpnKEsG7b7jQ5$^P%c<)gl52 zve}2r{en?{Vi5Wd_a9a2q+?&2E)a_gixd>OV?%R5938z!K0&agXiaUM*T^|GKp9h0 zq6fr(DL{O;>|$fDOj4JcV*(UH$2Z(p$~^-4)D?bY!IPruOR8{x>9d$YJnIFIYsd1M296&xdvxpTCmHnv z-%#A?dPY5=0nj}mcXv@}W z#yKuZrqNkkcK`4YWgOjj8!hpVNtt!Jhd8G(5(Y)zaJOZvhqhM-h5P3wwv|`uq-cD9 zaY)D83{b{@g+&hl#o7E)tyzkYA{*YBBa*olsTr|PFje)qwL#0da5gSZZ%8fXWm)FAe=yt;5 z`yF~RpTc#Qs@qD=!=xYaE3Pp!xf$tyiL^fF9Qaw166x4#tB=Nl#~KCejk)0 Date: Fri, 8 Sep 2023 05:16:54 +0200 Subject: [PATCH 126/169] Make the results deterministic (#2114) --- slither/detectors/statements/divide_before_multiply.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/slither/detectors/statements/divide_before_multiply.py b/slither/detectors/statements/divide_before_multiply.py index 6f199db414..334da592c0 100644 --- a/slither/detectors/statements/divide_before_multiply.py +++ b/slither/detectors/statements/divide_before_multiply.py @@ -2,7 +2,7 @@ Module detecting possible loss of precision due to divide before multiple """ from collections import defaultdict -from typing import DefaultDict, List, Set, Tuple +from typing import DefaultDict, List, Tuple from slither.core.cfg.node import Node from slither.core.declarations.contract import Contract @@ -63,7 +63,7 @@ def is_assert(node: Node) -> bool: # pylint: disable=too-many-branches def _explore( - to_explore: Set[Node], f_results: List[List[Node]], divisions: DefaultDict[LVALUE, List[Node]] + to_explore: List[Node], f_results: List[List[Node]], divisions: DefaultDict[LVALUE, List[Node]] ) -> None: explored = set() while to_explore: # pylint: disable=too-many-nested-blocks @@ -114,7 +114,7 @@ def _explore( f_results.append(node_results) for son in node.sons: - to_explore.add(son) + to_explore.append(son) def detect_divide_before_multiply( @@ -145,7 +145,7 @@ def detect_divide_before_multiply( # track all the division results (and the assignment of the division results) divisions: DefaultDict[LVALUE, List[Node]] = defaultdict(list) - _explore({function.entry_point}, f_results, divisions) + _explore([function.entry_point], f_results, divisions) for f_result in f_results: results.append((function, f_result)) From 9da51fff3b5b16c04f44370fddcfe1aba48edd37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Fri, 8 Sep 2023 00:32:32 -0300 Subject: [PATCH 127/169] detectors: cache_array_length: include source mapping in finding (#2076) * detectors: cache_array_length: include source mapping in finding The detector was manually string-interpolating the code and line information, which left the finding without source mapping metadata and broke filtering. Include the node directly on the finding info so that the metadata is preserved. --------- Co-authored-by: alpharush <0xalpharush@protonmail.com> --- .../operations/cache_array_length.py | 5 ++--- ...yLength_0_8_17_CacheArrayLength_sol__0.txt | 20 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/slither/detectors/operations/cache_array_length.py b/slither/detectors/operations/cache_array_length.py index e4d8cf2c69..59289ed0f7 100644 --- a/slither/detectors/operations/cache_array_length.py +++ b/slither/detectors/operations/cache_array_length.py @@ -216,9 +216,8 @@ def _detect(self): for usage in non_optimal_array_len_usages: info = [ "Loop condition ", - f"`{usage.source_mapping.content}` ", - f"({usage.source_mapping}) ", - "should use cached array length instead of referencing `length` member " + usage, + " should use cached array length instead of referencing `length` member " "of the storage array.\n ", ] res = self.generate_result(info) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt index 456c702a58..c2a5023a6f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt @@ -1,20 +1,20 @@ -Loop condition `j < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#109) should use cached array length instead of referencing `length` member of the storage array. +Loop condition k_scope_17 < array2.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#133) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#161) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_23 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#172) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#172) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#37) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `j < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#126) should use cached array length instead of referencing `length` member of the storage array. +Loop condition j_scope_11 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#109) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `k < array2.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#133) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_4 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#68) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#68) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_22 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#167) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `k < array2.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#99) should use cached array length instead of referencing `length` member of the storage array. +Loop condition k_scope_9 < array2.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#99) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#167) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_6 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#80) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#37) should use cached array length instead of referencing `length` member of the storage array. +Loop condition j_scope_15 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#126) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#80) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_21 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#161) should use cached array length instead of referencing `length` member of the storage array. From 53c97f9f481a2e9877b177b5186c8ffdb62e3305 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 7 Sep 2023 23:32:27 -0500 Subject: [PATCH 128/169] fix: preserve None tuple components in the left and right liftings of ternary expressions (#2120) * preserve None tuple components in the left and right liftings of ternary expressions * added a test for ternary lifting over tuples --------- Co-authored-by: Kevin Clancy --- slither/utils/expression_manipulations.py | 5 +- .../slithir/test_data/ternary_expressions.sol | 30 ++++---- .../unit/slithir/test_ternary_expressions.py | 77 ++++++++++++------- 3 files changed, 70 insertions(+), 42 deletions(-) diff --git a/slither/utils/expression_manipulations.py b/slither/utils/expression_manipulations.py index 75d97042c2..32b88e9b32 100644 --- a/slither/utils/expression_manipulations.py +++ b/slither/utils/expression_manipulations.py @@ -147,7 +147,7 @@ def convert_expressions( for next_expr in expression.expressions: # TODO: can we get rid of `NoneType` expressions in `TupleExpression`? # montyly: this might happen with unnamed tuple (ex: (,,,) = f()), but it needs to be checked - if next_expr: + if next_expr is not None: if self.conditional_not_ahead( next_expr, true_expression, false_expression, f_expressions @@ -158,6 +158,9 @@ def convert_expressions( true_expression.expressions[-1], false_expression.expressions[-1], ) + else: + true_expression.expressions.append(None) + false_expression.expressions.append(None) def convert_index_access( self, next_expr: IndexAccess, true_expression: Expression, false_expression: Expression diff --git a/tests/unit/slithir/test_data/ternary_expressions.sol b/tests/unit/slithir/test_data/ternary_expressions.sol index ebfb96e801..1ccd51d34d 100644 --- a/tests/unit/slithir/test_data/ternary_expressions.sol +++ b/tests/unit/slithir/test_data/ternary_expressions.sol @@ -1,6 +1,6 @@ interface Test { function test() external payable returns (uint); - function testTuple() external payable returns (uint, uint); + function testTuple(uint) external payable returns (uint, uint); } contract C { // TODO @@ -36,21 +36,23 @@ contract C { } // Unused tuple variable - function g(address one) public { - (, uint x) = Test(one).testTuple(); - } - uint[] myIntegers; - function _h(uint c) internal returns(uint) { - return c; - } - function h(bool cond, uint a, uint b) public { - uint d = _h( - myIntegers[cond ? a : b] - ); + function g(address one, bool cond, uint a, uint b) public { + (, uint x) = Test(one).testTuple(myIntegers[cond ? a : b]); } - - function i(bool cond) public { + + function h(bool cond) public { bytes memory a = new bytes(cond ? 1 : 2); } } + +contract D { + function values(uint n) internal returns (uint, uint) { + return (0, 1); + } + + function a(uint n) external { + uint a; + (a,) = values(n > 0 ? 1 : 0); + } +} diff --git a/tests/unit/slithir/test_ternary_expressions.py b/tests/unit/slithir/test_ternary_expressions.py index 712c9582b0..bf8556f85d 100644 --- a/tests/unit/slithir/test_ternary_expressions.py +++ b/tests/unit/slithir/test_ternary_expressions.py @@ -16,30 +16,53 @@ def test_ternary_conversions(solc_binary_path) -> None: """This tests that true and false sons define the same number of variables that the father node declares""" solc_path = solc_binary_path("0.8.0") slither = Slither(Path(TEST_DATA_DIR, "ternary_expressions.sol").as_posix(), solc=solc_path) - for contract in slither.contracts: - if not contract.is_signature_only: - for function in contract.functions: - vars_declared = 0 - vars_assigned = 0 - for node in function.nodes: - if node.type in [NodeType.IF, NodeType.IFLOOP]: - - # Iterate over true and false son - for inner_node in node.sons: - # Count all variables declared - expression = inner_node.expression - if isinstance( - expression, (AssignmentOperation, NewElementaryType, CallExpression) - ): - var_expr = expression.expression_left - # Only tuples declare more than one var - if isinstance(var_expr, TupleExpression): - vars_declared += len(var_expr.expressions) - else: - vars_declared += 1 - - for ir in inner_node.irs: - # Count all variables defined - if isinstance(ir, (Assignment, Unpack)): - vars_assigned += 1 - assert vars_declared == vars_assigned and vars_assigned != 0 + contract = next(c for c in slither.contracts if c.name == "C") + for function in contract.functions: + vars_declared = 0 + vars_assigned = 0 + for node in function.nodes: + if node.type in [NodeType.IF, NodeType.IFLOOP]: + + # Iterate over true and false son + for inner_node in node.sons: + # Count all variables declared + expression = inner_node.expression + if isinstance( + expression, (AssignmentOperation, NewElementaryType, CallExpression) + ): + var_expr = expression.expression_left + # Only tuples declare more than one var + if isinstance(var_expr, TupleExpression): + vars_declared += len(var_expr.expressions) + else: + vars_declared += 1 + + for ir in inner_node.irs: + # Count all variables defined + if isinstance(ir, (Assignment, Unpack)): + vars_assigned += 1 + assert vars_declared == vars_assigned and vars_assigned != 0 + + +def test_ternary_tuple(solc_binary_path) -> None: + """ + Test that in the ternary liftings of an assignment of the form `(z, ) = ...`, + we obtain `z` from an unpack operation in both lifitings + """ + solc_path = solc_binary_path("0.8.0") + slither = Slither(Path(TEST_DATA_DIR, "ternary_expressions.sol").as_posix(), solc=solc_path) + contract = next(c for c in slither.contracts if c.name == "D") + fn = next(f for f in contract.functions if f.name == "a") + + if_nodes = [n for n in fn.nodes if n.type == NodeType.IF] + assert len(if_nodes) == 1 + + if_node = if_nodes[0] + assert isinstance(if_node.son_true.expression, AssignmentOperation) + assert ( + len([ir for ir in if_node.son_true.all_slithir_operations() if isinstance(ir, Unpack)]) == 1 + ) + assert ( + len([ir for ir in if_node.son_false.all_slithir_operations() if isinstance(ir, Unpack)]) + == 1 + ) From 8b07fe59d53498de89e5e79527c126bf0ac1f20a Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Fri, 8 Sep 2023 06:39:49 +0200 Subject: [PATCH 129/169] improve name resolution of type aliases (#2061) * BREAKING CHANGE: Renamed user_defined_types to type_aliases so it's less confusing with what we call UserDefinedType. * Added type aliased at the Contract level so now at the file scope there are only top level aliasing and fully qualified contract aliasing like C.myAlias. * Fix #1809 --- slither/core/compilation_unit.py | 6 ++-- slither/core/declarations/contract.py | 34 ++++++++++++++++++ slither/core/scope/scope.py | 6 ++-- slither/solc_parsing/declarations/contract.py | 8 ++--- .../declarations/using_for_top_level.py | 2 +- .../solc_parsing/expressions/find_variable.py | 9 +++-- .../slither_compilation_unit_solc.py | 8 ++--- .../solidity_types/type_parsing.py | 30 ++++++++-------- .../visitors/slithir/expression_to_slithir.py | 4 +-- tests/e2e/solc_parsing/test_ast_parsing.py | 1 + .../type-aliases.sol-0.8.19-compact.zip | Bin 0 -> 2111 bytes .../type-aliases.sol-0.8.19-compact.json | 6 ++++ .../solc_parsing/test_data/type-aliases.sol | 20 +++++++++++ tests/unit/core/test_source_mapping.py | 6 ++-- 14 files changed, 101 insertions(+), 39 deletions(-) create mode 100644 tests/e2e/solc_parsing/test_data/compile/type-aliases.sol-0.8.19-compact.zip create mode 100644 tests/e2e/solc_parsing/test_data/expected/type-aliases.sol-0.8.19-compact.json create mode 100644 tests/e2e/solc_parsing/test_data/type-aliases.sol diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index 6d24786eb1..35180cefc0 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -47,7 +47,7 @@ def __init__(self, core: "SlitherCore", crytic_compilation_unit: CompilationUnit self._pragma_directives: List[Pragma] = [] self._import_directives: List[Import] = [] self._custom_errors: List[CustomErrorTopLevel] = [] - self._user_defined_value_types: Dict[str, TypeAliasTopLevel] = {} + self._type_aliases: Dict[str, TypeAliasTopLevel] = {} self._all_functions: Set[Function] = set() self._all_modifiers: Set[Modifier] = set() @@ -220,8 +220,8 @@ def custom_errors(self) -> List[CustomErrorTopLevel]: return self._custom_errors @property - def user_defined_value_types(self) -> Dict[str, TypeAliasTopLevel]: - return self._user_defined_value_types + def type_aliases(self) -> Dict[str, TypeAliasTopLevel]: + return self._type_aliases # endregion ################################################################################### diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 9b1488db31..f9bf153064 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -45,6 +45,7 @@ from slither.core.compilation_unit import SlitherCompilationUnit from slither.core.scope.scope import FileScope from slither.core.cfg.node import Node + from slither.core.solidity_types import TypeAliasContract LOGGER = logging.getLogger("Contract") @@ -81,6 +82,7 @@ def __init__(self, compilation_unit: "SlitherCompilationUnit", scope: "FileScope self._functions: Dict[str, "FunctionContract"] = {} self._linearizedBaseContracts: List[int] = [] self._custom_errors: Dict[str, "CustomErrorContract"] = {} + self._type_aliases: Dict[str, "TypeAliasContract"] = {} # The only str is "*" self._using_for: Dict[USING_FOR_KEY, USING_FOR_ITEM] = {} @@ -364,6 +366,38 @@ def custom_errors_declared(self) -> List["CustomErrorContract"]: def custom_errors_as_dict(self) -> Dict[str, "CustomErrorContract"]: return self._custom_errors + # endregion + ################################################################################### + ################################################################################### + # region Custom Errors + ################################################################################### + ################################################################################### + + @property + def type_aliases(self) -> List["TypeAliasContract"]: + """ + list(TypeAliasContract): List of the contract's custom errors + """ + return list(self._type_aliases.values()) + + @property + def type_aliases_inherited(self) -> List["TypeAliasContract"]: + """ + list(TypeAliasContract): List of the inherited custom errors + """ + return [s for s in self.type_aliases if s.contract != self] + + @property + def type_aliases_declared(self) -> List["TypeAliasContract"]: + """ + list(TypeAliasContract): List of the custom errors declared within the contract (not inherited) + """ + return [s for s in self.type_aliases if s.contract == self] + + @property + def type_aliases_as_dict(self) -> Dict[str, "TypeAliasContract"]: + return self._type_aliases + # endregion ################################################################################### ################################################################################### diff --git a/slither/core/scope/scope.py b/slither/core/scope/scope.py index cafeb3585d..937a051361 100644 --- a/slither/core/scope/scope.py +++ b/slither/core/scope/scope.py @@ -52,7 +52,7 @@ def __init__(self, filename: Filename) -> None: # User defined types # Name -> type alias - self.user_defined_types: Dict[str, TypeAlias] = {} + self.type_aliases: Dict[str, TypeAlias] = {} def add_accesible_scopes(self) -> bool: """ @@ -95,8 +95,8 @@ def add_accesible_scopes(self) -> bool: if not _dict_contain(new_scope.renaming, self.renaming): self.renaming.update(new_scope.renaming) learn_something = True - if not _dict_contain(new_scope.user_defined_types, self.user_defined_types): - self.user_defined_types.update(new_scope.user_defined_types) + if not _dict_contain(new_scope.type_aliases, self.type_aliases): + self.type_aliases.update(new_scope.type_aliases) learn_something = True return learn_something diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index 74a1cbcf0d..a118b1e650 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -291,10 +291,10 @@ def _parse_type_alias(self, item: Dict) -> None: alias = item["name"] alias_canonical = self._contract.name + "." + item["name"] - user_defined_type = TypeAliasContract(original_type, alias, self.underlying_contract) - user_defined_type.set_offset(item["src"], self.compilation_unit) - self._contract.file_scope.user_defined_types[alias] = user_defined_type - self._contract.file_scope.user_defined_types[alias_canonical] = user_defined_type + type_alias = TypeAliasContract(original_type, alias, self.underlying_contract) + type_alias.set_offset(item["src"], self.compilation_unit) + self._contract.type_aliases_as_dict[alias] = type_alias + self._contract.file_scope.type_aliases[alias_canonical] = type_alias def _parse_struct(self, struct: Dict) -> None: diff --git a/slither/solc_parsing/declarations/using_for_top_level.py b/slither/solc_parsing/declarations/using_for_top_level.py index fe72e57809..bfed3c417c 100644 --- a/slither/solc_parsing/declarations/using_for_top_level.py +++ b/slither/solc_parsing/declarations/using_for_top_level.py @@ -152,7 +152,7 @@ def _propagate_global(self, type_name: Union[TypeAliasTopLevel, UserDefinedType] if self._global: for scope in self.compilation_unit.scopes.values(): if isinstance(type_name, TypeAliasTopLevel): - for alias in scope.user_defined_types.values(): + for alias in scope.type_aliases.values(): if alias == type_name: scope.using_for_directives.add(self._using_for) elif isinstance(type_name, UserDefinedType): diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 32f5afc584..3bbdd268ef 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -114,6 +114,8 @@ def find_top_level( :return: :rtype: """ + if var_name in scope.type_aliases: + return scope.type_aliases[var_name], False if var_name in scope.structures: return scope.structures[var_name], False @@ -205,6 +207,10 @@ def _find_in_contract( if sig == var_name: return modifier + type_aliases = contract.type_aliases_as_dict + if var_name in type_aliases: + return type_aliases[var_name] + # structures are looked on the contract declarer structures = contract.structures_as_dict if var_name in structures: @@ -362,9 +368,6 @@ def find_variable( if var_name in current_scope.renaming: var_name = current_scope.renaming[var_name] - if var_name in current_scope.user_defined_types: - return current_scope.user_defined_types[var_name], False - # Use ret0/ret1 to help mypy ret0 = _find_variable_from_ref_declaration( referenced_declaration, direct_contracts, direct_functions diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index 00ac3a5192..ecfecb4f03 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -344,10 +344,10 @@ def parse_top_level_from_loaded_json(self, data_loaded: Dict, filename: str) -> original_type = ElementaryType(underlying_type["name"]) - user_defined_type = TypeAliasTopLevel(original_type, alias, scope) - user_defined_type.set_offset(top_level_data["src"], self._compilation_unit) - self._compilation_unit.user_defined_value_types[alias] = user_defined_type - scope.user_defined_types[alias] = user_defined_type + type_alias = TypeAliasTopLevel(original_type, alias, scope) + type_alias.set_offset(top_level_data["src"], self._compilation_unit) + self._compilation_unit.type_aliases[alias] = type_alias + scope.type_aliases[alias] = type_alias else: raise SlitherException(f"Top level {top_level_data[self.get_key()]} not supported") diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index e12290722f..c03b8e6562 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -235,7 +235,7 @@ def parse_type( sl: "SlitherCompilationUnit" renaming: Dict[str, str] - user_defined_types: Dict[str, TypeAlias] + type_aliases: Dict[str, TypeAlias] enums_direct_access: List["Enum"] = [] # Note: for convenicence top level functions use the same parser than function in contract # but contract_parser is set to None @@ -247,13 +247,13 @@ def parse_type( sl = caller_context.compilation_unit next_context = caller_context renaming = {} - user_defined_types = sl.user_defined_value_types + type_aliases = sl.type_aliases else: assert isinstance(caller_context, FunctionSolc) sl = caller_context.underlying_function.compilation_unit next_context = caller_context.slither_parser renaming = caller_context.underlying_function.file_scope.renaming - user_defined_types = caller_context.underlying_function.file_scope.user_defined_types + type_aliases = caller_context.underlying_function.file_scope.type_aliases structures_direct_access = sl.structures_top_level all_structuress = [c.structures for c in sl.contracts] all_structures = [item for sublist in all_structuress for item in sublist] @@ -299,7 +299,7 @@ def parse_type( functions = list(scope.functions) renaming = scope.renaming - user_defined_types = scope.user_defined_types + type_aliases = scope.type_aliases elif isinstance(caller_context, (ContractSolc, FunctionSolc)): sl = caller_context.compilation_unit if isinstance(caller_context, FunctionSolc): @@ -329,7 +329,7 @@ def parse_type( functions = contract.functions + contract.modifiers renaming = scope.renaming - user_defined_types = scope.user_defined_types + type_aliases = scope.type_aliases else: raise ParsingError(f"Incorrect caller context: {type(caller_context)}") @@ -343,8 +343,8 @@ def parse_type( name = t.name if name in renaming: name = renaming[name] - if name in user_defined_types: - return user_defined_types[name] + if name in type_aliases: + return type_aliases[name] return _find_from_type_name( name, functions, @@ -365,9 +365,9 @@ def parse_type( name = t["typeDescriptions"]["typeString"] if name in renaming: name = renaming[name] - if name in user_defined_types: - _add_type_references(user_defined_types[name], t["src"], sl) - return user_defined_types[name] + if name in type_aliases: + _add_type_references(type_aliases[name], t["src"], sl) + return type_aliases[name] type_found = _find_from_type_name( name, functions, @@ -386,9 +386,9 @@ def parse_type( name = t["attributes"][type_name_key] if name in renaming: name = renaming[name] - if name in user_defined_types: - _add_type_references(user_defined_types[name], t["src"], sl) - return user_defined_types[name] + if name in type_aliases: + _add_type_references(type_aliases[name], t["src"], sl) + return type_aliases[name] type_found = _find_from_type_name( name, functions, @@ -407,8 +407,8 @@ def parse_type( name = t["name"] if name in renaming: name = renaming[name] - if name in user_defined_types: - return user_defined_types[name] + if name in type_aliases: + return type_aliases[name] type_found = _find_from_type_name( name, functions, diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 005ad81a44..a1dadbb63f 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -516,8 +516,8 @@ def _post_member_access(self, expression: MemberAccess) -> None: # contract A { type MyInt is int} # contract B { function f() public{ A.MyInt test = A.MyInt.wrap(1);}} # The logic is handled by _post_call_expression - if expression.member_name in expr.file_scope.user_defined_types: - set_val(expression, expr.file_scope.user_defined_types[expression.member_name]) + if expression.member_name in expr.file_scope.type_aliases: + set_val(expression, expr.file_scope.type_aliases[expression.member_name]) return # Lookup errors referred to as member of contract e.g. Test.myError.selector if expression.member_name in expr.custom_errors_as_dict: diff --git a/tests/e2e/solc_parsing/test_ast_parsing.py b/tests/e2e/solc_parsing/test_ast_parsing.py index 307e6736ff..28ac79986d 100644 --- a/tests/e2e/solc_parsing/test_ast_parsing.py +++ b/tests/e2e/solc_parsing/test_ast_parsing.py @@ -459,6 +459,7 @@ def make_version(minor: int, patch_min: int, patch_max: int) -> List[str]: ["0.6.9", "0.7.6", "0.8.16"], ), Test("user_defined_operators-0.8.19.sol", ["0.8.19"]), + Test("type-aliases.sol", ["0.8.19"]), ] # create the output folder if needed try: diff --git a/tests/e2e/solc_parsing/test_data/compile/type-aliases.sol-0.8.19-compact.zip b/tests/e2e/solc_parsing/test_data/compile/type-aliases.sol-0.8.19-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..0c4d2b1c5e2a155c49cf64c3815266e1b19dc65c GIT binary patch literal 2111 zcma);c{~%01I9OJxsQm+D3WuIO=yngT$3ZTFiXQoIT}L9BFBu}xd~_y6zn`904c-+!L}zmKIUGm9R83BUvJOW8wPCc@A!*#UsH%K(5h z008iN@(8bl^Ki%c;(Z~$-X4zlz(?LbevUXF=lkydc*p}^Z?Cf~tN<(k@C*RZA(7mm zzo3MIk-<7RcTSg=`{h<}<8_p<#y;otLnW1npKSTWw~f zBa8XyV}68OuQM$JorFk_!s@gN;3P;l+y(BnDnyfl4kkAS`vo*Ma{A=wTpBg0$Ay>o z3-uHV%T+$-vSxLP?B0_|c3p6-ITv0jnLO9<&3+woic|Ep-Xn)} zM@b=K%e93)mX0S(p}N0n^gG*J4w(KXju6RV4#S6+?gsVPPkrA#D@_?6qn7H&9=ZJ! z=~uLW^wC>^Xwurpy*dq!5f%AaMR;Nw}WPdo=paOK7wNJQj8sd)A z(c%O>+;+^{~yroyf>)K}#v%W(-L+m5kT?$l}GW5*ylr3eb|t#Fm}7ZroySAPZ6To~5Rh z9H?q>UVPF~au$?j!J6nF+|9SC8kxc5ywCA_47jFn2x;^J+)D)JA7*# zyv}r%eesE!N0uq6-{M4ElI|)bj}~aPCal-QXVZ<($k=*6*5Hxbs8yK`hJ)r37N1#s zS*q0^2<+uzzTpI=*Hga*HS=+Ol2CLv{{k_ZX&*H7hL735m;T^pXTdrkU0voWhMBW! zz!wg_$yRFI^XJZh@}BE^Lp)8O3YHbCaE6i`qHk7?=#9o*vwEQVz~#o!cndx=B~=}) zT!%~=x*|G&i~#ZCOtA)Z+xSvd$Q)rD<+0v;3>UD{SH_BTTM~ZM^dz!MYO-{c)*MRT|}$l zZ0{y$#>g^Q_Rz6W*6Xg|?~IR7Wl5}00 zlO3D6$-)NmXPH|7Blvz1u+KQ%NU-90C)pJ5`#lgVQX5oehE;Q|Q!n>pA07QBjH}Wn z4+?m1=N;3G5Hxx3PyeVbqz77NrAEM>Yb+Dk7JyaPj&>&jFd1JG`#xf5WJ*R3c^=yA z^c1C(d`+h~+JX{DtV$uK4^zcL_dSQ$^-rCXQj5BHzl8Q+MHw&$4@z`99Hq~5Ujbv9 z?D+xX7DgwAG8T7NUvRe1(%d)=aBDIc(Nl+;7{t&u=0(JMRhY6^64O>L`{j4I(4XK%6J!mO%ueAL?(?-2om<8Od!|^T6Os znLvRB>A3lU9z6TPKPhi#D=2Dx@>0d%IQ-(*w40I!C9WukjBHu!RP2^;Z{{5YGvW52 z4D0XthxB2a`(=m2z*lU)ekQyPY;n61riRLo%`nEjEQx@9h8Kzoy7<(+|J^cY5^LQw zrEF6NcYn(1^6q^G2O|)e3E>h8D(nmS(p*-#OR;^RLc2hB-AJ2$l38L*IMEfzM7&6H zuuU%Q2*2w82(4h?qV)~2H2pibUnn7OwxR<901V9}euaH#5bA|vT5@Ei^1wS$%B^}* z6b_iiqIm8exPe8aXQzz0W`!Uq73BBJEH1yVd$z8fFX~+tvI!>5sN9(Ww?|>bF9ZDrut|7S&tv#F`21SA{*q2}QkJ8PU1Iw0d=Ne$?udB}g9Y;4K{( z(9V~nr9s1$4|NxO(mjnSr8MAm{uYV1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "DeleteTest": {} +} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/type-aliases.sol b/tests/e2e/solc_parsing/test_data/type-aliases.sol new file mode 100644 index 0000000000..53fdaabeb8 --- /dev/null +++ b/tests/e2e/solc_parsing/test_data/type-aliases.sol @@ -0,0 +1,20 @@ + +struct Z { + int x; + int y; +} + +contract OtherTest { + struct Z { + int x; + int y; + } + + function myfunc() external { + Z memory z = Z(2,3); + } +} + +contract DeleteTest { + type Z is int; +} diff --git a/tests/unit/core/test_source_mapping.py b/tests/unit/core/test_source_mapping.py index fe53359777..55eb082950 100644 --- a/tests/unit/core/test_source_mapping.py +++ b/tests/unit/core/test_source_mapping.py @@ -85,15 +85,13 @@ def test_references_user_defined_aliases(solc_binary_path): file = Path(SRC_MAPPING_TEST_ROOT, "ReferencesUserDefinedAliases.sol").as_posix() slither = Slither(file, solc=solc_path) - alias_top_level = slither.compilation_units[0].user_defined_value_types["aliasTopLevel"] + alias_top_level = slither.compilation_units[0].type_aliases["aliasTopLevel"] assert len(alias_top_level.references) == 2 lines = _sort_references_lines(alias_top_level.references) assert lines == [12, 16] alias_contract_level = ( - slither.compilation_units[0] - .contracts[0] - .file_scope.user_defined_types["C.aliasContractLevel"] + slither.compilation_units[0].contracts[0].file_scope.type_aliases["C.aliasContractLevel"] ) assert len(alias_contract_level.references) == 2 lines = _sort_references_lines(alias_contract_level.references) From 0a5b9fdec1cd408ec9c7baa67862cafe3d945171 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 8 Sep 2023 00:28:05 -0500 Subject: [PATCH 130/169] prioritize reference id in name resolution to avoid shadowing related issues --- slither/core/declarations/contract.py | 8 +++ slither/solc_parsing/declarations/contract.py | 2 + .../solc_parsing/expressions/find_variable.py | 57 ++++++++++++------- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 9b1488db31..46a548cee0 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -77,6 +77,8 @@ def __init__(self, compilation_unit: "SlitherCompilationUnit", scope: "FileScope # do not contain private variables inherited from contract self._variables: Dict[str, "StateVariable"] = {} self._variables_ordered: List["StateVariable"] = [] + # Reference id -> variable declaration (only available for compact AST) + self._state_variables_by_ref_id: Dict[int, "StateVariable"] = {} self._modifiers: Dict[str, "Modifier"] = {} self._functions: Dict[str, "FunctionContract"] = {} self._linearizedBaseContracts: List[int] = [] @@ -370,6 +372,12 @@ def custom_errors_as_dict(self) -> Dict[str, "CustomErrorContract"]: # region Variables ################################################################################### ################################################################################### + @property + def state_variables_by_ref_id(self) -> Dict[int, "StateVariable"]: + """ + Returns the state variables by reference id (only available for compact AST). + """ + return self._state_variables_by_ref_id @property def variables(self) -> List["StateVariable"]: diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index 74a1cbcf0d..b7fc846d02 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -357,6 +357,8 @@ def parse_state_variables(self) -> None: self._variables_parser.append(var_parser) assert var.name + if var_parser.reference_id is not None: + self._contract.state_variables_by_ref_id[var_parser.reference_id] = var self._contract.variables_as_dict[var.name] = var self._contract.add_variables_ordered([var]) diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 32f5afc584..f0adef1d51 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -54,10 +54,26 @@ def _find_variable_from_ref_declaration( referenced_declaration: Optional[int], all_contracts: List["Contract"], all_functions: List["Function"], + function_parser: Optional["FunctionSolc"], + contract_declarer: Optional["Contract"], ) -> Optional[Union[Contract, Function]]: + """ + Reference declarations take the highest priority, but they are not available for legacy AST. + """ if referenced_declaration is None: return None - # id of the contracts is the referenced declaration + # We look for variable declared with the referencedDeclaration attribute + if function_parser is not None: + func_variables_renamed = function_parser.variables_renamed + if referenced_declaration in func_variables_renamed: + return func_variables_renamed[referenced_declaration].underlying_variable + + if ( + contract_declarer is not None + and referenced_declaration in contract_declarer.state_variables_by_ref_id + ): + return contract_declarer.state_variables_by_ref_id[referenced_declaration] + # Ccontracts ids are the referenced declaration # This is not true for the functions, as we dont always have the referenced_declaration # But maybe we could? (TODO) for contract_candidate in all_contracts: @@ -72,14 +88,9 @@ def _find_variable_from_ref_declaration( def _find_variable_in_function_parser( var_name: str, function_parser: Optional["FunctionSolc"], - referenced_declaration: Optional[int] = None, ) -> Optional[Variable]: if function_parser is None: return None - # We look for variable declared with the referencedDeclaration attr - func_variables_renamed = function_parser.variables_renamed - if referenced_declaration and referenced_declaration in func_variables_renamed: - return func_variables_renamed[referenced_declaration].underlying_variable # If not found, check for name func_variables = function_parser.underlying_function.variables_as_dict if var_name in func_variables: @@ -365,20 +376,6 @@ def find_variable( if var_name in current_scope.user_defined_types: return current_scope.user_defined_types[var_name], False - # Use ret0/ret1 to help mypy - ret0 = _find_variable_from_ref_declaration( - referenced_declaration, direct_contracts, direct_functions - ) - if ret0: - return ret0, False - - function_parser: Optional[FunctionSolc] = ( - caller_context if isinstance(caller_context, FunctionSolc) else None - ) - ret1 = _find_variable_in_function_parser(var_name, function_parser, referenced_declaration) - if ret1: - return ret1, False - contract: Optional[Contract] = None contract_declarer: Optional[Contract] = None if isinstance(caller_context, ContractSolc): @@ -392,6 +389,24 @@ def find_variable( else: assert isinstance(underlying_func, FunctionTopLevel) + function_parser: Optional[FunctionSolc] = ( + caller_context if isinstance(caller_context, FunctionSolc) else None + ) + # Use ret0/ret1 to help mypy + ret0 = _find_variable_from_ref_declaration( + referenced_declaration, + direct_contracts, + direct_functions, + function_parser, + contract_declarer, + ) + if ret0: + return ret0, False + + ret1 = _find_variable_in_function_parser(var_name, function_parser) + if ret1: + return ret1, False + ret = _find_in_contract(var_name, contract, contract_declarer, is_super, is_identifier_path) if ret: return ret, False @@ -442,6 +457,8 @@ def find_variable( referenced_declaration, list(current_scope.contracts.values()), list(current_scope.functions), + None, + None, ) if ret: return ret, False From ddd9d6561f5583f01415930d753efc9f2acd55a4 Mon Sep 17 00:00:00 2001 From: Simone Date: Fri, 8 Sep 2023 13:20:03 +0200 Subject: [PATCH 131/169] Add IR test --- tests/unit/slithir/test_data/enum_max_min.sol | 37 ++++++++++ tests/unit/slithir/test_enum.py | 67 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 tests/unit/slithir/test_data/enum_max_min.sol create mode 100644 tests/unit/slithir/test_enum.py diff --git a/tests/unit/slithir/test_data/enum_max_min.sol b/tests/unit/slithir/test_data/enum_max_min.sol new file mode 100644 index 0000000000..5f5ecc342f --- /dev/null +++ b/tests/unit/slithir/test_data/enum_max_min.sol @@ -0,0 +1,37 @@ + +library Q { + enum E {a} +} + +contract Z { + enum E {a,b} +} + +contract D { + enum E {a,b,c} + + function a() public returns(uint){ + return uint(type(E).max); + } + + function b() public returns(uint){ + return uint(type(Q.E).max); + } + + function c() public returns(uint){ + return uint(type(Z.E).max); + } + + function d() public returns(uint){ + return uint(type(E).min); + } + + function e() public returns(uint){ + return uint(type(Q.E).min); + } + + function f() public returns(uint){ + return uint(type(Z.E).min); + } + +} diff --git a/tests/unit/slithir/test_enum.py b/tests/unit/slithir/test_enum.py new file mode 100644 index 0000000000..4f1fc4e595 --- /dev/null +++ b/tests/unit/slithir/test_enum.py @@ -0,0 +1,67 @@ +from pathlib import Path +from slither import Slither +from slither.slithir.operations import Assignment +from slither.slithir.variables import Constant + +TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" + + +def test_enum_max_min(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.19") + slither = Slither(Path(TEST_DATA_DIR, "enum_max_min.sol").as_posix(), solc=solc_path) + + contract = slither.get_contract_from_name("D")[0] + + f = contract.get_function_from_full_name("a()") + # TMP_1(uint256) := 2(uint256) + assignment = f.slithir_operations[1] + assert ( + isinstance(assignment, Assignment) + and isinstance(assignment.rvalue, Constant) + and assignment.rvalue.value == 2 + ) + + f = contract.get_function_from_full_name("b()") + # TMP_4(uint256) := 0(uint256) + assignment = f.slithir_operations[1] + assert ( + isinstance(assignment, Assignment) + and isinstance(assignment.rvalue, Constant) + and assignment.rvalue.value == 0 + ) + + f = contract.get_function_from_full_name("c()") + # TMP_7(uint256) := 1(uint256) + assignment = f.slithir_operations[1] + assert ( + isinstance(assignment, Assignment) + and isinstance(assignment.rvalue, Constant) + and assignment.rvalue.value == 1 + ) + + f = contract.get_function_from_full_name("d()") + # TMP_10(uint256) := 0(uint256) + assignment = f.slithir_operations[1] + assert ( + isinstance(assignment, Assignment) + and isinstance(assignment.rvalue, Constant) + and assignment.rvalue.value == 0 + ) + + f = contract.get_function_from_full_name("e()") + # TMP_13(uint256) := 0(uint256) + assignment = f.slithir_operations[1] + assert ( + isinstance(assignment, Assignment) + and isinstance(assignment.rvalue, Constant) + and assignment.rvalue.value == 0 + ) + + f = contract.get_function_from_full_name("f()") + # TMP_16(uint256) := 0(uint256) + assignment = f.slithir_operations[1] + assert ( + isinstance(assignment, Assignment) + and isinstance(assignment.rvalue, Constant) + and assignment.rvalue.value == 0 + ) From 8d5c033fbeaea0c464bb0cfb177ab9e1124ddf3a Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Fri, 8 Sep 2023 15:19:20 +0200 Subject: [PATCH 132/169] Improve mapping-deletion detector for nested mappings (#2084) * Fix for nested mappings * Add test --- .../detectors/statements/mapping_deletion.py | 24 +++++++++++++----- ...etection_0_4_25_MappingDeletion_sol__0.txt | 7 +++-- ...etection_0_5_16_MappingDeletion_sol__0.txt | 7 +++-- ...etection_0_6_11_MappingDeletion_sol__0.txt | 7 +++-- ...Detection_0_7_6_MappingDeletion_sol__0.txt | 7 +++-- .../0.4.25/MappingDeletion.sol | 19 +++++++++++--- .../0.4.25/MappingDeletion.sol-0.4.25.zip | Bin 4451 -> 4826 bytes .../0.5.16/MappingDeletion.sol | 12 ++++++++- .../0.5.16/MappingDeletion.sol-0.5.16.zip | Bin 4490 -> 4854 bytes .../0.6.11/MappingDeletion.sol | 12 ++++++++- .../0.6.11/MappingDeletion.sol-0.6.11.zip | Bin 4462 -> 4829 bytes .../0.7.6/MappingDeletion.sol | 12 ++++++++- .../0.7.6/MappingDeletion.sol-0.7.6.zip | Bin 4359 -> 4728 bytes 13 files changed, 86 insertions(+), 21 deletions(-) diff --git a/slither/detectors/statements/mapping_deletion.py b/slither/detectors/statements/mapping_deletion.py index 4cdac72400..0940d5a07b 100644 --- a/slither/detectors/statements/mapping_deletion.py +++ b/slither/detectors/statements/mapping_deletion.py @@ -6,6 +6,7 @@ from slither.core.cfg.node import Node from slither.core.declarations import Structure from slither.core.declarations.contract import Contract +from slither.core.variables.variable import Variable from slither.core.declarations.function_contract import FunctionContract from slither.core.solidity_types import MappingType, UserDefinedType from slither.detectors.abstract_detector import ( @@ -69,14 +70,25 @@ def detect_mapping_deletion( for ir in node.irs: if isinstance(ir, Delete): value = ir.variable - if isinstance(value.type, UserDefinedType) and isinstance( - value.type.type, Structure - ): - st = value.type.type - if any(isinstance(e.type, MappingType) for e in st.elems.values()): - ret.append((f, st, node)) + MappingDeletionDetection.check_if_mapping(value, ret, f, node) + return ret + @staticmethod + def check_if_mapping( + value: Variable, + ret: List[Tuple[FunctionContract, Structure, Node]], + f: FunctionContract, + node: Node, + ): + if isinstance(value.type, UserDefinedType) and isinstance(value.type.type, Structure): + st = value.type.type + if any(isinstance(e.type, MappingType) for e in st.elems.values()): + ret.append((f, st, node)) + return + for e in st.elems.values(): + MappingDeletionDetection.check_if_mapping(e, ret, f, node) + def _detect(self) -> List[Output]: """Detect mapping deletion diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt index 902f966688..4d47bb5709 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#41) + Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#10) -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#28-31) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#30) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#37) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt index fec236e1c2..88e4ac554f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#10) -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#31) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#37) + +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#41) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt index 7f0372c36d..4270f0d86c 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#31) +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#41) Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#10) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#37) + diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt index f519a046f1..ea6ed2dd6a 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt @@ -1,5 +1,8 @@ -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#31) +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#41) + +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#37) Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#10) diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol index bedbb64a8f..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol @@ -6,7 +6,7 @@ library Lib{ mapping(address => uint) maps; } - function deleteSt(MyStruct[1] storage st){ + function deleteSt(MyStruct[1] storage st) internal { delete st[0]; } @@ -17,18 +17,29 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { - require(stackBalance[idx].owner == 0); - stackBalance[idx] = BalancesStruct(msg.sender); + require(stackBalance[idx].owner == address(0)); + BalancesStruct storage str = stackBalance[idx]; + str.owner = msg.sender; } function deleteBalance(uint idx) public { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol-0.4.25.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol-0.4.25.zip index be3e13807a58aa1af11fdb342f340adc88a9755d..58859369959bfac936960954f215b5833a09526f 100644 GIT binary patch delta 4714 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 diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol index e1b608a463..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol @@ -17,9 +17,15 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol-0.5.16.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol-0.5.16.zip index 0ad84a58895f5b258c6da9782c5af54a4c8a90c0..2e578904619f0599c1f10815a5902848ac7061d6 100644 GIT binary patch delta 4742 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 l00XK304D$d00000000000Du7i0001!xe_-99}xfm005XpUMm0q diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol index e1b608a463..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol @@ -17,9 +17,15 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol-0.6.11.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol-0.6.11.zip index 5f66da061726c113304482f713b820a2633b3af7..8f532ea669ffceb1de40fa487ffbac2520a01042 100644 GIT binary patch delta 4724 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 uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol-0.7.6.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol-0.7.6.zip index 5888e0e534de961f401d61096c979e183b926d78..c685454ce649c797088054d6913880ef784de64a 100644 GIT binary patch delta 4615 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 delta 4267 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 Date: Fri, 8 Sep 2023 17:55:04 -0500 Subject: [PATCH 133/169] also support reference id for legacy AST --- slither/solc_parsing/expressions/expression_parsing.py | 9 +++++---- slither/solc_parsing/expressions/find_variable.py | 6 ++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/slither/solc_parsing/expressions/expression_parsing.py b/slither/solc_parsing/expressions/expression_parsing.py index a0bce044c2..c192b4efee 100644 --- a/slither/solc_parsing/expressions/expression_parsing.py +++ b/slither/solc_parsing/expressions/expression_parsing.py @@ -486,13 +486,18 @@ def parse_expression(expression: Dict, caller_context: CallerContextExpression) t = None + referenced_declaration = None if caller_context.is_compact_ast: value = expression["name"] t = expression["typeDescriptions"]["typeString"] + if "referencedDeclaration" in expression: + referenced_declaration = expression["referencedDeclaration"] else: value = expression["attributes"]["value"] if "type" in expression["attributes"]: t = expression["attributes"]["type"] + if "referencedDeclaration" in expression["attributes"]: + referenced_declaration = expression["attributes"]["referencedDeclaration"] if t: found = re.findall(r"[struct|enum|function|modifier] \(([\[\] ()a-zA-Z0-9\.,_]*)\)", t) @@ -501,10 +506,6 @@ def parse_expression(expression: Dict, caller_context: CallerContextExpression) value = value + "(" + found[0] + ")" value = filter_name(value) - if "referencedDeclaration" in expression: - referenced_declaration = expression["referencedDeclaration"] - else: - referenced_declaration = None var, was_created = find_variable(value, caller_context, referenced_declaration) if was_created: var.set_offset(src, caller_context.compilation_unit) diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 6255ee51ff..b7e28a8912 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -63,10 +63,8 @@ def _find_variable_from_ref_declaration( if referenced_declaration is None: return None # We look for variable declared with the referencedDeclaration attribute - if function_parser is not None: - func_variables_renamed = function_parser.variables_renamed - if referenced_declaration in func_variables_renamed: - return func_variables_renamed[referenced_declaration].underlying_variable + if function_parser is not None and referenced_declaration in function_parser.variables_renamed: + return function_parser.variables_renamed[referenced_declaration].underlying_variable if ( contract_declarer is not None From 733012d15cce834aae0d56f8b96d202f285a9608 Mon Sep 17 00:00:00 2001 From: Judy Wu Date: Fri, 8 Sep 2023 21:40:58 -0400 Subject: [PATCH 134/169] issue #2083: add exceptions for i_ and s_ in the naming-conventions detector --- .../naming_convention/naming_convention.py | 22 +++++++++++++- ...ention_0_4_25_naming_convention_sol__0.txt | 12 ++++---- ...ention_0_5_16_naming_convention_sol__0.txt | 12 ++++---- ...ention_0_6_11_naming_convention_sol__0.txt | 28 +++++++++--------- ...vention_0_7_6_naming_convention_sol__0.txt | 28 +++++++++--------- .../0.4.25/naming_convention.sol | 3 +- .../0.4.25/naming_convention.sol-0.4.25.zip | Bin 3659 -> 3801 bytes ...arning_for_public_constants.sol-0.4.25.zip | Bin 1380 -> 1380 bytes .../0.5.16/naming_convention.sol | 3 +- .../0.5.16/naming_convention.sol-0.5.16.zip | Bin 3671 -> 3804 bytes ...arning_for_public_constants.sol-0.5.16.zip | Bin 1387 -> 1387 bytes .../0.6.11/naming_convention.sol | 5 +++- .../0.6.11/naming_convention.sol-0.6.11.zip | Bin 3688 -> 3930 bytes ...arning_for_public_constants.sol-0.6.11.zip | Bin 1409 -> 1409 bytes .../0.7.6/naming_convention.sol | 5 +++- .../0.7.6/naming_convention.sol-0.7.6.zip | Bin 3605 -> 3852 bytes ...warning_for_public_constants.sol-0.7.6.zip | Bin 1367 -> 1367 bytes 17 files changed, 73 insertions(+), 45 deletions(-) diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 0633799e56..904b57eacf 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -45,6 +45,14 @@ class NamingConvention(AbstractDetector): def is_cap_words(name: str) -> bool: return re.search("^[A-Z]([A-Za-z0-9]+)?_?$", name) is not None + @staticmethod + def is_immutable_naming(name: str) -> bool: + return re.search("^i_[a-z]([A-Za-z0-9]+)?_?$", name) is not None + + @staticmethod + def is_state_naming(name: str) -> bool: + return re.search("^s_[a-z]([A-Za-z0-9]+)?_?$", name) is not None + @staticmethod def is_mixed_case(name: str) -> bool: return re.search("^[a-z]([A-Za-z0-9]+)?_?$", name) is not None @@ -167,10 +175,22 @@ def _detect(self) -> List[Output]: results.append(res) else: - if var.visibility in ["private", "internal"]: + # first priority: check for immutable variable naming conventions + if var.is_immutable: + correct_naming = self.is_immutable_naming(var.name) + + # second priority: check for state variable naming conventions + elif self.is_state_naming(var.name): + correct_naming = True + + # third priority: check if visibility is private or internal and check for underscore mixed case + elif var.visibility in ["private", "internal"]: correct_naming = self.is_mixed_case_with_underscore(var.name) + + # fourth priority: check for mixed case naming conventions else: correct_naming = self.is_mixed_case(var.name) + if not correct_naming: info = ["Variable ", var, " is not in mixedCase\n"] diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt index e4a643678d..2c05a3c403 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#71) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#71) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#60) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#61) is not in mixedCase Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.4.25 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt index 96f6aab3c6..494253c357 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#71) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#71) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#60) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#61) is not in mixedCase Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.5.16 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt index f1986fb781..e6e431fcce 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt @@ -1,32 +1,32 @@ -Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#14-16) is not in CapWords +Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#16-18) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#70) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#73) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#70) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#73) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#72) is not in mixedCase -Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#11) is not in mixedCase +Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#13) is not in mixedCase Constant naming.MY_other_CONSTANT (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#9) is not in UPPER_CASE_WITH_UNDERSCORES -Contract naming (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#3-48) is not in CapWords +Contract naming (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#3-50) is not in CapWords Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#60) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#63) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#57) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#59) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#72) is single letter l, O, or I, which should not be used -Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#23) is not in CapWords +Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#25) is not in CapWords -Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#41-43) is not in mixedCase +Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#43-45) is not in mixedCase -Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#30-33) is not in mixedCase +Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#32-35) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#71) is single letter l, O, or I, which should not be used -Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#35) is not in mixedCase +Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#37) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt index b471cbfa2f..d033db260e 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt @@ -1,32 +1,32 @@ -Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#14-16) is not in CapWords +Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#16-18) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#70) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#73) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#70) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#73) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#72) is not in mixedCase -Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#11) is not in mixedCase +Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#13) is not in mixedCase Constant naming.MY_other_CONSTANT (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#9) is not in UPPER_CASE_WITH_UNDERSCORES -Contract naming (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#3-48) is not in CapWords +Contract naming (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#3-50) is not in CapWords Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#60) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#63) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#57) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#59) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#72) is single letter l, O, or I, which should not be used -Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#23) is not in CapWords +Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#25) is not in CapWords -Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#41-43) is not in mixedCase +Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#43-45) is not in mixedCase -Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#30-33) is not in mixedCase +Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#32-35) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#71) is single letter l, O, or I, which should not be used -Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#35) is not in mixedCase +Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#37) is not in mixedCase diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol index add7867e07..3cc7197e5d 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol @@ -55,7 +55,8 @@ contract T { uint private _myPrivateVar; uint internal _myInternalVar; uint public _myPublicVar; - + uint public s_myStateVar; + uint public myPublicVar; function test(uint _unused, uint _used) public returns(uint){ return _used;} diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip index fe35f0c006f2a1526c143d8def79ef54a25e15c3..a448234c6efc12d56a6f8f3b0795d137c6097df9 100644 GIT binary patch delta 3511 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 delta 3371 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/no_warning_for_public_constants.sol-0.4.25.zip b/tests/e2e/detectors/test_data/naming-convention/0.4.25/no_warning_for_public_constants.sol-0.4.25.zip index b8c6c58c1d0b2579589ca860a0704718ac875347..10aff7711e99be35362fb893bf8c6fb9d4c08ef6 100644 GIT binary patch delta 30 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 delta 3380 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 K2I>s}0000^frvx^ diff --git a/tests/e2e/detectors/test_data/naming-convention/0.5.16/no_warning_for_public_constants.sol-0.5.16.zip b/tests/e2e/detectors/test_data/naming-convention/0.5.16/no_warning_for_public_constants.sol-0.5.16.zip index 600f68386baae0809a4bfb8d720ea31aa7fef8bc..c1cc97460a84a0700770d8195d9284b6ee5a0399 100644 GIT binary patch delta 30 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 LO$O}_00000ZEgC& delta 3397 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 delta 30 kcmZqVZsg_-@MdPQXJBIBW5}GTzLA%el^IA+7G=!=09w%oO#lD@ diff --git a/tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol index add7867e07..94125ab787 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol @@ -8,6 +8,8 @@ contract naming { uint constant MY_CONSTANT = 1; uint constant MY_other_CONSTANT = 2; + uint public immutable i_myImutableVar = 1; + uint Var_One = 1; uint varTwo = 2; @@ -55,7 +57,8 @@ contract T { uint private _myPrivateVar; uint internal _myInternalVar; uint public _myPublicVar; - + uint public s_myStateVar; + uint public myPublicVar; function test(uint _unused, uint _used) public returns(uint){ return _used;} diff --git a/tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol-0.7.6.zip b/tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol-0.7.6.zip index f1e3a8ad558be3b1d4b75b1143c720adfa1d83f2..51df40aa3d627da03687b841b413540f346ead22 100644 GIT binary patch delta 3562 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 delta 3313 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 delta 30 kcmcc4b)Abhz?+%Ho`H#hk0EoW`bOT{EX+W9@@tkH0C?yKp#T5? From 6f27239d48551cdccccc2ee2e9d4da9470180fbf Mon Sep 17 00:00:00 2001 From: Tigran Avagyan Date: Mon, 11 Sep 2023 13:10:07 +0400 Subject: [PATCH 135/169] added type annotation --- slither/solc_parsing/declarations/function.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/solc_parsing/declarations/function.py b/slither/solc_parsing/declarations/function.py index b3821388bf..6097d2304d 100644 --- a/slither/solc_parsing/declarations/function.py +++ b/slither/solc_parsing/declarations/function.py @@ -1103,7 +1103,7 @@ def _parse_unchecked_block(self, block: Dict, node: NodeSolc, scope): node = self._parse_statement(statement, node, new_scope) return node - def _update_reachability(self, node: Node): + def _update_reachability(self, node: Node) -> None: if node.is_reachable: return node.set_is_reachable(True) From d4950f7212cd323b78ed691f520f2ab5e881c6b6 Mon Sep 17 00:00:00 2001 From: judowoodo <38355190+dokzai@users.noreply.github.com> Date: Mon, 11 Sep 2023 14:00:40 -0400 Subject: [PATCH 136/169] Change return type to UnaryType instead of UnaryOperationType (#2124) * fix: return UnaryType instead of UnaryOperationType for Unary IR operation (issue #2085) --- slither/slithir/operations/unary.py | 5 ++--- slither/visitors/slithir/expression_to_slithir.py | 10 +++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/slither/slithir/operations/unary.py b/slither/slithir/operations/unary.py index c6493921dc..72e7ac63ae 100644 --- a/slither/slithir/operations/unary.py +++ b/slither/slithir/operations/unary.py @@ -5,7 +5,6 @@ from slither.slithir.operations.lvalue import OperationWithLValue from slither.slithir.utils.utils import is_valid_lvalue, is_valid_rvalue from slither.slithir.exceptions import SlithIRError -from slither.core.expressions.unary_operation import UnaryOperationType from slither.core.variables.local_variable import LocalVariable from slither.slithir.variables.constant import Constant from slither.slithir.variables.local_variable import LocalIRVariable @@ -35,7 +34,7 @@ def __init__( self, result: Union[TemporaryVariableSSA, TemporaryVariable], variable: Union[Constant, LocalIRVariable, LocalVariable], - operation_type: UnaryOperationType, + operation_type: UnaryType, ) -> None: assert is_valid_rvalue(variable) assert is_valid_lvalue(result) @@ -53,7 +52,7 @@ def rvalue(self) -> Union[Constant, LocalVariable]: return self._variable @property - def type(self) -> UnaryOperationType: + def type(self) -> UnaryType: return self._type @property diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index a1dadbb63f..9aca7f10cc 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -50,6 +50,7 @@ Member, TypeConversion, Unary, + UnaryType, Unpack, Return, SolidityCall, @@ -109,6 +110,13 @@ def set_val(expression: Expression, val: Any) -> None: BinaryOperationType.OROR: BinaryType.OROR, } + +_unary_to_unary = { + UnaryOperationType.BANG: UnaryType.BANG, + UnaryOperationType.TILD: UnaryType.TILD, +} + + _signed_to_unsigned = { BinaryOperationType.DIVISION_SIGNED: BinaryType.DIVISION, BinaryOperationType.MODULO_SIGNED: BinaryType.MODULO, @@ -585,7 +593,7 @@ def _post_unary_operation(self, expression: UnaryOperation) -> None: operation: Operation if expression.type in [UnaryOperationType.BANG, UnaryOperationType.TILD]: lvalue = TemporaryVariable(self._node) - operation = Unary(lvalue, value, expression.type) + operation = Unary(lvalue, value, _unary_to_unary[expression.type]) operation.set_expression(expression) self._result.append(operation) set_val(expression, lvalue) From 324cbe5a5c268dbe3a3e0408b92a5b223aef23b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:45:01 -0500 Subject: [PATCH 137/169] Bump actions/checkout from 3 to 4 (#2112) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/black.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/docker.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/doctor.yml | 2 +- .github/workflows/linter.yml | 2 +- .github/workflows/pip-audit.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/pylint.yml | 2 +- .github/workflows/test.yml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index 33a1666b26..6017255b26 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b59aacd66e..c1a54d4d21 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,7 @@ jobs: - os: windows-2022 type: truffle steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 with: diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 4cb1adcb1c..05406d0edc 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 625cafe4f0..29356c0c6b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Pages uses: actions/configure-pages@v3 - uses: actions/setup-python@v4 diff --git a/.github/workflows/doctor.yml b/.github/workflows/doctor.yml index 85d79f214f..0a0eb896de 100644 --- a/.github/workflows/doctor.yml +++ b/.github/workflows/doctor.yml @@ -29,7 +29,7 @@ jobs: - os: windows-2022 python: 3.8 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 0468b07f8a..5415b6d1be 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml index 4fbc1a3fdc..a98f6ab58b 100644 --- a/.github/workflows/pip-audit.yml +++ b/.github/workflows/pip-audit.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Python uses: actions/setup-python@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b90d490df9..fef0a4a2eb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 8c7e7bce93..7e990371ff 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b3754bfd78..6b911eb92f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,7 +27,7 @@ jobs: type: ["unit", "integration", "tool"] python: ${{ (github.event_name == 'pull_request' && fromJSON('["3.8", "3.11"]')) || fromJSON('["3.8", "3.9", "3.10", "3.11"]') }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 with: @@ -84,7 +84,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python 3.8 uses: actions/setup-python@v4 with: From 7d50891e9e80964333651b9e0927626828d12a40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:45:18 -0500 Subject: [PATCH 138/169] Bump cachix/install-nix-action from 22 to 23 (#2111) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 22 to 23. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1a54d4d21..f04436bd38 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: - name: Set up nix if: matrix.type == 'dapp' - uses: cachix/install-nix-action@v22 + uses: cachix/install-nix-action@v23 - name: Set up cachix if: matrix.type == 'dapp' From 3147396cbf1dcf7d783b40c381878ba66e4138e3 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 11 Sep 2023 16:56:45 -0500 Subject: [PATCH 139/169] fix(convert): do not convert array type to elementary for `InitArray` (#2018) fix(convert): do not convert array type to elementary for `InitArray` --- slither/slithir/convert.py | 2 +- slither/slithir/operations/init_array.py | 2 +- slither/slithir/operations/new_array.py | 2 +- tests/unit/slithir/test_ssa_generation.py | 22 +++++++++++++++++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index d40715c4f3..75900f176f 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1857,7 +1857,7 @@ def convert_constant_types(irs: List[Operation]) -> None: if isinstance(ir.lvalue.type.type, ElementaryType): if ir.lvalue.type.type.type in ElementaryTypeInt: for r in ir.read: - if r.type.type not in ElementaryTypeInt: + if r.type.type.type not in ElementaryTypeInt: r.set_type(ElementaryType(ir.lvalue.type.type.type)) was_changed = True diff --git a/slither/slithir/operations/init_array.py b/slither/slithir/operations/init_array.py index e0754c7705..ec2a63ef00 100644 --- a/slither/slithir/operations/init_array.py +++ b/slither/slithir/operations/init_array.py @@ -44,4 +44,4 @@ def convert(elem): return f"{elem}({elem.type})" init_values = convert(self.init_values) - return f"{self.lvalue}({self.lvalue.type}) = {init_values}" + return f"{self.lvalue}({self.lvalue.type}) = {init_values}" diff --git a/slither/slithir/operations/new_array.py b/slither/slithir/operations/new_array.py index 39b989459f..917bb11ee9 100644 --- a/slither/slithir/operations/new_array.py +++ b/slither/slithir/operations/new_array.py @@ -33,4 +33,4 @@ def read(self) -> List["Constant"]: def __str__(self): args = [str(a) for a in self.arguments] lvalue = self.lvalue - return f"{lvalue}{lvalue.type}) = new {self.array_type}({','.join(args)})" + return f"{lvalue}({lvalue.type}) = new {self.array_type}({','.join(args)})" diff --git a/tests/unit/slithir/test_ssa_generation.py b/tests/unit/slithir/test_ssa_generation.py index 3c7e84973f..b8772ca612 100644 --- a/tests/unit/slithir/test_ssa_generation.py +++ b/tests/unit/slithir/test_ssa_generation.py @@ -11,7 +11,7 @@ from slither import Slither from slither.core.cfg.node import Node, NodeType from slither.core.declarations import Function, Contract -from slither.core.solidity_types import ArrayType +from slither.core.solidity_types import ArrayType, ElementaryType from slither.core.variables.local_variable import LocalVariable from slither.core.variables.state_variable import StateVariable from slither.slithir.operations import ( @@ -1116,3 +1116,23 @@ def test_issue_1846_ternary_in_ternary(slither_from_source): assert node.type == NodeType.IF assert node.son_true.type == NodeType.IF assert node.son_false.type == NodeType.EXPRESSION + + +def test_issue_2016(slither_from_source): + source = """ + contract Contract { + function test() external { + int[] memory a = new int[](5); + } + } + """ + with slither_from_source(source) as slither: + c = slither.get_contract_from_name("Contract")[0] + f = c.functions[0] + operations = f.slithir_operations + new_op = operations[0] + lvalue = new_op.lvalue + lvalue_type = lvalue.type + assert isinstance(lvalue_type, ArrayType) + assert lvalue_type.type == ElementaryType("int256") + assert lvalue_type.is_dynamic From f50a126f2c8b94729d4e3ed2164199811347bce1 Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Mon, 11 Sep 2023 23:57:48 +0200 Subject: [PATCH 140/169] Improve custom error parsing with constants (#2115) * Improve custom error parsing with constants --- slither/solc_parsing/declarations/contract.py | 2 +- .../solc_parsing/declarations/custom_error.py | 9 ++++- .../solc_parsing/expressions/find_variable.py | 32 ++++++++++++++++++ .../slither_compilation_unit_solc.py | 2 +- .../custom_error-0.8.4.sol-0.8.10-compact.zip | Bin 6971 -> 8466 bytes .../custom_error-0.8.4.sol-0.8.11-compact.zip | Bin 6974 -> 8469 bytes .../custom_error-0.8.4.sol-0.8.12-compact.zip | Bin 6966 -> 8467 bytes .../custom_error-0.8.4.sol-0.8.13-compact.zip | Bin 7009 -> 8524 bytes .../custom_error-0.8.4.sol-0.8.14-compact.zip | Bin 7001 -> 8519 bytes .../custom_error-0.8.4.sol-0.8.15-compact.zip | Bin 6999 -> 8520 bytes .../custom_error-0.8.4.sol-0.8.4-compact.zip | Bin 6785 -> 8166 bytes .../custom_error-0.8.4.sol-0.8.5-compact.zip | Bin 6788 -> 8233 bytes .../custom_error-0.8.4.sol-0.8.6-compact.zip | Bin 6784 -> 8240 bytes .../custom_error-0.8.4.sol-0.8.7-compact.zip | Bin 6775 -> 8203 bytes .../custom_error-0.8.4.sol-0.8.8-compact.zip | Bin 6998 -> 8458 bytes .../custom_error-0.8.4.sol-0.8.9-compact.zip | Bin 7002 -> 8477 bytes .../test_data/custom_error-0.8.4.sol | 14 ++++++++ ...custom_error-0.8.4.sol-0.8.10-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.11-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.12-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.13-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.14-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.15-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.4-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.5-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.6-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.7-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.8-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.9-compact.json | 4 ++- 29 files changed, 92 insertions(+), 15 deletions(-) diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index a118b1e650..e7d2745c69 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -319,7 +319,7 @@ def _parse_custom_error(self, custom_error: Dict) -> None: ce.set_contract(self._contract) ce.set_offset(custom_error["src"], self.compilation_unit) - ce_parser = CustomErrorSolc(ce, custom_error, self._slither_parser) + ce_parser = CustomErrorSolc(ce, custom_error, self, self._slither_parser) self._contract.custom_errors_as_dict[ce.name] = ce self._custom_errors_parser.append(ce_parser) diff --git a/slither/solc_parsing/declarations/custom_error.py b/slither/solc_parsing/declarations/custom_error.py index 8cd4592623..34b7ca402f 100644 --- a/slither/solc_parsing/declarations/custom_error.py +++ b/slither/solc_parsing/declarations/custom_error.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Dict +from typing import TYPE_CHECKING, Dict, Optional from slither.core.declarations.custom_error import CustomError from slither.core.declarations.custom_error_contract import CustomErrorContract @@ -10,6 +10,7 @@ if TYPE_CHECKING: from slither.solc_parsing.slither_compilation_unit_solc import SlitherCompilationUnitSolc from slither.core.compilation_unit import SlitherCompilationUnit + from slither.solc_parsing.declarations.contract import ContractSolc # Part of the code was copied from the function parsing @@ -21,11 +22,13 @@ def __init__( self, custom_error: CustomError, custom_error_data: dict, + contract_parser: Optional["ContractSolc"], slither_parser: "SlitherCompilationUnitSolc", ) -> None: self._slither_parser: "SlitherCompilationUnitSolc" = slither_parser self._custom_error = custom_error custom_error.name = custom_error_data["name"] + self._contract_parser = contract_parser self._params_was_analyzed = False if not self._slither_parser.is_compact_ast: @@ -56,6 +59,10 @@ def analyze_params(self) -> None: if params: self._parse_params(params) + @property + def contract_parser(self) -> Optional["ContractSolc"]: + return self._contract_parser + @property def is_compact_ast(self) -> bool: return self._slither_parser.is_compact_ast diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 3bbdd268ef..0a1275f411 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -3,6 +3,8 @@ from slither.core.declarations import Event, Enum, Structure from slither.core.declarations.contract import Contract from slither.core.declarations.custom_error import CustomError +from slither.core.declarations.custom_error_contract import CustomErrorContract +from slither.core.declarations.custom_error_top_level import CustomErrorTopLevel from slither.core.declarations.function import Function from slither.core.declarations.function_contract import FunctionContract from slither.core.declarations.function_top_level import FunctionTopLevel @@ -246,6 +248,7 @@ def _find_in_contract( return None +# pylint: disable=too-many-statements def _find_variable_init( caller_context: CallerContextExpression, ) -> Tuple[List[Contract], List["Function"], FileScope,]: @@ -253,6 +256,7 @@ def _find_variable_init( from slither.solc_parsing.declarations.function import FunctionSolc from slither.solc_parsing.declarations.structure_top_level import StructureTopLevelSolc from slither.solc_parsing.variables.top_level_variable import TopLevelVariableSolc + from slither.solc_parsing.declarations.custom_error import CustomErrorSolc direct_contracts: List[Contract] direct_functions_parser: List[Function] @@ -295,6 +299,24 @@ def _find_variable_init( direct_contracts = [] direct_functions_parser = [] scope = caller_context.underlying_variable.file_scope + elif isinstance(caller_context, CustomErrorSolc): + if caller_context.contract_parser: + direct_contracts = [caller_context.contract_parser.underlying_contract] + direct_functions_parser = [ + f.underlying_function + for f in caller_context.contract_parser.functions_parser + + caller_context.contract_parser.modifiers_parser + ] + else: + # Top level custom error + direct_contracts = [] + direct_functions_parser = [] + underlying_custom_error = caller_context.underlying_custom_error + if isinstance(underlying_custom_error, CustomErrorTopLevel): + scope = underlying_custom_error.file_scope + else: + assert isinstance(underlying_custom_error, CustomErrorContract) + scope = underlying_custom_error.contract.file_scope else: raise SlitherError( f"{type(caller_context)} ({caller_context} is not valid for find_variable" @@ -343,6 +365,7 @@ def find_variable( """ from slither.solc_parsing.declarations.function import FunctionSolc from slither.solc_parsing.declarations.contract import ContractSolc + from slither.solc_parsing.declarations.custom_error import CustomErrorSolc # variable are looked from the contract declarer # functions can be shadowed, but are looked from the contract instance, rather than the contract declarer @@ -394,6 +417,15 @@ def find_variable( contract_declarer = underlying_func.contract_declarer else: assert isinstance(underlying_func, FunctionTopLevel) + elif isinstance(caller_context, CustomErrorSolc): + underlying_custom_error = caller_context.underlying_custom_error + if isinstance(underlying_custom_error, CustomErrorContract): + contract = underlying_custom_error.contract + # We check for contract variables here because _find_in_contract + # will return since in this case the contract_declarer is None + for var in contract.variables: + if var_name == var.name: + return var, False ret = _find_in_contract(var_name, contract, contract_declarer, is_super, is_identifier_path) if ret: diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index ecfecb4f03..2d04a70a63 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -326,7 +326,7 @@ def parse_top_level_from_loaded_json(self, data_loaded: Dict, filename: str) -> custom_error = CustomErrorTopLevel(self._compilation_unit, scope) custom_error.set_offset(top_level_data["src"], self._compilation_unit) - custom_error_parser = CustomErrorSolc(custom_error, top_level_data, self) + custom_error_parser = CustomErrorSolc(custom_error, top_level_data, None, self) scope.custom_errors.add(custom_error) self._compilation_unit.custom_errors.append(custom_error) self._custom_error_parser.append(custom_error_parser) diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.10-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.10-compact.zip index fc45cb40e298c9742ce96b9c4804bbec36ccd2d4..c88ab3209e88b25e31ca209798f56b942f2ee526 100644 GIT binary patch delta 8380 zcmV;tAVc4~Hj+XaP)h>@KL7#%4gjZvC07^bT(evt003kH0g)M4e=+q#K91WPVG-ly zxbh2Do{#lN8uPF(Qtp_SNT(3l)O2y3ZV0~3#BqgeqOq2(0oWQof@C{x>J`xGHxE&ciWs7};;O*8-t!Ku{0oHx*c>gI3Rzf*%j~jNg`T*U z)^YX%NR>9{XY$HxT^T`q58E(W*JnFDQ+ng8=`s_39-;5CjSn%bI_0 zyPkVSK1Jc1D@4R{ycxY?_>tHT6PXD7#p&SS80#Ukx8YKee?xBLEi#PC-`31MZE5jt zrzG>`=cPB8T$9V%6N(Qm1mu(7s*@fsyLP@TN@p1ny@a!}>DGyTuwW#YXcmu(hX{O8 z4=)6&9QK6B#HIT|`mL;cdO(_Sb_@nZgD)~BEk*=2Eq*7WMeI=4 zz2rh-E-1m>e>DAfiTkKFP64kDBwk8~wB9mk)RmBGD<&f$lVm_1?w|16pMtsd=Iwrz z64hxV;tP_!4^u}_y{IYkr^&Pn%ig#c2n9~V4&hs+nvXQB%fSx{6Cppe_5}hTc^u#N>m=Am+REj_%FeWDi0V)RR_hppv z>O%sKYPPcdb_EVw#XUJ(n)Yi{q>^QiD( z>9$L#6>A?v3hDVHKmnR(ObZIkmcMn0nr?Fv$T^p6933;lQg7?RpoAnUfd)T^%)!EJ zLaMPmoCCuDkYJ-NsixNDy=^(q6HFdtMbyF#e+4WbVX7&uIDtxxJSS0l&??YxK^zKS zXT4fg154t-{g0g7QJyE5leJr}^%AmLFcvU|I0sj770VT7=7a?zbIB~QB_3n+W@nz4 zrEl}lRDv0mCn#0Uaxdd5rjaR>taW0Kcec;Ad13+~hv?7Bo^YvyonWbArdGUAi z%95nxEgQkv8OLsVRKij!PjKQx+UL1@%7&MSsT%c8_vE-#8TViM{=bfby)t|64xQ(N z0BQL3hXr;aZzE`sUfE_wmSi>i;(5$ie>*O?-?UyF!3C{@^eBbQtl3C(Q=yo0WL`LZ zM%*xvl@jTxK?F~ewfG2oiW&m5fUZQA5!|$s9ZYsCbH7mP$X#bP`itJ_gKiKAw38El zH7%dUI)Dv2o@-?FM7zE_Y?p&9Jx8D8IJE{RInQr&;a0J3tZ#Fi)OIid{FUige>m>* z+8sb+?&G!_v__bX<}NzM$N^<|-C=PDu*pPw=^Q647_Pt}F&f0!izE^6M(!K=i|tMA z#(A*9n9I9l&_6m>{A%@O6eh{szUD~taA!Zv9Hk;15L^bebXC#x?8P;8m`P4LeS1<~z0uwm?5G0;aH-N()FjM8 zcbBjdiz_5e7@rk|g2i9JrU0MuKM%N@qhUZbjgzZ18Y+1*HVQtohdk%ge>UUvh$)4Z z_gY7sqGfq1g4h^BN7kdTILI=kXyt^qCa}|c*xjU*+fE*N1@=W$^+T03@SZMaQHx@H z(U&;9*b@Xdp~?p>)>)bKf3MiVLQ~ieURETnW@+P{TXfoLrLf#qQ6XVS$Za07ve=E` z^$$#~g|=K(myMoI-VNGfXdk7L0XJ)>3|Ho2%1Wbl4Sj7d1afbkI@#`1lWTtnzuxp) z9mzgoXu#!Y+#N_rXO=-qdLsT&YPTk2isf()h(mA+mbhPDEoo$ze?VT%=T*<&z>)9? z?xX7PRay&B?78w75uC7@Z!(iYYb4p=|(pUe?P;YWj*4u9>D{xGSzVt}nDXvC*M5 zW(0R^?{}T#ud>P}`@1qrXG<6`Dmyee*#r&7Fqho>`0D}ik`0}_sK2I)6G!|ni>l&= z%;ja-tF6yXgENzSKjix9B0gY@KOwpJNpXj-X3zP5Ce&Ade{BSWfRrJ&%vy=nLE)c% zc1*G7iw(ZTbj?{~QO`yzvsDog( zN}#ItVb*8wf6dj%w#eeorML;^_^wE;03Ox9jZ_H4;{I;`wDNrlT8ekOYU6915z_DsG&6wFQoT(Hu|)=4m;c&4iJf-z3SE69DK+9!5|X&JRYIJgx)lqO%h_Q5ET zkAZDkf0+>++Vb1#NvTLQaI1;<0<3a;kjj>?1=pQ)-PRTPRmRhlQbz(7Dz|=lCYpN$ zv^#N9X13RyDo&|KAUu*&m#T+_&1;!tf_O}EWy`!baxc&xf{~DbhRf82kEgiPTp2zU zD5PIzulofsVdkU*_J^rbQVme@5n1X$hCF!6&qXBOeq=wn4+K*;=rx zYv8CmcNleXyZ{L{tM);TmVI`{+kmv@vpARH$g!k{N+zQoMVk9Xld`iLSxQcA1qJp& zG)xtoI8e{^&@hagLLU3h-zIPiBa4K`xN;nbLBZJI^_L3U@%YKn;e%La&NT#=&I~Ou ze-v>ZB;6?yDh)KHV_Iq)*Yq=%_|BtbdkIcrn*0C}oSp^3%Fd4?{rMwS|VRfOR0LpJ$jO!i~X?P$+_VCYEkH8lhan%h#!2!o$r}Lh>qhsqG1Y5!hX$crhnrn z$19J)a`2g{4|ty90>DL4ATTl^fBXNn5jSqRv`Tj!SUk8^`O^^{h!0IIgj5&zoLAxM z4=XA=+WWw26|pR|hgNL#!w#^y+ehlSIES@T!(E|HhE#?EGz|?zE;`VTz#O9+(*Kkn zOJO{h>Nce!PutmlUJt>s2JcgOW-R3uJWaJt-*Ld%-S3;KVZr^pfw)uRf6zmKNK;oX z69_s$*VZo52{A9Efe&6*rW=v>#FIW1oafhXk=`%Cv$t6~SqZ2hX~xgIai*AATXU?g zj!CnJ-;$rn!fH(~aC?~ZAP6GQ9>NR;cx{5I4<|x@Ra*a5>FcQD0_c)96|4NM)v6r)2P1t!r!}Yf+cG)J^G$pLdLwmCJyVc z+^!lIgLGW9GnzQ7dBVe-0}cD!YF8o3%x)3HssBv3ar-ucPL4-N>;{Jmo`9RxMxU~$ zw*{9Z8PL7OYs=C-e+^>{_$$>=^qMmq>7z}MPROxgIu~XRT$94r=%VIWtDs)a^!RL+ zhslONLi<%sl8PFetqN)Pwi#ZhB?sZjCQ~?7c2k`lc&(rQ6!$?g!tGSam_S}9a$W;J zXd!3t6r!JM6B%Z6(H67qiijK!ws|;rc|;-_CtSBEsvY^qe{sYNE7x+aj#Ra8?FpJk z6^fF4eI=(6PTKhq`o!2o2!xrz3N?4IdCgYCG@eQp^U{hzGebQ9UB8o1uF}q?thGQ-R|%XBBzr_G4swZpH2^~t9+DSNZFFD`58Q^l;IN>Z#Qf^eRv-I^ zoRnhbZ>Rp0e{qaCUA888U5`CNE(u^iHv4>*SXftAqPjmsww zh2$c$&T)Y>XY^4Ug;SbLG#4T%OQbi4#UNNog#u*x3PJFA9L|{*?NH!^!I(qz>+73Z!9j2^H#`|21A%F0(abHE?rP^+&&dOyv$f7n-A$p!i`LU=h|6jedLw5EvV ze`W+LS4B&+L`=ROASw&sZN2<}%O6v}Ys!t9o>I;_x6t;IJt@?k?w?{L-VttpTb^)q zW`5p+*v-#nGAtM$8YUYa5An{feu94dMNkOMf$|$;w??L%lszZL4=@cDXaw&3CfjiK zR49Rxe|csO;CHvxV@#7BUFjt|czYdg8=Ihxtwn#*qcpq+)yKSfY3*-J`*~!6Sy#*N zby5Jt3b*zY|KB`4FH}NJ%WHgJ|1lTX=ga)q4rh=#AIcuGC!P0Fi>Ka^x~<-KFYDghn}lt$VU}rONeY zR+to_YR%#Z3)aToDM5YKzxR0*Gd@D6jf_bXi!&#_&_hI{OA07&zDsw>p4`(&?EC|> ze~bUoZ+z#A|5MzbCayC^bYavh?GUgw^9b*HYpdSF@$p-5Wke*863pOiY@9SjG@9cj z66J45jFb78>}LC1iA5#L?{EU=hizB^cC-=xRC>vy=!F%hm0ok#s{3wJ8VjieRZ6un zDUQxNcApTxvQK8XlD-mhz1j1wuZvue}33uAaZ}r&o)@+WvsZn)hAkvcH8ReQN5Fa$AU6F zshvtd5?z3DmKszrpS^O;y58>urb@MP&ieRgpOWo^SFzLsteRBb8p{iSbWD0ge+pHk z@Y9HV5!qiGCIagEs0n`+B-%=831gETqv~8J)%EvQ?JTRBd<-1wDs85mX7m`r#q{Ro zf(pSY`SC#k1a5=wD213q1g(G_Wqa?rhEM;qgyq6=zVQn-YbM!7Pi!XTX%w}Hdio=g z^)cld_C(Ze@Gd*qi5Bxh5}U@he+ml3WNTvXUCFFz+DQPJ)y1eOwOIBu&90&4%0AV@ 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 delta 6876 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

2DRvIGgz_JRZCj&|dgizjpj^Z%ok z(m5aMj*F;*dZiIg#S%J1=co9aQcv~j(9QP&ExsmZboe!U40$vV_Aw8L`M7+B>Y@9e z&FrxsBYNuxbHW;)M0jeEe>Mm4O25^SlYD(Z&|@{d+>6O^>V34!p}ProbMVuQIPq_2 zNiq5YY*0~yuoustNllKoCQx7_ryT@l=Dhv~bO{Og!tV#y=ue{L5JMVD(YaU#hh z3~>v;GXjtZb12~um0Ky6Ks&Z&j7LW!Z9kD6WaEX`$zz!H3B6PBcQv0A)*;oy^c^QW zm%y5VrY1`mlONiq`c&e(A6<`6yPHf1TjGz#kpP8wtVM)7B%y z0E#NB%zt2$Xkf;T8ifYc({FUcWD{p15KZgSQOugYc_Zg!N+shRL;r|LeAH-%PmD>Y z|2vRXHU<6RSffX)g=eZOXmVl98>Ghbt!=5^1Pmc-W%;8&UM1 z=A^IGe|}@-zlD4_+{dsEdt*$_(X2!^a+@gjT+Oon#~J2gCZ(J>5j3dU(T(SgRNC06Y>Kxw zHPzCkr!wZ%<&0Ie+hCz1W3~P#e{S0)whp#S0YFrnbNT2Oz`1+h^}Ml`asujCKZzTf$q;#CH*yw z#!FlbFIeIs&~o&2_`ib24@J6^#_>zy_G-fgk*%&heYc=znk2hBU<8mr7$r{ejgQY< z_sxMXEsE!d(*fSDZ5{l1*(2+S?aoyclv38}eH`GQj*8%<3k|d$DA7o z4lzn1hVvV`h5AAAWM7!ECv}w-J;@jazqPs1HLz^sB35(x_C}I=38s3fzdKB6d%aJIKFe-Q8+#urykB!v9hd= zBB5dM;lA1(E1N6D4lIim^PA4hu&B~;*0s17fswYMY2SV|5mSP zt3t!KE;L!;o+|j#Q6TnrP&-CGniN!BszHhpF}4iHO<~_xVJsCp8_|wHS5DEf!LEq!BSe`Nv=7=0SGofd+op92u%q+jZkA!vbS4Gd;;ii{Z5SA4M6mk1Z|a_uBT@si+RkUzLuEBogrqvULvxrcC;CAT$Ex%e ztRJ?p+{82FSLkFF>46OLf5PjLDU1aJcE)4cXj2eBPP^e@lA}X4f zN9|Ll%TlfocP2GAM+00025i$%Qv diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.12-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.12-compact.zip index c72629231a104fb261b14668088a959ca8ac3876..11e9f5c76912eceddbba4a1cba15d3ddb2c1778b 100644 GIT binary patch delta 8381 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

T< zN^01@9nPwlOVZ0ie~`GKxzB;s&ZZ_zL8MQY`EluJ!slecG;TE$;HhExS9?2=G`d=A zfmx^LQdG}bVg{ee(dM;kA%>`j%Q}9aIQ~576K0})*y8{vBdLQ)?i_U<+DyFo>zpSi zqO0%dA_PG98{UYE_F?sexhc(?LN$(;We0t9|5M~$|7(AYfB3!QKkwgGa>+C;U{gNw zY)L1M6Q{fAPZ}%+z4-g|rE9l?01p=cI;gOIPN1E{)rD$`L0Qd)1n|a;LM_@CaY1)d z6Szn3yE2h+_}9{KV7R%ZC7>3LL_<-O8thNpM#m>!=MrA zHrKvcwNfsIB+z^+k;m1(*Qb;pJ;g0vk9N5Fqc1dt-h(`j#eR{>7$}uo?g61hUiBld zwhbdAS`}UtgA{QNN1ZmI)QeeIJH8qPQbRPVh~A{&~L?$5AaK+{fp_O{BN`eRD)Z~BNcMlUFlsH zOVzvle;6ILdI(d6OyI6;2Gi%;7Wi!igN#E%Y_}S*) zJ_PRUwY#m!qXw9GE{yH&N7F!#n2}MZGoPAJr65rRGPz-#*Mau-I&fupoEQ>|2QQA~~Pa)bz7NZf=Y=u>?FL=bMA zOa7L*yo5d9tK}bZ@k4{Slg~blMY)!;U1n4c^$O1z>6g4$h}btpZ!@WSu_NHZM~-TQ zP7VvS!;YEGmdm!J(-o;1$1F4JdW3(Fe?r&qUV0Agin#qhy!z2eIE72qB#J$31`d89!uSuM;y&bxWyov6n%Jh8&>zy-C(dM&2$YyB9LFEjF2 z>7qIDa;<19WDJcXN;?xIiv>LFms9=5$A)Pfbx5>jJfDw2az$;Hu~3<%dUo9BAferN zJtuYWhV+vTxI@Q6#(0#ZYM_*ZZrGl=dzXk=^6VmpLtwy(F4$1LG|AiEe+&hh{_1)l z$+?c6iSculk-Wqn6}-WPI~DJ}QZe?sjP*-5MM;+358&iIU{HINmsG;Nv8}Xd@^7o| zN_$hpGwq;#lR+#o+|4Y_WJl=_nEd-SVJLHQRxjw>Ok2-TD=dNV1zyA*JwSQi6*4)) zm~KUSa@+Q%A?jIW2(IZne^kou%9PfZl4;?$mg9`ixoh4G>EXZPz?hE^Bay4GsJ*0b zB;^R;AJ?r7vuMZ;#H^Tc?wdQuwUby0l;aJ@vYR@NfU1HZ6HiBN|8i>yBoNxrK+afH z_O6}-3g7D~;-iALDL|QS*t!DQ14x`g|MMc7rcg@(0zU&k00ICG5CErxC09C&OC4Px T003kH0h8kzO$MbP00000_D@JE delta 6874 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�^)Dj4cI?#gjQfSIgHf zBH5nXgUS%^M)1koqrpfUdwBs1$fR@0>zhzwt!R#*4~e=0<291MPZ)mYVT{2COpO{S^e|1}r;im8%Xw8U3VOwQ#Or0sWw=a|pJK`)$`E zI(oK=1+v?DoHQ#-r^RR#mYq|nSEyG{I^ib8qDe@k$waaOe{4pye-VFt&Lo^MUBUG# zNBzVJs6+VF362W}&^a7C+WjGct&r4vD!C>1a-2YSq--f9t{}lUD&C~I2uwbmEgW65 zoZ5w?;+*PK{!uhN2MzEZ)BI62+jj1_m#>h4Y;;Qo`#B()^Nyf*Z@X-XRZ1n16Kf7J z@KSh+04-S$H0Y|lQsgbTwF&|!M4CzZPB-qbK`P41Wt?Y(V3vpxG|5KY^8Lo9NQWxA z5YoXtX|2rZ4UE&v{Rr?9P)h*%WA`5;XO^BMpE F000Z;YR3Qo diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.14-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.14-compact.zip index e36f5b94e5e637d30c007a838d1973a3a475b88e..fcb0fd1f45962d39dcf8be4b010550efca795f17 100644 GIT binary patch delta 8433 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 T002w_0h0zBO$ON@00000;gfrz delta 6903 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 diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.15-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.15-compact.zip index 1023ab1d451e7a788da134fe9f6f28db15da28bc..2050e256abc724b188f0f6edbd200ca617362366 100644 GIT binary patch delta 8434 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 diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.4-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.4-compact.zip index 5ecf2b037a0580e075113579ca1b9152131a8eb1..d31650594ca8b604757ce2c0b3d26b27eb30d257 100644 GIT binary patch delta 8082 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 delta 6699 zcmV+`8r0?HKY=wEP)h>@KL7#%4gej$4^`ETJJQP;007;`kr-KjG9R(pgvZ?IedlGw z_-vSe8p2>b(e=VHZU?onRCG<1uDSSR*65{(?CYeVHFGxLX3?0+wIBhfDrk-^+s}#f z0)~(L7Lam=Gi;pxOMm)Yf)E1?FJAZ!XHl-*$)YY)HG2s*3K2wOK+~+Y){fBt(-dz0 z5Jgn#-kCTDg-5`D%wu|0y3-Gu=Rh!i67KOoygvlzuU2Fx?b4IFrp3@#_C}n*4j|>L ztGKyLfI!;T7`PaExzEw|MAP3XCDMrpp){i+x+ztdnErZVOJ{%OTZW8tGqLyD&QI&) zl@5;`tc|c#OyoK?Ob{_)!6CX?V*rM{(3&%o^&NhGUBgX(0dT4U8;NdwEbEE1M2gy^ zuSH9@OQ>d=@E!Vgd%IgGny0c_8GACFR{NY2PQ|Eg10pVulMH(z2%opz{Dm|-p;*UO zF@AB}5dP?`Wx`|(zQkiv-9C?a4?lpze`(uR{YeS-$ELYkYvikYCS;T~Et|8O2qA<; z+Uz1Z9n*<_!)$^T*e_0srU`w=e&z-V&`W4D00<({el5nl}Uy_f|Irm~HQF}kj%X>h#Aqx??F!nc_* zE(%LkYb1t*iR8Gq_$q~&W`9MbXgj17rA$%bU!2K*PGkD72mUpS=O#VDE6n;<`Y`~6 z*L1@U_9TQY427pCy6Inv-&`d#p>`OQZ$`yB5*i*BT((C= zl`HxtC+_>y3b74IoS9itvgiqvCKNp{?z#k6sbYZ|OL%6{Xh|p29~1GVECh$%GB>FB^N#jsI~{=^!PnL?ptmB^2~K_%SJH9g$@xrGZc> zs2uwc(s9;UFOWIoq4D5AxJkAmZBctAyM`7&_|W+6OdhqBLdov0LRf>lG#QnD2gDwN z7?i^MyT_QJ1AhCo_SMw}-Fr#z{crGA4GOy!K1;`>JCVkIfrWL|9;{Hx7|a$0zlx2# zDvfpTp+%=f8*|^g6au$4YQA>(F`rKOiWa+tX&HLHH9xshg~V0?1l?g@p%E9pK6tzc z(y~Br>6NHm*KNR9<7k+dC%V9YaY%H$WaNFs3awJZg~U(bv_5_d3asU(sV6aHcp64~ z%?PE&*tpaGh#2n#Qu`Zvfx|B&RuRvBiE9;sm?|pAAleXnwWcU6J#MjOfZYMzD0tb( z1|Mk&_#Vw)5?a-yn!;SjeC~$%Y}!qN3{;_qQ<|W>7WPsHP;tenQ=vk`efwS2!niCYV^T>g+dZk4JD!&j&qa(b3Ged5 z0Uxd=QwOo)0X7IvkYt#D9g=_4la9cylqn9&BLjOcInbp*Bt={2}C4Fa#SAu)^OWvosAP&lNRkDb(^{u16YJ=8=asfa= zCN2twAU$oKfC&*T2pgDxGaGKnM}O{D84om0tEXXJp_7VN15l~ElR$3BF>k3ydgFb&DMCx+{zUd7(gJDrhLK@SoUXEL!qI6A@~31W)}N5dCMCm~ zjFa#(@${s!uZjjWBBkW2pV}<=wd_Rm1+RQEHpruL>ucYCDAQP3{*hp}M$=9l|7$iU zj=;b=RLuL&x*AFR;Rf%a?W;D|?Cy25DE!uYHy+u;-)U2qmw5QFTTPHB<)x?Rs)vyG z8JiH1l=Tj13E=1m91|~8S1b3nmSz_cB9iDKrKT)vd759a03@4?bfW#e?28KN6c~z4 z30vqDBU6)qQJMyCLvfQYfAGo$PQb{S=yKT#bVRIPCrmN_BWesLO!sJLMA6A4!pyy9 z+(tIm?sLy}F@vgb%EF3LB%Sz{v3-Eqxr@G!%E;4prAm0s_~&+WQ`TwYR7_n~={hFi zRFI1V0wV9B{_U+(3u41tmk}pu{%H@i^&rKW+PRN^h26vUoPTza4Ox;VC8_Is$YB4m z7oMGKzP4$L0ZlQyi`Bv3TeOXR-w!^UaFYUt?@{+Il^4k1s43tn2qXDLCd-uM_R zoAa#Vtdro`f@#oGV<9|we4Htr4=62|Ior^N?w?F$x^qcA98A<$#|~zd;48_O!QQBUkCX|Ql}B(-Gks6iF(>>s6c#lr0k0tc z2>H9E=BJov${SSsYRRsKEJ`9(wrqELDB;g<)_qghLX^?ZGM~W?RtEKcI%D^`a$n6^ zEm{G4QX|Gmb~&N!*LMtZRvC{_7l81ybWzViN{PsiQ-ix1+3&-!2tJ{v1A0y_=t>-Zn z)+GzJHZ^{6ucGh)`i~!WH!PGLCKZxnK{kiSe*0kO;Z@I|f*%`sYIv#=xf!_z)b*^N zUMS76G60>%;QAXf<3mO9L+Z4VTd074$A$8cY)sD9ldX-kVBns0z>N3Ta)C9*aUSvi z16Nki8FxHANpha*?Fa(+THn*A+m;5LN(fdn^FqgfKY(iE{8DP)sr2HD7|QM;wC4F0 zJe|O1apm1}78d5&$`F^sVY!ZGRr;b7HNds#vs;C@2=`%ZlVxXvG1RTI8;%@*;t#M= z{$9P7Ut;x!YW$041>y4xo9PZ8!CZN0eLr;*Fyc~|F(AUJ{9y^hGh!rKsW9!>w}HoS7s%Df{T@c8tIwCFVuE;?zS7+-sQK`*4PI*(~BfGyZw5O z*MHL;WAYweja$3KA^n5*wNql&__Q$#zIA|dcV@_g`HnoK+cHCwUpn4ZC^y~rTybEh z9W!6PwCIz{P(?rHjb=#TW+1w?Kb*oYX{#oc34&O&0?Q?UR=@eLrxZ7TboZl|tU(9$ zeI*!I5YYDws*#eHStWbGvLZr^(hOK#)Rs$UOLampM5Wf^K~S|JOc&QiKX;SD>3_W& z5<3qO(i*Ns6D@)UR5rmP1L+W5vT(h40SNjQF|2iMQ#YEdCwOCE6QqTKZu}0``Tq4^ z+Lt|iIMR|sta_KjmQTL(1g-DkP_eC?Ly}Y1odoy(mn++7eL06*ck%L>6d$M3e6@1CxNo z(x+nz6Zu6>-E)w43{X@GEPTiAb`nd|KmvMWvItdg($!VS4%JS7KKPI>$T}z;`>3$U z4M#v2pHp7RW@%`qtp1Yi)(uD4h*lD2+(u8Zzq~Gs{|FE;&ZrN=zq%G*beBHZSw-+9PQ#ge z1zl|<1j|!Yo&vXj`r!dBPkW#dm#!g!k5jPx?hoPM~>YBr}?pM z;z?@nwTzl;u4`;$PcyRxyY1AD;K)X8B8bS_%oliqBuW&OK@Kd7@E>IS+yy|Gu`i6s zdztqO?q~b7k{`*iW2db&L|g%TQ;x zX+PJPWQ%je1tF+$=i?HEMbzU2w3iFSq&A1uqg_cM5fz+l^+@6A6vUJP(X>v~=x(GE z$JGuX81mAOmlnaPwuK9+SMKA4BXVegAf`4rc3fGMJi4BhS*8^~T(JNr1c)sB;^?Xo z%<=G855<^&EqGaJuwA2RZZoSJNHixSorEcCU(dZb%+ks6ZvUS(tVBNvktIR2w9dEA zqGkRUe;DcE5=D|`<*XH{J6oPT$%vLxd-(YIPBIhjU&FI_5I2L(~lYvE|dH!2E&R z8zMU_3;gPS0IRm);t88bNlSQ#0k1JFlZOJ5*fzq9*{|Oeb-PAK$-ezu3HCHV-#bJX z!#JG9iQtR0l15q`mM3)~!KN29YJrgJW*{&=O3t@x8x4P*hOjy9Uz5WF3p0DQ$tyZa zr9&ov!}3Hj3${dpw*2`$eG1FU^0BAac4x@~6wKr~qk04A5rvrCeHN+nxZ}daKr4e0 zQXH~DY&cHx<(z@8QW+&FVq%4xNq@^)Qj>5-ZAFD-wHdX0*j81Y>vS!^GJ`h1uxZta zDG(zv^B5aTxv~H6ElH@;Pe82-3lE+R0?2! z*3@!J{pS#RjqX8-!^phDlrW~~wrvOw2MAUu%Ua)4vMBi8Jq@&>1_TILL49r}GQxcW z0fG&!&D>(JMWF?Rnm!P*0MN^{R&aea@KWzyqzM#2J#JO-{i85_Kn#GeC_;9faaeg! z$G7OK1x1@&do)LXd^oLE;$wpOwfC6yf}McxT{lm`sm)M8IJRzrzUF9j(!ax&draIY=QIPh3NE}NG z`!^gUYiQk|LsNe&P6#rK!8gFs*K~?P2flABFw>q$3B>n(j5Yi17%)!OKwt!e2aSqI zf}h|RBHf92�_+*>%wDr&Zv96WNyp+$P{uiTV<1k!o zJR#`?jtm0SJJSI&Z7(=agR)w#Xn*V^+8nbZm-~r?4d>@V58i3N@Rm1v6*g7u+{?{6 z_VSTJ3DQ?{PX7QxXA|i<;m22c`p*+dT?8+NTy-p@wt=ukKbeGDyGmt$UrZx63zOE! zVUnIk^JTg}>Z>}A?RRQUu=nyd0Ux}QMd%$x zn3}!46R~4|LR+7DyYk+D@X@^Tc@pI&!^u~qk9Gi@LoRtS%+IDojp+^^y~$FUj2^!) zK)r3nCPIu%ubypPZ4&PPL+I&QFV#M6DujQ~hZTAw9RJ}@ov$|DbN4tdH?gqW6@#G1 z20c-cv`v!QdYRC_U>9cDC$2GInIBx9mamCjuAEyEKSH9iO-!DD*vtvZuZ)cxYp%i} z6EYF`kKC>VyB(1G9*jv@lqmv0!AwkcjSmMkzzU9caH4_Y9XW1Z&9`$0ZJDBP_16If zZgUyM%K=Qq3@KezCf%tTOHF%mQJCbxj*%{V0*TlRkz?{u=ufTd0%mWhc&|iM#lViH z=JQ3PnBIYWJt3igf;PbnP9?ntq1IhL7P8pY6m01?n8yxw!~}ADWO&k2mW?laZuO%;P|dV4e#6{@=91ZO zes)By`SsR+?P>2;@o9{Vvq|uXa5}dtrZgO=p^}von%%C(fS6EN{cUw6yb8mnwRB8z z+2zNcEoKvubb&Pzt6KASlvSI%bdn@=N4oG4(fB2=^N z(RIRqAbFU>+|vfFp^aRjaV|yK;B<&l)>VdW=6beu(M|rEw{;ub=dYyPtXVSC8Tb#VV=l6#Vh?#K2^wNPS`2L@iiulSt;R-3&?J_)}GjEu+^#K)bUMGKpBMeUL# z4cSRuvjaqC(dhdU<#0?-EUm(86ktz>Y!%Mna=X)dU?nK4?=mfWtlG3!1k3R101uKm z8@TuS*2AvM+wo=d3BCG4r?*J|BNO|7fn#p?l%NeGxHgk{y!oSVPt=vo72K?HkpWAw zqBI8cZVVW{p_1~1%7df%&SqU(T)4J}__9%?x-?8{l2VCKTbpp(F3^K^G`$>yhuKzBK^Z9xFU4sXIoTcXj^9?M}}Qdvi?SnC>8+;-=jXtfnH!LQ&XP+}Cz z^b*woE{O?TI9=IlzD0`AZJ|(#wuU-FYKk&HqkSU%9knT6)|LtWYykso6zmtHLrWmygAw zXt0WhHkuyBALbJ-d7e3c6S!20b$?8EDN#|)rdG2yY*7}2@FN_?kJw?W)!s*S#vWUx zZ&wl`zE;`KJ5fdTB6I#PPG6vDvcJsyPXqZ&S3&VQTD5Jy(_ivHb_|le|M$9|?odks z0zU&k00ICG03E*%Rn?6<(#shD0Nuv`04e|g00000000000Du9Lq8~m66B+;j007FA B_9_4X diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.5-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.5-compact.zip index 357554c09b7ecd8eb677f0f235c36a6942571751..a5551ea0946a88a0436d0630601a326dd204ef28 100644 GIT binary patch delta 8150 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 delta 6699 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 DLBQsn delta 6706 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 I8UO$Q0PtJ)_W%F@ diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.7-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.7-compact.zip index 51828bce7f7ce019e01f805587051bafd85e344e..95f411a302a4cd64fad7edab9931aed31b20412a 100644 GIT binary patch delta 8113 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 LP6nMH00000l}Ed+ delta 6673 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 delta 6900 zcmV@KL7#%4ges(4^`!zK%bx*006(s0FfD3e=;Aj+Jwj4=zZs9 z#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY*}Vi0td6p*3?h;AYX7%C#T?rz&WUE!)qD z^8$vC{1%XMhBIuO{!4%QQJoSvlnW{R7ueiuZKocgO~P_I+d}B&P44` z*D=#TE++nOhKK9;e??Xef<@BL#Af3Kq5uSe=ViO3Xp>P3ewYO!LepOErKYkd>7?1I zl=bJOc5wFEtpA(Lc#^Sf)NUSi173cQipiLSNM)|MM zZ)Lx(BtFw^f+l9HFi1^NOWGlh-)SDn_%J-A3j$JoV5#j^e?i>e!MD1~h=o@*2pq0f z@p??d=FM{U%BT7h4te6M@5W{SxPAdM`iWKPDn_O{oOj76Zo3ud`uR2;YVDCBo%3vB zmmHfa36s{R5dy`C5+GQXIXElq3|hT}&>cgEc>esZ#@(kYAWd3=+TVqR-c$mTeMmm4 zTw}Q8`O5>0f0a^3xsDt}rx+lAVaYc-+j&&4<5&0-X_sQ9YXxL8h2mKX{q%%(`^B`8 z9qBPQ6E#t;z-56Dq^0h1`HiPH&sSMO8>Z{B&$4Qad}SgG=tGMNIA?nx4zBpp3j-^%I}9wBIQw2qiBxp!O~`K-J*n);=&!B4adb6;~gFb zdl}@+s^4Z?r_KyLdg&H0Ou#0|J_yas=LZ6D`8Im$Uw_i1mXk(Gl&24(Ck5EZe%xf9 z*ag#>e?T&_!=l6?W4ugl(j9Mb>W&Vz_tfxl_#*J*WtBH`gn2)6Kfs8_p-MYYOSo$1 zw+g!jSLU6Cp*Tpw7jKz+71=Jvu?@#$q&Kk-x%iN~_JyUWfeEjwMDvyxd2ER8Uaf+l zht}8{n{T;&W~-h0>cEbm`w%W=Aa|7>_fu!jf3e_-I)x(}yn*<6;h{~v|1}wlO7@V= z!QWhIvxtUsV$V3;9zaW}254^y8>^t+rNbtottzNdkGOGtb~hl#GVr$i)q;y*h?=sY zPPT6%w(CjPHVW@}G47PUC4L3t2yn|W4n{P(u%g6d^k+hrYBT(>>$&S^%JaIb!Qn=*sgT3oNCWZ2dJY}^6F`?;bRTOEeX zwV1N@otXz0fYmE_P_(;2n1IgvjRRaYe*rJz*G;mTfhqCY(scq-WK8&tJ)23HhQR$* z{;NPx;Hxo%_pE=}3cB0Xd@}reS1;?-z2+^vPe9@p0^5#wK$&;JkiffQgXn@6bQ_9A z`=((WcV+fk#r%=rOEPM-)1|UeYb6Cy|3)ft+TcUj`;DtB^!J(-OHj6Ldgmi*e--%z zMLsbbP3xw|=et^~3Al``5c{`BV2czV|C2{K$1+&4?#{XO?KI2};#;^e@Fbkht5^Nl z=aI@ToK)Fg`;)9aq~m2B#-jif1HH9RIr^MAosfk~PtslE$z$>7R1a<| z*7)2=QNnfyw#sBIx3o`3T@vJ!U!JPcQs3(x!DsqNmb%0A+?KlYgMz|IP=D`l4Sf^a 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 diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.9-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.9-compact.zip index 17e75201852bd073a1beed505d96dd2903106cfb..f407956184a49c87c554bf5c509821b5b6f22d15 100644 GIT binary patch delta 8391 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 delta 6904 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 diff --git a/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol b/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol index 4e1e388fb1..e638b8d41c 100644 --- a/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol +++ b/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol @@ -8,13 +8,19 @@ struct St{ uint v; } +uint256 constant MAX = 5; + error ErrorSimple(); error ErrorWithArgs(uint, uint); error ErrorWithStruct(St s); +error ErrorWithConst(uint256[MAX]); contract VendingMachine is I { + uint256 constant CMAX = 10; + error CErrorWithConst(uint256[CMAX]); + function err0() public { revert ErrorSimple(); } @@ -32,6 +38,14 @@ contract VendingMachine is I { function err4() public { revert ErrorWithEnum(SomeEnum.ONE); } + function err5(uint256[MAX] calldata a) public { + revert ErrorWithConst(a); + } + function err6(uint256[CMAX] calldata a) public { + revert CErrorWithConst(a); + } + + } contract A{ diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" From f1f4e5b4a5539e29cf2a52771753b719ec328253 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Tue, 12 Sep 2023 00:01:33 +0200 Subject: [PATCH 141/169] Add detailed assert info for echidna (#2105) Add assert span info to echidna printer --- slither/printers/guidance/echidna.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/slither/printers/guidance/echidna.py b/slither/printers/guidance/echidna.py index 25e0968cdb..73a9c5619d 100644 --- a/slither/printers/guidance/echidna.py +++ b/slither/printers/guidance/echidna.py @@ -126,15 +126,24 @@ def _extract_constant_functions(slither: SlitherCore) -> Dict[str, List[str]]: return ret -def _extract_assert(slither: SlitherCore) -> Dict[str, List[str]]: - ret: Dict[str, List[str]] = {} +def _extract_assert(slither: SlitherCore) -> Dict[str, Dict[str, List[Dict]]]: + """ + Return the list of contract -> function name -> List(source mapping of the assert)) + + Args: + slither: + + Returns: + + """ + ret: Dict[str, Dict[str, List[Dict]]] = {} for contract in slither.contracts: - functions_using_assert = [] + functions_using_assert: Dict[str, List[Dict]] = defaultdict(list) for f in contract.functions_entry_points: - for v in f.all_solidity_calls(): - if v == SolidityFunction("assert(bool)"): - functions_using_assert.append(_get_name(f)) - break + for node in f.all_nodes(): + if SolidityFunction("assert(bool)") in node.solidity_calls and node.source_mapping: + func_name = _get_name(f) + functions_using_assert[func_name].append(node.source_mapping.to_json()) if functions_using_assert: ret[contract.name] = functions_using_assert return ret From cc9e65fe13f7219cb5e24799287194c0da85b7e4 Mon Sep 17 00:00:00 2001 From: Kevin Clancy Date: Tue, 12 Sep 2023 06:44:48 -0700 Subject: [PATCH 142/169] fix: reorder named arguments to match declaration order (#1949) Store names list in call operations and expressions. Reorder named arguments to match declaration order. A function call with explicitly named parameters, of the form f({argName1: arg1, ...}), may list the parameters in an order different from that of the function's declaration. In this case, the IR should reorder the arguments to match the function declaration order before generating IR. This PR implements named argument reordering for the following forms of function calls: - struct constructors (most important) - static internal calls For the following forms of function calls, the order of the declaration arguments is not directly available during IR generation, so the PR did not implement reordering for them: - external calls (HighLevelCall) - library calls - event calls The get_declared_param_names function returns None for these unimplemented call forms. --- slither/core/expressions/call_expression.py | 37 +++++++- slither/slithir/convert.py | 91 ++++++++++++++++++- slither/slithir/operations/call.py | 18 +++- slither/slithir/operations/high_level_call.py | 9 +- slither/slithir/operations/internal_call.py | 10 +- slither/slithir/operations/new_contract.py | 13 ++- slither/slithir/operations/new_structure.py | 11 ++- slither/slithir/tmp_operations/tmp_call.py | 19 +++- slither/slithir/utils/ssa.py | 15 ++- .../expressions/expression_parsing.py | 3 +- .../visitors/slithir/expression_to_slithir.py | 8 +- tests/unit/slithir/test_argument_reorder.py | 65 +++++++++++++ .../test_internal_call_reorder.sol | 8 ++ .../test_struct_constructor.sol | 11 +++ 14 files changed, 298 insertions(+), 20 deletions(-) create mode 100644 tests/unit/slithir/test_argument_reorder.py create mode 100644 tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol create mode 100644 tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol diff --git a/slither/core/expressions/call_expression.py b/slither/core/expressions/call_expression.py index 6708dda7e2..ec2b2cfceb 100644 --- a/slither/core/expressions/call_expression.py +++ b/slither/core/expressions/call_expression.py @@ -4,12 +4,32 @@ class CallExpression(Expression): # pylint: disable=too-many-instance-attributes - def __init__(self, called: Expression, arguments: List[Any], type_call: str) -> None: + def __init__( + self, + called: Expression, + arguments: List[Any], + type_call: str, + names: Optional[List[str]] = None, + ) -> None: + """ + #### Parameters + called - + The expression denoting the function to be called + arguments - + List of argument expressions + type_call - + A string formatting of the called function's return type + names - + For calls with named fields, list fields in call order. + For calls without named fields, None. + """ assert isinstance(called, Expression) + assert (names is None) or isinstance(names, list) super().__init__() self._called: Expression = called self._arguments: List[Expression] = arguments self._type_call: str = type_call + self._names: Optional[List[str]] = names # gas and value are only available if the syntax is {gas: , value: } # For the .gas().value(), the member are considered as function call # And converted later to the correct info (convert.py) @@ -17,6 +37,14 @@ def __init__(self, called: Expression, arguments: List[Any], type_call: str) -> self._value: Optional[Expression] = None self._salt: Optional[Expression] = None + @property + def names(self) -> Optional[List[str]]: + """ + For calls with named fields, list fields in call order. + For calls without named fields, None. + """ + return self._names + @property def call_value(self) -> Optional[Expression]: return self._value @@ -62,4 +90,9 @@ def __str__(self) -> str: if gas or value or salt: options = [gas, value, salt] txt += "{" + ",".join([o for o in options if o != ""]) + "}" - return txt + "(" + ",".join([str(a) for a in self._arguments]) + ")" + args = ( + "{" + ",".join([f"{n}:{str(a)}" for (a, n) in zip(self._arguments, self._names)]) + "}" + if self._names is not None + else ",".join([str(a) for a in self._arguments]) + ) + return txt + "(" + args + ")" diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 75900f176f..4cb508fae6 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -385,6 +385,70 @@ def integrate_value_gas(result: List[Operation]) -> List[Operation]: ################################################################################### +def get_declared_param_names( + ins: Union[ + NewStructure, + NewContract, + InternalCall, + LibraryCall, + HighLevelCall, + InternalDynamicCall, + EventCall, + ] +) -> Optional[List[str]]: + """ + Given a call operation, return the list of parameter names, in the order + listed in the function declaration. + #### Parameters + ins - + The call instruction + #### Possible Returns + List[str] - + A list of the parameters in declaration order + None - + Workaround: Unable to obtain list of parameters in declaration order + """ + if isinstance(ins, NewStructure): + return [x.name for x in ins.structure.elems_ordered if not isinstance(x.type, MappingType)] + if isinstance(ins, (InternalCall, LibraryCall, HighLevelCall)): + if isinstance(ins.function, Function): + return [p.name for p in ins.function.parameters] + return None + if isinstance(ins, InternalDynamicCall): + return [p.name for p in ins.function_type.params] + + assert isinstance(ins, (EventCall, NewContract)) + return None + + +def reorder_arguments( + args: List[Variable], call_names: List[str], decl_names: List[str] +) -> List[Variable]: + """ + Reorder named struct constructor arguments so that they match struct declaration ordering rather + than call ordering + E.g. for `struct S { int x; int y; }` we reorder `S({y : 2, x : 3})` to `S(3, 2)` + #### Parameters + args - + Arguments to constructor call, in call order + names - + Parameter names in call order + decl_names - + Parameter names in declaration order + #### Returns + Reordered arguments to constructor call, now in declaration order + """ + assert len(args) == len(call_names) + assert len(call_names) == len(decl_names) + + args_ret = [] + for n in decl_names: + ind = call_names.index(n) + args_ret.append(args[ind]) + + return args_ret + + def propagate_type_and_convert_call(result: List[Operation], node: "Node") -> List[Operation]: """ Propagate the types variables and convert tmp call to real call operation @@ -434,6 +498,23 @@ def propagate_type_and_convert_call(result: List[Operation], node: "Node") -> Li if ins.call_id in calls_gas and isinstance(ins, (HighLevelCall, InternalDynamicCall)): ins.call_gas = calls_gas[ins.call_id] + if isinstance(ins, Call) and (ins.names is not None): + assert isinstance( + ins, + ( + NewStructure, + NewContract, + InternalCall, + LibraryCall, + HighLevelCall, + InternalDynamicCall, + EventCall, + ), + ) + decl_param_names = get_declared_param_names(ins) + if decl_param_names is not None: + call_data = reorder_arguments(call_data, ins.names, decl_param_names) + if isinstance(ins, (Call, NewContract, NewStructure)): # We might have stored some arguments for libraries if ins.arguments: @@ -855,7 +936,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, if isinstance(ins.ori.variable_left, Contract): st = ins.ori.variable_left.get_structure_from_name(ins.ori.variable_right) if st: - op = NewStructure(st, ins.lvalue) + op = NewStructure(st, ins.lvalue, names=ins.names) op.set_expression(ins.expression) op.call_id = ins.call_id return op @@ -892,6 +973,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, ins.nbr_arguments, ins.lvalue, ins.type_call, + names=ins.names, ) libcall.set_expression(ins.expression) libcall.call_id = ins.call_id @@ -950,6 +1032,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, len(lib_func.parameters), ins.lvalue, "d", + names=ins.names, ) lib_call.set_expression(ins.expression) lib_call.set_node(ins.node) @@ -1031,6 +1114,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, ins.nbr_arguments, ins.lvalue, ins.type_call, + names=ins.names, ) msgcall.call_id = ins.call_id @@ -1082,7 +1166,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, return n if isinstance(ins.called, Structure): - op = NewStructure(ins.called, ins.lvalue) + op = NewStructure(ins.called, ins.lvalue, names=ins.names) op.set_expression(ins.expression) op.call_id = ins.call_id op.set_expression(ins.expression) @@ -1106,7 +1190,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, if len(ins.called.constructor.parameters) != ins.nbr_arguments: return Nop() internalcall = InternalCall( - ins.called.constructor, ins.nbr_arguments, ins.lvalue, ins.type_call + ins.called.constructor, ins.nbr_arguments, ins.lvalue, ins.type_call, ins.names ) internalcall.call_id = ins.call_id internalcall.set_expression(ins.expression) @@ -1440,6 +1524,7 @@ def look_for_library_or_top_level( ir.nbr_arguments, ir.lvalue, ir.type_call, + names=ir.names, ) lib_call.set_expression(ir.expression) lib_call.set_node(ir.node) diff --git a/slither/slithir/operations/call.py b/slither/slithir/operations/call.py index 816c56e1d9..a4f9f6d722 100644 --- a/slither/slithir/operations/call.py +++ b/slither/slithir/operations/call.py @@ -6,9 +6,25 @@ class Call(Operation): - def __init__(self) -> None: + def __init__(self, names: Optional[List[str]] = None) -> None: + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + assert (names is None) or isinstance(names, list) super().__init__() self._arguments: List[Variable] = [] + self._names = names + + @property + def names(self) -> Optional[List[str]]: + """ + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + return self._names @property def arguments(self) -> List[Variable]: diff --git a/slither/slithir/operations/high_level_call.py b/slither/slithir/operations/high_level_call.py index 5d654fc800..c60443f199 100644 --- a/slither/slithir/operations/high_level_call.py +++ b/slither/slithir/operations/high_level_call.py @@ -28,11 +28,18 @@ def __init__( nbr_arguments: int, result: Optional[Union[TemporaryVariable, TupleVariable, TemporaryVariableSSA]], type_call: str, + names: Optional[List[str]] = None, ) -> None: + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ assert isinstance(function_name, Constant) assert is_valid_lvalue(result) or result is None self._check_destination(destination) - super().__init__() + super().__init__(names=names) # Contract is only possible for library call, which inherits from highlevelcall self._destination: Union[Variable, SolidityVariable, Contract] = destination # type: ignore self._function_name = function_name diff --git a/slither/slithir/operations/internal_call.py b/slither/slithir/operations/internal_call.py index 1983b885fe..06e75136e6 100644 --- a/slither/slithir/operations/internal_call.py +++ b/slither/slithir/operations/internal_call.py @@ -20,8 +20,16 @@ def __init__( Union[TupleVariableSSA, TemporaryVariableSSA, TupleVariable, TemporaryVariable] ], type_call: str, + names: Optional[List[str]] = None, ) -> None: - super().__init__() + # pylint: disable=too-many-arguments + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + super().__init__(names=names) self._contract_name = "" if isinstance(function, Function): self._function: Optional[Function] = function diff --git a/slither/slithir/operations/new_contract.py b/slither/slithir/operations/new_contract.py index 518a097cb5..9ed00b1ac0 100644 --- a/slither/slithir/operations/new_contract.py +++ b/slither/slithir/operations/new_contract.py @@ -12,11 +12,20 @@ class NewContract(Call, OperationWithLValue): # pylint: disable=too-many-instance-attributes def __init__( - self, contract_name: Constant, lvalue: Union[TemporaryVariableSSA, TemporaryVariable] + self, + contract_name: Constant, + lvalue: Union[TemporaryVariableSSA, TemporaryVariable], + names: Optional[List[str]] = None, ) -> None: + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ assert isinstance(contract_name, Constant) assert is_valid_lvalue(lvalue) - super().__init__() + super().__init__(names=names) self._contract_name = contract_name # todo create analyze to add the contract instance self._lvalue = lvalue diff --git a/slither/slithir/operations/new_structure.py b/slither/slithir/operations/new_structure.py index c50cd6a3e0..2aaba28ff7 100644 --- a/slither/slithir/operations/new_structure.py +++ b/slither/slithir/operations/new_structure.py @@ -1,4 +1,4 @@ -from typing import List, Union +from typing import List, Optional, Union from slither.slithir.operations.call import Call from slither.slithir.operations.lvalue import OperationWithLValue @@ -17,8 +17,15 @@ def __init__( self, structure: StructureContract, lvalue: Union[TemporaryVariableSSA, TemporaryVariable], + names: Optional[List[str]] = None, ) -> None: - super().__init__() + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + super().__init__(names=names) assert isinstance(structure, Structure) assert is_valid_lvalue(lvalue) self._structure = structure diff --git a/slither/slithir/tmp_operations/tmp_call.py b/slither/slithir/tmp_operations/tmp_call.py index 2137ebd819..a7bd614c74 100644 --- a/slither/slithir/tmp_operations/tmp_call.py +++ b/slither/slithir/tmp_operations/tmp_call.py @@ -1,4 +1,4 @@ -from typing import Optional, Union +from typing import List, Optional, Union from slither.core.declarations import ( Event, @@ -25,7 +25,15 @@ def __init__( nbr_arguments: int, result: Union[TupleVariable, TemporaryVariable], type_call: str, + names: Optional[List[str]] = None, ) -> None: + # pylint: disable=too-many-arguments + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ assert isinstance( called, ( @@ -42,6 +50,7 @@ def __init__( self._called = called self._nbr_arguments = nbr_arguments self._type_call = type_call + self._names = names self._lvalue = result self._ori = None # self._callid = None @@ -49,6 +58,14 @@ def __init__( self._value = None self._salt = None + @property + def names(self) -> Optional[List[str]]: + """ + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + return self._names + @property def call_value(self): return self._value diff --git a/slither/slithir/utils/ssa.py b/slither/slithir/utils/ssa.py index 4c958798b4..ef908820eb 100644 --- a/slither/slithir/utils/ssa.py +++ b/slither/slithir/utils/ssa.py @@ -735,12 +735,17 @@ def copy_ir(ir: Operation, *instances) -> Operation: destination = get_variable(ir, lambda x: x.destination, *instances) function_name = ir.function_name nbr_arguments = ir.nbr_arguments + names = ir.names lvalue = get_variable(ir, lambda x: x.lvalue, *instances) type_call = ir.type_call if isinstance(ir, LibraryCall): - new_ir = LibraryCall(destination, function_name, nbr_arguments, lvalue, type_call) + new_ir = LibraryCall( + destination, function_name, nbr_arguments, lvalue, type_call, names=names + ) else: - new_ir = HighLevelCall(destination, function_name, nbr_arguments, lvalue, type_call) + new_ir = HighLevelCall( + destination, function_name, nbr_arguments, lvalue, type_call, names=names + ) new_ir.call_id = ir.call_id new_ir.call_value = get_variable(ir, lambda x: x.call_value, *instances) new_ir.call_gas = get_variable(ir, lambda x: x.call_gas, *instances) @@ -761,7 +766,8 @@ def copy_ir(ir: Operation, *instances) -> Operation: nbr_arguments = ir.nbr_arguments lvalue = get_variable(ir, lambda x: x.lvalue, *instances) type_call = ir.type_call - new_ir = InternalCall(function, nbr_arguments, lvalue, type_call) + names = ir.names + new_ir = InternalCall(function, nbr_arguments, lvalue, type_call, names=names) new_ir.arguments = get_arguments(ir, *instances) return new_ir if isinstance(ir, InternalDynamicCall): @@ -811,7 +817,8 @@ def copy_ir(ir: Operation, *instances) -> Operation: if isinstance(ir, NewStructure): structure = ir.structure lvalue = get_variable(ir, lambda x: x.lvalue, *instances) - new_ir = NewStructure(structure, lvalue) + names = ir.names + new_ir = NewStructure(structure, lvalue, names=names) new_ir.arguments = get_arguments(ir, *instances) return new_ir if isinstance(ir, Nop): diff --git a/slither/solc_parsing/expressions/expression_parsing.py b/slither/solc_parsing/expressions/expression_parsing.py index a0bce044c2..74ff593c70 100644 --- a/slither/solc_parsing/expressions/expression_parsing.py +++ b/slither/solc_parsing/expressions/expression_parsing.py @@ -179,7 +179,8 @@ def parse_call( sp = SuperCallExpression(called, arguments, type_return) sp.set_offset(expression["src"], caller_context.compilation_unit) return sp - call_expression = CallExpression(called, arguments, type_return) + names = expression["names"] if "names" in expression and len(expression["names"]) > 0 else None + call_expression = CallExpression(called, arguments, type_return, names=names) call_expression.set_offset(src, caller_context.compilation_unit) # Only available if the syntax {gas:, value:} was used diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 9aca7f10cc..534b157c34 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -312,7 +312,9 @@ def _post_call_expression(self, expression: CallExpression) -> None: val = TupleVariable(self._node) else: val = TemporaryVariable(self._node) - internal_call = InternalCall(called, len(args), val, expression.type_call) + internal_call = InternalCall( + called, len(args), val, expression.type_call, names=expression.names + ) internal_call.set_expression(expression) self._result.append(internal_call) set_val(expression, val) @@ -381,7 +383,9 @@ def _post_call_expression(self, expression: CallExpression) -> None: else: val = TemporaryVariable(self._node) - message_call = TmpCall(called, len(args), val, expression.type_call) + message_call = TmpCall( + called, len(args), val, expression.type_call, names=expression.names + ) message_call.set_expression(expression) # Gas/value are only accessible here if the syntax {gas: , value: } # Is used over .gas().value() diff --git a/tests/unit/slithir/test_argument_reorder.py b/tests/unit/slithir/test_argument_reorder.py new file mode 100644 index 0000000000..12f5bd7f28 --- /dev/null +++ b/tests/unit/slithir/test_argument_reorder.py @@ -0,0 +1,65 @@ +from pathlib import Path + +from slither import Slither +from slither.slithir.operations.internal_call import InternalCall +from slither.slithir.operations.new_structure import NewStructure +from slither.slithir.variables.constant import Constant + +TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" +ARG_REORDER_TEST_ROOT = Path(TEST_DATA_DIR, "argument_reorder") + + +def test_struct_constructor_reorder(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.15") + slither = Slither( + Path(ARG_REORDER_TEST_ROOT, "test_struct_constructor.sol").as_posix(), solc=solc_path + ) + + operations = slither.contracts[0].functions[0].slithir_operations + constructor_calls = [x for x in operations if isinstance(x, NewStructure)] + assert len(constructor_calls) == 2 + + # Arguments to first call are 2, 3 + assert ( + isinstance(constructor_calls[0].arguments[0], Constant) + and constructor_calls[0].arguments[0].value == 2 + ) + assert ( + isinstance(constructor_calls[0].arguments[1], Constant) + and constructor_calls[0].arguments[1].value == 3 + ) + + # Arguments to second call are 5, 4 (note the reversed order) + assert ( + isinstance(constructor_calls[1].arguments[0], Constant) + and constructor_calls[1].arguments[0].value == 5 + ) + assert ( + isinstance(constructor_calls[1].arguments[1], Constant) + and constructor_calls[1].arguments[1].value == 4 + ) + + +def test_internal_call_reorder(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.15") + slither = Slither( + Path(ARG_REORDER_TEST_ROOT, "test_internal_call_reorder.sol").as_posix(), solc=solc_path + ) + + operations = slither.contracts[0].functions[1].slithir_operations + internal_calls = [x for x in operations if isinstance(x, InternalCall)] + assert len(internal_calls) == 1 + + # Arguments to call are 3, true, 5 + assert ( + isinstance(internal_calls[0].arguments[0], Constant) + and internal_calls[0].arguments[0].value == 3 + ) + assert ( + isinstance(internal_calls[0].arguments[1], Constant) + and internal_calls[0].arguments[1].value is True + ) + assert ( + isinstance(internal_calls[0].arguments[2], Constant) + and internal_calls[0].arguments[2].value == 5 + ) diff --git a/tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol b/tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol new file mode 100644 index 0000000000..4c4f658da8 --- /dev/null +++ b/tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol @@ -0,0 +1,8 @@ +contract InternalCallReorderTest { + function internal_func(uint256 a, bool b, uint256 c) internal { + } + + function caller() external { + internal_func({a: 3, c: 5, b: true}); + } +} diff --git a/tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol b/tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol new file mode 100644 index 0000000000..05dbb50b0f --- /dev/null +++ b/tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol @@ -0,0 +1,11 @@ +contract StructConstructorTest { + struct S { + int x; + int y; + } + + function test() external { + S memory p = S({x: 2, y: 3}); + S memory q = S({y: 4, x: 5}); + } +} From cd000a4eea72f2d5ff33dd919faab8ba59508d5f Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Wed, 13 Sep 2023 09:10:31 -0500 Subject: [PATCH 143/169] add tests --- .../name_resolution/shadowing_compact.sol | 8 ++++ .../shadowing_legacy_post_0_5_0.sol | 8 ++++ .../shadowing_legacy_pre_0_5_0.sol | 8 ++++ tests/unit/core/test_name_resolution.py | 45 +++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 tests/unit/core/test_data/name_resolution/shadowing_compact.sol create mode 100644 tests/unit/core/test_data/name_resolution/shadowing_legacy_post_0_5_0.sol create mode 100644 tests/unit/core/test_data/name_resolution/shadowing_legacy_pre_0_5_0.sol create mode 100644 tests/unit/core/test_name_resolution.py diff --git a/tests/unit/core/test_data/name_resolution/shadowing_compact.sol b/tests/unit/core/test_data/name_resolution/shadowing_compact.sol new file mode 100644 index 0000000000..c96130ae92 --- /dev/null +++ b/tests/unit/core/test_data/name_resolution/shadowing_compact.sol @@ -0,0 +1,8 @@ +pragma solidity 0.8.0; +contract B { + uint public x = 21; + function a() public { + uint u = 2 * x; + uint x; + } +} \ No newline at end of file diff --git a/tests/unit/core/test_data/name_resolution/shadowing_legacy_post_0_5_0.sol b/tests/unit/core/test_data/name_resolution/shadowing_legacy_post_0_5_0.sol new file mode 100644 index 0000000000..4a7e3a47f2 --- /dev/null +++ b/tests/unit/core/test_data/name_resolution/shadowing_legacy_post_0_5_0.sol @@ -0,0 +1,8 @@ +pragma solidity 0.5.0; +contract B { + uint public x = 21; + function a() public { + uint u = 2 * x; + uint x; + } +} \ No newline at end of file diff --git a/tests/unit/core/test_data/name_resolution/shadowing_legacy_pre_0_5_0.sol b/tests/unit/core/test_data/name_resolution/shadowing_legacy_pre_0_5_0.sol new file mode 100644 index 0000000000..e523fd2fdd --- /dev/null +++ b/tests/unit/core/test_data/name_resolution/shadowing_legacy_pre_0_5_0.sol @@ -0,0 +1,8 @@ +pragma solidity 0.4.12; +contract B { + uint public x = 21; + function a() public { + uint u = 2 * x; + uint x; + } +} diff --git a/tests/unit/core/test_name_resolution.py b/tests/unit/core/test_name_resolution.py new file mode 100644 index 0000000000..8756baaba1 --- /dev/null +++ b/tests/unit/core/test_name_resolution.py @@ -0,0 +1,45 @@ +from pathlib import Path + +from slither import Slither + + +TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" +NAME_RESOLUTION_TEST_ROOT = Path(TEST_DATA_DIR, "name_resolution") + + +def _sort_references_lines(refs: list) -> list: + return sorted([ref.lines[0] for ref in refs]) + + +def test_name_resolution_compact(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.0") + slither = Slither( + Path(NAME_RESOLUTION_TEST_ROOT, "shadowing_compact.sol").as_posix(), solc=solc_path + ) + contract = slither.get_contract_from_name("B")[0] + x = contract.get_state_variable_from_name("x") + assert _sort_references_lines(x.references) == [5] + + +def test_name_resolution_legacy_post_0_5_0(solc_binary_path) -> None: + solc_path = solc_binary_path("0.5.0") + slither = Slither( + Path(NAME_RESOLUTION_TEST_ROOT, "shadowing_legacy_post_0_5_0.sol").as_posix(), + solc=solc_path, + ) + contract = slither.get_contract_from_name("B")[0] + x = contract.get_state_variable_from_name("x") + assert _sort_references_lines(x.references) == [5] + + +def test_name_resolution_legacy_pre_0_5_0(solc_binary_path) -> None: + solc_path = solc_binary_path("0.4.12") + slither = Slither( + Path(NAME_RESOLUTION_TEST_ROOT, "shadowing_legacy_pre_0_5_0.sol").as_posix(), + solc=solc_path, + force_legacy=True, + ) + contract = slither.get_contract_from_name("B")[0] + function = contract.get_function_from_signature("a()") + x = function.get_local_variable_from_name("x") + assert _sort_references_lines(x.references) == [5] From 4053c9b9e35949f1293f6d824aafbaed8381f44e Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 15 Sep 2023 11:10:12 +0200 Subject: [PATCH 144/169] minor improvements --- slither/core/variables/__init__.py | 6 + slither/printers/summary/ck.py | 3 +- slither/printers/summary/halstead.py | 3 +- slither/printers/summary/martin.py | 3 +- slither/utils/ck.py | 9 +- slither/utils/encoding.py | 202 +++++++++++++++++++++ slither/utils/halstead.py | 22 ++- slither/utils/martin.py | 12 +- slither/utils/upgradeability.py | 254 ++------------------------- 9 files changed, 252 insertions(+), 262 deletions(-) create mode 100644 slither/utils/encoding.py diff --git a/slither/core/variables/__init__.py b/slither/core/variables/__init__.py index 638f0f3a4e..53872853aa 100644 --- a/slither/core/variables/__init__.py +++ b/slither/core/variables/__init__.py @@ -1,2 +1,8 @@ from .state_variable import StateVariable from .variable import Variable +from .local_variable_init_from_tuple import LocalVariableInitFromTuple +from .local_variable import LocalVariable +from .top_level_variable import TopLevelVariable +from .event_variable import EventVariable +from .function_type_variable import FunctionTypeVariable +from .structure_variable import StructureVariable diff --git a/slither/printers/summary/ck.py b/slither/printers/summary/ck.py index f7a8510391..78da23756b 100644 --- a/slither/printers/summary/ck.py +++ b/slither/printers/summary/ck.py @@ -32,6 +32,7 @@ """ from slither.printers.abstract_printer import AbstractPrinter from slither.utils.ck import CKMetrics +from slither.utils.output import Output class CK(AbstractPrinter): @@ -40,7 +41,7 @@ class CK(AbstractPrinter): WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#ck" - def output(self, _filename): + def output(self, _filename: str) -> Output: if len(self.contracts) == 0: return self.generate_output("No contract found") diff --git a/slither/printers/summary/halstead.py b/slither/printers/summary/halstead.py index 8144e467f7..d3c3557db9 100644 --- a/slither/printers/summary/halstead.py +++ b/slither/printers/summary/halstead.py @@ -25,6 +25,7 @@ """ from slither.printers.abstract_printer import AbstractPrinter from slither.utils.halstead import HalsteadMetrics +from slither.utils.output import Output class Halstead(AbstractPrinter): @@ -33,7 +34,7 @@ class Halstead(AbstractPrinter): WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#halstead" - def output(self, _filename): + def output(self, _filename: str) -> Output: if len(self.contracts) == 0: return self.generate_output("No contract found") diff --git a/slither/printers/summary/martin.py b/slither/printers/summary/martin.py index c49e63fcb5..a0f1bbfcb1 100644 --- a/slither/printers/summary/martin.py +++ b/slither/printers/summary/martin.py @@ -11,6 +11,7 @@ """ from slither.printers.abstract_printer import AbstractPrinter from slither.utils.martin import MartinMetrics +from slither.utils.output import Output class Martin(AbstractPrinter): @@ -19,7 +20,7 @@ class Martin(AbstractPrinter): WIKI = "https://github.com/trailofbits/slither/wiki/Printer-documentation#martin" - def output(self, _filename): + def output(self, _filename: str) -> Output: if len(self.contracts) == 0: return self.generate_output("No contract found") diff --git a/slither/utils/ck.py b/slither/utils/ck.py index 7b0d1afd90..ffba663ad2 100644 --- a/slither/utils/ck.py +++ b/slither/utils/ck.py @@ -110,7 +110,7 @@ class CKContractMetrics: dit: int = 0 cbo: int = 0 - def __post_init__(self): + def __post_init__(self) -> None: if not hasattr(self.contract, "functions"): return self.count_variables() @@ -123,7 +123,7 @@ def __post_init__(self): # pylint: disable=too-many-locals # pylint: disable=too-many-branches - def calculate_metrics(self): + def calculate_metrics(self) -> None: """Calculate the metrics for a contract""" rfc = self.public # initialize with public getter count for func in self.contract.functions: @@ -186,7 +186,7 @@ def calculate_metrics(self): self.ext_calls += len(external_calls) self.rfc = rfc - def count_variables(self): + def count_variables(self) -> None: """Count the number of variables in a contract""" state_variable_count = 0 constant_count = 0 @@ -302,7 +302,7 @@ class CKMetrics: ("Core", "core", CORE_KEYS), ) - def __post_init__(self): + def __post_init__(self) -> None: martin_metrics = MartinMetrics(self.contracts).contract_metrics dependents = { inherited.name: { @@ -323,6 +323,7 @@ def __post_init__(self): for contract in self.contracts } + subtitle = "" # Update each section for (title, attr, keys) in self.SECTIONS: if attr == "core": diff --git a/slither/utils/encoding.py b/slither/utils/encoding.py new file mode 100644 index 0000000000..288b581505 --- /dev/null +++ b/slither/utils/encoding.py @@ -0,0 +1,202 @@ +from typing import Union + +from slither.core import variables +from slither.core.declarations import ( + SolidityVariable, + SolidityVariableComposed, + Structure, + Enum, + Contract, +) +from slither.core import solidity_types +from slither.slithir import operations +from slither.slithir import variables as SlitherIRVariable + + +# pylint: disable=too-many-branches +def ntype(_type: Union[solidity_types.Type, str]) -> str: + if isinstance(_type, solidity_types.ElementaryType): + _type = str(_type) + elif isinstance(_type, solidity_types.ArrayType): + if isinstance(_type.type, solidity_types.ElementaryType): + _type = str(_type) + else: + _type = "user_defined_array" + elif isinstance(_type, Structure): + _type = str(_type) + elif isinstance(_type, Enum): + _type = str(_type) + elif isinstance(_type, solidity_types.MappingType): + _type = str(_type) + elif isinstance(_type, solidity_types.UserDefinedType): + if isinstance(_type.type, Contract): + _type = f"contract({_type.type.name})" + elif isinstance(_type.type, Structure): + _type = f"struct({_type.type.name})" + elif isinstance(_type.type, Enum): + _type = f"enum({_type.type.name})" + else: + _type = str(_type) + + _type = _type.replace(" memory", "") + _type = _type.replace(" storage ref", "") + + if "struct" in _type: + return "struct" + if "enum" in _type: + return "enum" + if "tuple" in _type: + return "tuple" + if "contract" in _type: + return "contract" + if "mapping" in _type: + return "mapping" + return _type.replace(" ", "_") + + +# pylint: disable=too-many-branches +def encode_var_for_compare(var: Union[variables.Variable, SolidityVariable]) -> str: + + # variables + if isinstance(var, SlitherIRVariable.Constant): + return f"constant({ntype(var.type)},{var.value})" + if isinstance(var, SolidityVariableComposed): + return f"solidity_variable_composed({var.name})" + if isinstance(var, SolidityVariable): + return f"solidity_variable{var.name}" + if isinstance(var, SlitherIRVariable.TemporaryVariable): + return "temporary_variable" + if isinstance(var, SlitherIRVariable.ReferenceVariable): + return f"reference({ntype(var.type)})" + if isinstance(var, variables.LocalVariable): + return f"local_solc_variable({ntype(var.type)},{var.location})" + if isinstance(var, variables.StateVariable): + if not (var.is_constant or var.is_immutable): + try: + slot, _ = var.contract.compilation_unit.storage_layout_of(var.contract, var) + except KeyError: + slot = var.name + else: + slot = var.name + return f"state_solc_variable({ntype(var.type)},{slot})" + if isinstance(var, variables.LocalVariableInitFromTuple): + return "local_variable_init_tuple" + if isinstance(var, SlitherIRVariable.TupleVariable): + return "tuple_variable" + + # default + return "" + + +# pylint: disable=too-many-branches +def encode_ir_for_upgradeability_compare(ir: operations.Operation) -> str: + # operations + if isinstance(ir, operations.Assignment): + return f"({encode_var_for_compare(ir.lvalue)}):=({encode_var_for_compare(ir.rvalue)})" + if isinstance(ir, operations.Index): + return f"index({ntype(ir.variable_right.type)})" + if isinstance(ir, operations.Member): + return "member" # .format(ntype(ir._type)) + if isinstance(ir, operations.Length): + return "length" + if isinstance(ir, operations.Binary): + return f"binary({encode_var_for_compare(ir.variable_left)}{ir.type}{encode_var_for_compare(ir.variable_right)})" + if isinstance(ir, operations.Unary): + return f"unary({str(ir.type)})" + if isinstance(ir, operations.Condition): + return f"condition({encode_var_for_compare(ir.value)})" + if isinstance(ir, operations.NewStructure): + return "new_structure" + if isinstance(ir, operations.NewContract): + return "new_contract" + if isinstance(ir, operations.NewArray): + return f"new_array({ntype(ir.array_type)})" + if isinstance(ir, operations.NewElementaryType): + return f"new_elementary({ntype(ir.type)})" + if isinstance(ir, operations.Delete): + return f"delete({encode_var_for_compare(ir.lvalue)},{encode_var_for_compare(ir.variable)})" + if isinstance(ir, operations.SolidityCall): + return f"solidity_call({ir.function.full_name})" + if isinstance(ir, operations.InternalCall): + return f"internal_call({ntype(ir.type_call)})" + if isinstance(ir, operations.EventCall): # is this useful? + return "event" + if isinstance(ir, operations.LibraryCall): + return "library_call" + if isinstance(ir, operations.InternalDynamicCall): + return "internal_dynamic_call" + if isinstance(ir, operations.HighLevelCall): # TODO: improve + return "high_level_call" + if isinstance(ir, operations.LowLevelCall): # TODO: improve + return "low_level_call" + if isinstance(ir, operations.TypeConversion): + return f"type_conversion({ntype(ir.type)})" + if isinstance(ir, operations.Return): # this can be improved using values + return "return" # .format(ntype(ir.type)) + if isinstance(ir, operations.Transfer): + return f"transfer({encode_var_for_compare(ir.call_value)})" + if isinstance(ir, operations.Send): + return f"send({encode_var_for_compare(ir.call_value)})" + if isinstance(ir, operations.Unpack): # TODO: improve + return "unpack" + if isinstance(ir, operations.InitArray): # TODO: improve + return "init_array" + + # default + return "" + + +def encode_ir_for_halstead(ir: operations.Operation) -> str: + # operations + if isinstance(ir, operations.Assignment): + return "assignment" + if isinstance(ir, operations.Index): + return "index" + if isinstance(ir, operations.Member): + return "member" # .format(ntype(ir._type)) + if isinstance(ir, operations.Length): + return "length" + if isinstance(ir, operations.Binary): + return f"binary({str(ir.type)})" + if isinstance(ir, operations.Unary): + return f"unary({str(ir.type)})" + if isinstance(ir, operations.Condition): + return f"condition({encode_var_for_compare(ir.value)})" + if isinstance(ir, operations.NewStructure): + return "new_structure" + if isinstance(ir, operations.NewContract): + return "new_contract" + if isinstance(ir, operations.NewArray): + return f"new_array({ntype(ir.array_type)})" + if isinstance(ir, operations.NewElementaryType): + return f"new_elementary({ntype(ir.type)})" + if isinstance(ir, operations.Delete): + return "delete" + if isinstance(ir, operations.SolidityCall): + return f"solidity_call({ir.function.full_name})" + if isinstance(ir, operations.InternalCall): + return f"internal_call({ntype(ir.type_call)})" + if isinstance(ir, operations.EventCall): # is this useful? + return "event" + if isinstance(ir, operations.LibraryCall): + return "library_call" + if isinstance(ir, operations.InternalDynamicCall): + return "internal_dynamic_call" + if isinstance(ir, operations.HighLevelCall): # TODO: improve + return "high_level_call" + if isinstance(ir, operations.LowLevelCall): # TODO: improve + return "low_level_call" + if isinstance(ir, operations.TypeConversion): + return f"type_conversion({ntype(ir.type)})" + if isinstance(ir, operations.Return): # this can be improved using values + return "return" # .format(ntype(ir.type)) + if isinstance(ir, operations.Transfer): + return "transfer" + if isinstance(ir, operations.Send): + return "send" + if isinstance(ir, operations.Unpack): # TODO: improve + return "unpack" + if isinstance(ir, operations.InitArray): # TODO: improve + return "init_array" + # default + raise NotImplementedError(f"encode_ir_for_halstead: {ir}") diff --git a/slither/utils/halstead.py b/slither/utils/halstead.py index 64dd1f6a1a..9ec952e486 100644 --- a/slither/utils/halstead.py +++ b/slither/utils/halstead.py @@ -25,13 +25,17 @@ """ import math +from collections import OrderedDict from dataclasses import dataclass, field from typing import Tuple, List, Dict -from collections import OrderedDict + from slither.core.declarations import Contract from slither.slithir.variables.temporary import TemporaryVariable +from slither.utils.encoding import encode_ir_for_halstead from slither.utils.myprettytable import make_pretty_table, MyPrettyTable -from slither.utils.upgradeability import encode_ir_for_halstead + + +# pylint: disable=too-many-branches @dataclass @@ -55,7 +59,7 @@ class HalsteadContractMetrics: T: float = 0 B: float = 0 - def __post_init__(self): + def __post_init__(self) -> None: """Operators and operands can be passed in as constructor args to avoid computing them based on the contract. Useful for computing metrics for ALL_CONTRACTS""" @@ -85,7 +89,7 @@ def to_dict(self) -> Dict[str, float]: } ) - def populate_operators_and_operands(self): + def populate_operators_and_operands(self) -> None: """Populate the operators and operands lists.""" operators = [] operands = [] @@ -104,7 +108,7 @@ def populate_operators_and_operands(self): self.all_operators.extend(operators) self.all_operands.extend(operands) - def compute_metrics(self, all_operators=None, all_operands=None): + def compute_metrics(self, all_operators=None, all_operands=None) -> None: """Compute the Halstead metrics.""" if all_operators is None: all_operators = self.all_operators @@ -183,17 +187,17 @@ class HalsteadMetrics: ("Extended 2/2", "extended2", EXTENDED2_KEYS), ) - def __post_init__(self): + def __post_init__(self) -> None: # Compute the metrics for each contract and for all contracts. self.update_contract_metrics() self.add_all_contracts_metrics() self.update_reporting_sections() - def update_contract_metrics(self): + def update_contract_metrics(self) -> None: for contract in self.contracts: self.contract_metrics[contract.name] = HalsteadContractMetrics(contract=contract) - def add_all_contracts_metrics(self): + def add_all_contracts_metrics(self) -> None: # If there are more than 1 contract, compute the metrics for all contracts. if len(self.contracts) <= 1: return @@ -211,7 +215,7 @@ def add_all_contracts_metrics(self): None, all_operators=all_operators, all_operands=all_operands ) - def update_reporting_sections(self): + def update_reporting_sections(self) -> None: # Create the table and text for each section. data = { contract.name: self.contract_metrics[contract.name].to_dict() diff --git a/slither/utils/martin.py b/slither/utils/martin.py index fb62a4c584..c336227fd2 100644 --- a/slither/utils/martin.py +++ b/slither/utils/martin.py @@ -26,12 +26,12 @@ class MartinContractMetrics: i: float = 0.0 d: float = 0.0 - def __post_init__(self): + def __post_init__(self) -> None: if self.ce + self.ca > 0: self.i = float(self.ce / (self.ce + self.ca)) self.d = float(abs(self.i - self.abstractness)) - def to_dict(self): + def to_dict(self) -> Dict: return { "Dependents": self.ca, "Dependencies": self.ce, @@ -65,12 +65,12 @@ class MartinMetrics: ) SECTIONS: Tuple[Tuple[str, str, Tuple[str]]] = (("Core", "core", CORE_KEYS),) - def __post_init__(self): + def __post_init__(self) -> None: self.update_abstractness() self.update_coupling() self.update_reporting_sections() - def update_reporting_sections(self): + def update_reporting_sections(self) -> None: # Create the table and text for each section. data = { contract.name: self.contract_metrics[contract.name].to_dict() @@ -98,7 +98,7 @@ def update_reporting_sections(self): SectionInfo(title=section_title, pretty_table=pretty_table, txt=txt), ) - def update_abstractness(self) -> float: + def update_abstractness(self) -> None: abstract_contract_count = 0 for c in self.contracts: if not c.is_fully_implemented: @@ -106,7 +106,7 @@ def update_abstractness(self) -> float: self.abstractness = float(abstract_contract_count / len(self.contracts)) # pylint: disable=too-many-branches - def update_coupling(self) -> Dict: + def update_coupling(self) -> None: dependencies = {} for contract in self.contracts: external_calls = [] diff --git a/slither/utils/upgradeability.py b/slither/utils/upgradeability.py index 5cc3dba08c..bbb253175e 100644 --- a/slither/utils/upgradeability.py +++ b/slither/utils/upgradeability.py @@ -1,66 +1,28 @@ -from typing import Optional, Tuple, List, Union +from typing import Optional, Tuple, List + +from slither.analyses.data_dependency.data_dependency import get_dependencies +from slither.core.cfg.node import Node, NodeType from slither.core.declarations import ( Contract, - Structure, - Enum, - SolidityVariableComposed, - SolidityVariable, Function, ) -from slither.core.solidity_types import ( - Type, - ElementaryType, - ArrayType, - MappingType, - UserDefinedType, -) -from slither.core.variables.local_variable import LocalVariable -from slither.core.variables.local_variable_init_from_tuple import LocalVariableInitFromTuple -from slither.core.variables.state_variable import StateVariable -from slither.analyses.data_dependency.data_dependency import get_dependencies -from slither.core.variables.variable import Variable from slither.core.expressions import ( Literal, Identifier, CallExpression, AssignmentOperation, ) -from slither.core.cfg.node import Node, NodeType +from slither.core.solidity_types import ( + ElementaryType, +) +from slither.core.variables.local_variable import LocalVariable +from slither.core.variables.state_variable import StateVariable +from slither.core.variables.variable import Variable from slither.slithir.operations import ( - Operation, - Assignment, - Index, - Member, - Length, - Binary, - Unary, - Condition, - NewArray, - NewStructure, - NewContract, - NewElementaryType, - SolidityCall, - Delete, - EventCall, - LibraryCall, - InternalDynamicCall, - HighLevelCall, LowLevelCall, - TypeConversion, - Return, - Transfer, - Send, - Unpack, - InitArray, - InternalCall, -) -from slither.slithir.variables import ( - TemporaryVariable, - TupleVariable, - Constant, - ReferenceVariable, ) from slither.tools.read_storage.read_storage import SlotInfo, SlitherReadStorage +from slither.utils.encoding import encode_ir_for_upgradeability_compare class TaintedExternalContract: @@ -385,201 +347,13 @@ def is_function_modified(f1: Function, f2: Function) -> bool: if len(node_f1.irs) != len(node_f2.irs): return True for i, ir in enumerate(node_f1.irs): - if encode_ir_for_compare(ir) != encode_ir_for_compare(node_f2.irs[i]): + if encode_ir_for_upgradeability_compare(ir) != encode_ir_for_upgradeability_compare( + node_f2.irs[i] + ): return True return False -# pylint: disable=too-many-branches -def ntype(_type: Union[Type, str]) -> str: - if isinstance(_type, ElementaryType): - _type = str(_type) - elif isinstance(_type, ArrayType): - if isinstance(_type.type, ElementaryType): - _type = str(_type) - else: - _type = "user_defined_array" - elif isinstance(_type, Structure): - _type = str(_type) - elif isinstance(_type, Enum): - _type = str(_type) - elif isinstance(_type, MappingType): - _type = str(_type) - elif isinstance(_type, UserDefinedType): - if isinstance(_type.type, Contract): - _type = f"contract({_type.type.name})" - elif isinstance(_type.type, Structure): - _type = f"struct({_type.type.name})" - elif isinstance(_type.type, Enum): - _type = f"enum({_type.type.name})" - else: - _type = str(_type) - - _type = _type.replace(" memory", "") - _type = _type.replace(" storage ref", "") - - if "struct" in _type: - return "struct" - if "enum" in _type: - return "enum" - if "tuple" in _type: - return "tuple" - if "contract" in _type: - return "contract" - if "mapping" in _type: - return "mapping" - return _type.replace(" ", "_") - - -# pylint: disable=too-many-branches -def encode_ir_for_compare(ir: Operation) -> str: - # operations - if isinstance(ir, Assignment): - return f"({encode_var_for_compare(ir.lvalue)}):=({encode_var_for_compare(ir.rvalue)})" - if isinstance(ir, Index): - return f"index({ntype(ir.variable_right.type)})" - if isinstance(ir, Member): - return "member" # .format(ntype(ir._type)) - if isinstance(ir, Length): - return "length" - if isinstance(ir, Binary): - return f"binary({encode_var_for_compare(ir.variable_left)}{ir.type}{encode_var_for_compare(ir.variable_right)})" - if isinstance(ir, Unary): - return f"unary({str(ir.type)})" - if isinstance(ir, Condition): - return f"condition({encode_var_for_compare(ir.value)})" - if isinstance(ir, NewStructure): - return "new_structure" - if isinstance(ir, NewContract): - return "new_contract" - if isinstance(ir, NewArray): - return f"new_array({ntype(ir.array_type)})" - if isinstance(ir, NewElementaryType): - return f"new_elementary({ntype(ir.type)})" - if isinstance(ir, Delete): - return f"delete({encode_var_for_compare(ir.lvalue)},{encode_var_for_compare(ir.variable)})" - if isinstance(ir, SolidityCall): - return f"solidity_call({ir.function.full_name})" - if isinstance(ir, InternalCall): - return f"internal_call({ntype(ir.type_call)})" - if isinstance(ir, EventCall): # is this useful? - return "event" - if isinstance(ir, LibraryCall): - return "library_call" - if isinstance(ir, InternalDynamicCall): - return "internal_dynamic_call" - if isinstance(ir, HighLevelCall): # TODO: improve - return "high_level_call" - if isinstance(ir, LowLevelCall): # TODO: improve - return "low_level_call" - if isinstance(ir, TypeConversion): - return f"type_conversion({ntype(ir.type)})" - if isinstance(ir, Return): # this can be improved using values - return "return" # .format(ntype(ir.type)) - if isinstance(ir, Transfer): - return f"transfer({encode_var_for_compare(ir.call_value)})" - if isinstance(ir, Send): - return f"send({encode_var_for_compare(ir.call_value)})" - if isinstance(ir, Unpack): # TODO: improve - return "unpack" - if isinstance(ir, InitArray): # TODO: improve - return "init_array" - - # default - return "" - - -# pylint: disable=too-many-branches -def encode_ir_for_halstead(ir: Operation) -> str: - # operations - if isinstance(ir, Assignment): - return "assignment" - if isinstance(ir, Index): - return "index" - if isinstance(ir, Member): - return "member" # .format(ntype(ir._type)) - if isinstance(ir, Length): - return "length" - if isinstance(ir, Binary): - return f"binary({str(ir.type)})" - if isinstance(ir, Unary): - return f"unary({str(ir.type)})" - if isinstance(ir, Condition): - return f"condition({encode_var_for_compare(ir.value)})" - if isinstance(ir, NewStructure): - return "new_structure" - if isinstance(ir, NewContract): - return "new_contract" - if isinstance(ir, NewArray): - return f"new_array({ntype(ir.array_type)})" - if isinstance(ir, NewElementaryType): - return f"new_elementary({ntype(ir.type)})" - if isinstance(ir, Delete): - return "delete" - if isinstance(ir, SolidityCall): - return f"solidity_call({ir.function.full_name})" - if isinstance(ir, InternalCall): - return f"internal_call({ntype(ir.type_call)})" - if isinstance(ir, EventCall): # is this useful? - return "event" - if isinstance(ir, LibraryCall): - return "library_call" - if isinstance(ir, InternalDynamicCall): - return "internal_dynamic_call" - if isinstance(ir, HighLevelCall): # TODO: improve - return "high_level_call" - if isinstance(ir, LowLevelCall): # TODO: improve - return "low_level_call" - if isinstance(ir, TypeConversion): - return f"type_conversion({ntype(ir.type)})" - if isinstance(ir, Return): # this can be improved using values - return "return" # .format(ntype(ir.type)) - if isinstance(ir, Transfer): - return "transfer" - if isinstance(ir, Send): - return "send" - if isinstance(ir, Unpack): # TODO: improve - return "unpack" - if isinstance(ir, InitArray): # TODO: improve - return "init_array" - # default - raise NotImplementedError(f"encode_ir_for_halstead: {ir}") - - -# pylint: disable=too-many-branches -def encode_var_for_compare(var: Variable) -> str: - - # variables - if isinstance(var, Constant): - return f"constant({ntype(var.type)},{var.value})" - if isinstance(var, SolidityVariableComposed): - return f"solidity_variable_composed({var.name})" - if isinstance(var, SolidityVariable): - return f"solidity_variable{var.name}" - if isinstance(var, TemporaryVariable): - return "temporary_variable" - if isinstance(var, ReferenceVariable): - return f"reference({ntype(var.type)})" - if isinstance(var, LocalVariable): - return f"local_solc_variable({ntype(var.type)},{var.location})" - if isinstance(var, StateVariable): - if not (var.is_constant or var.is_immutable): - try: - slot, _ = var.contract.compilation_unit.storage_layout_of(var.contract, var) - except KeyError: - slot = var.name - else: - slot = var.name - return f"state_solc_variable({ntype(var.type)},{slot})" - if isinstance(var, LocalVariableInitFromTuple): - return "local_variable_init_tuple" - if isinstance(var, TupleVariable): - return "tuple_variable" - - # default - return "" - - def get_proxy_implementation_slot(proxy: Contract) -> Optional[SlotInfo]: """ Gets information about the storage slot where a proxy's implementation address is stored. From c8bd72ed9fd00f8d42c8b1de3419a2d1bdc779b7 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 15 Sep 2023 11:16:32 +0200 Subject: [PATCH 145/169] Fix circular dep --- slither/core/variables/local_variable.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slither/core/variables/local_variable.py b/slither/core/variables/local_variable.py index 427f004082..9baf804457 100644 --- a/slither/core/variables/local_variable.py +++ b/slither/core/variables/local_variable.py @@ -2,7 +2,6 @@ from slither.core.variables.variable import Variable from slither.core.solidity_types.user_defined_type import UserDefinedType -from slither.core.solidity_types.array_type import ArrayType from slither.core.solidity_types.mapping_type import MappingType from slither.core.solidity_types.elementary_type import ElementaryType @@ -51,6 +50,9 @@ def is_storage(self) -> bool: Returns: (bool) """ + # pylint: disable=import-outside-toplevel + from slither.core.solidity_types.array_type import ArrayType + if self.location == "memory": return False if self.location == "calldata": From bcbe4ffe93ab0c1968c2f212d5b7d437126339b7 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 15 Sep 2023 11:30:47 +0200 Subject: [PATCH 146/169] Update ci_test_printers.sh --- scripts/ci_test_printers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci_test_printers.sh b/scripts/ci_test_printers.sh index e7310700e5..3306c134e2 100755 --- a/scripts/ci_test_printers.sh +++ b/scripts/ci_test_printers.sh @@ -5,7 +5,7 @@ cd tests/e2e/solc_parsing/test_data/compile/ || exit # Do not test the evm printer,as it needs a refactoring -ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc,martin,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration" +ALL_PRINTERS="cfg,constructor-calls,contract-summary,data-dependency,echidna,function-id,function-summary,modifiers,call-graph,halstead,human-summary,inheritance,inheritance-graph,loc,martin,slithir,slithir-ssa,vars-and-auth,require,variable-order,declaration,ck" # Only test 0.5.17 to limit test time for file in *0.5.17-compact.zip; do From f07d506b4a5ded16f996233cf0885090c6c8fd94 Mon Sep 17 00:00:00 2001 From: Judy Wu Date: Fri, 15 Sep 2023 20:12:48 -0400 Subject: [PATCH 147/169] Check s_ and i_ naming convention for private and internal only --- .../naming_convention/naming_convention.py | 15 +++----- ...ention_0_4_25_naming_convention_sol__0.txt | 16 +++++---- ...ention_0_5_16_naming_convention_sol__0.txt | 16 +++++---- ...ention_0_6_11_naming_convention_sol__0.txt | 32 ++++++++++-------- ...vention_0_7_6_naming_convention_sol__0.txt | 32 ++++++++++-------- .../0.4.25/naming_convention.sol | 2 ++ .../0.4.25/naming_convention.sol-0.4.25.zip | Bin 3801 -> 3818 bytes ...arning_for_public_constants.sol-0.4.25.zip | Bin 1380 -> 1378 bytes .../0.5.16/naming_convention.sol | 2 ++ .../0.5.16/naming_convention.sol-0.5.16.zip | Bin 3804 -> 3836 bytes ...arning_for_public_constants.sol-0.5.16.zip | Bin 1387 -> 1385 bytes .../0.6.11/naming_convention.sol | 3 ++ .../0.6.11/naming_convention.sol-0.6.11.zip | Bin 3930 -> 4024 bytes ...arning_for_public_constants.sol-0.6.11.zip | Bin 1409 -> 1407 bytes .../0.7.6/naming_convention.sol | 3 ++ .../0.7.6/naming_convention.sol-0.7.6.zip | Bin 3852 -> 3951 bytes ...warning_for_public_constants.sol-0.7.6.zip | Bin 1367 -> 1365 bytes 17 files changed, 68 insertions(+), 53 deletions(-) diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 904b57eacf..1e10b5543c 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -175,19 +175,12 @@ def _detect(self) -> List[Output]: results.append(res) else: - # first priority: check for immutable variable naming conventions - if var.is_immutable: - correct_naming = self.is_immutable_naming(var.name) + if var.visibility in ["private", "internal"]: + correct_naming = self.is_mixed_case_with_underscore(var.name) or self.is_state_naming(var.name) - # second priority: check for state variable naming conventions - elif self.is_state_naming(var.name): - correct_naming = True + if not correct_naming and var.is_immutable: + correct_naming = self.is_immutable_naming(var.name) - # third priority: check if visibility is private or internal and check for underscore mixed case - elif var.visibility in ["private", "internal"]: - correct_naming = self.is_mixed_case_with_underscore(var.name) - - # fourth priority: check for mixed case naming conventions else: correct_naming = self.is_mixed_case(var.name) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt index 2c05a3c403..2b64ccac10 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt @@ -1,10 +1,12 @@ +Variable T.s_myStateVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#60) is not in mixedCase + Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#71) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#73) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#71) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#73) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#72) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#11) is not in mixedCase @@ -14,11 +16,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#61) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#63) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#57) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#59) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#72) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#23) is not in CapWords @@ -26,7 +28,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.4.25 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#71) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt index 494253c357..057be1d0c6 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt @@ -1,10 +1,12 @@ +Variable T.s_myStateVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#60) is not in mixedCase + Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#71) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#73) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#71) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#73) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#72) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#11) is not in mixedCase @@ -14,11 +16,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#61) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#63) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#57) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#59) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#72) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#23) is not in CapWords @@ -26,7 +28,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.5.16 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#71) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt index e6e431fcce..035b016238 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt @@ -1,32 +1,36 @@ -Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#16-18) is not in CapWords +Variable T.s_myStateVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#63) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#73) is not in mixedCase +Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#17-19) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#73) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#76) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#72) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#76) is single letter l, O, or I, which should not be used -Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#13) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#75) is not in mixedCase + +Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#14) is not in mixedCase Constant naming.MY_other_CONSTANT (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#9) is not in UPPER_CASE_WITH_UNDERSCORES -Contract naming (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#3-50) is not in CapWords +Contract naming (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#3-51) is not in CapWords Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#63) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#66) is not in mixedCase + +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#62) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#59) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#75) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#72) is single letter l, O, or I, which should not be used +Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#26) is not in CapWords -Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#25) is not in CapWords +Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#44-46) is not in mixedCase -Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#43-45) is not in mixedCase +Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#33-36) is not in mixedCase -Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#32-35) is not in mixedCase +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#74) is single letter l, O, or I, which should not be used -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#71) is single letter l, O, or I, which should not be used +Variable naming.i_myImutableVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#11) is not in mixedCase -Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#37) is not in mixedCase +Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#38) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt index d033db260e..5e446f1567 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt @@ -1,32 +1,36 @@ -Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#16-18) is not in CapWords +Variable T.s_myStateVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#63) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#73) is not in mixedCase +Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#17-19) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#73) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#76) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#72) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#76) is single letter l, O, or I, which should not be used -Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#13) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#75) is not in mixedCase + +Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#14) is not in mixedCase Constant naming.MY_other_CONSTANT (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#9) is not in UPPER_CASE_WITH_UNDERSCORES -Contract naming (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#3-50) is not in CapWords +Contract naming (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#3-51) is not in CapWords Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#63) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#66) is not in mixedCase + +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#62) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#59) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#75) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#72) is single letter l, O, or I, which should not be used +Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#26) is not in CapWords -Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#25) is not in CapWords +Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#44-46) is not in mixedCase -Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#43-45) is not in mixedCase +Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#33-36) is not in mixedCase -Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#32-35) is not in mixedCase +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#74) is single letter l, O, or I, which should not be used -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#71) is single letter l, O, or I, which should not be used +Variable naming.i_myImutableVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#11) is not in mixedCase -Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#37) is not in mixedCase +Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#38) is not in mixedCase diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol index 3cc7197e5d..4dcfb17607 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol @@ -53,7 +53,9 @@ contract Test { contract T { uint private _myPrivateVar; + uint private s_myPrivateVar; uint internal _myInternalVar; + uint internal s_myInternalVar; uint public _myPublicVar; uint public s_myStateVar; uint public myPublicVar; diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip index a448234c6efc12d56a6f8f3b0795d137c6097df9..be41a722754565bfd8472ecda649c8023fe1c9b0 100644 GIT binary patch delta 3528 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/no_warning_for_public_constants.sol-0.4.25.zip b/tests/e2e/detectors/test_data/naming-convention/0.4.25/no_warning_for_public_constants.sol-0.4.25.zip index 10aff7711e99be35362fb893bf8c6fb9d4c08ef6..75ba539c315119154831fbb974dc2bcf50938fd9 100644 GIT binary patch delta 139 zcmaFD^@vM2z?+%Ho`H#hkHKJ}e)x0w61hnmh1*z?BYN!wcXs9+?OuQT!xILTuKzQC zikV~_w$EyBJ)eAcLZ-{-!_^5-S4%nBUbm}?-R;}f{b2dGjLlI}ZNHdGe3M@nbuDBQ-9s>yfw`Gq@+4q4xb_^o~Z_m(w5&kDtTpK3+(>(V-M=YW8!{UE+V@LvESCB7dLj3E`xl~| j-#AQiO25Sazwn{$K!7(RlRX2PO_TqyB(S|?VE_UE!lOG` diff --git a/tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol index 3cc7197e5d..4dcfb17607 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol @@ -53,7 +53,9 @@ contract Test { contract T { uint private _myPrivateVar; + uint private s_myPrivateVar; uint internal _myInternalVar; + uint internal s_myInternalVar; uint public _myPublicVar; uint public s_myStateVar; uint public myPublicVar; diff --git a/tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol-0.5.16.zip b/tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol-0.5.16.zip index 44c8707eeb2b417fac50f9a367eccfe2de96d252..52071feef049d2b5719a80688a54f9a794935c77 100644 GIT binary patch delta 3546 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.5.16/no_warning_for_public_constants.sol-0.5.16.zip b/tests/e2e/detectors/test_data/naming-convention/0.5.16/no_warning_for_public_constants.sol-0.5.16.zip index c1cc97460a84a0700770d8195d9284b6ee5a0399..adf409d405ecfee66965b3152b71955dd5e8a3c8 100644 GIT binary patch delta 167 zcmaFO^^!|Cz?+%Ho`H#hkHKJ}et4nJ=De93g}Yhm&&0UDmyvoUcHnt{1ItcrPSz~J z{W&uh{PGA}UaPZcQ^b}BpG$YHzgDIFX7h`W>2?eMHEx;MsS!7G!`TI4u{*+E6o!Al z@^9zi?&I6%|G!ir-5=o1$YjreW)lko!(4s_26F}kXkY}f^Cru)y0N_j$}=zk0MJoA A`~Uy| delta 167 zcmaFK^_ojKz?+%Ho`H#hk73msjqt=>vu@7bDBR6bfBN5x4feMT+R_alOq67KSaQhw z&D-*AoT|T@ZrdH4`-jib&8zB=r&%^v@Djl<>__L{PMz~Z?lI5ZS_aMOKNF{VG+M>7 zX_(Em3qRHF74ZK{$(@V721~j`^7#QaAGccGlAV32nkUd$N)r0K=P?muK0KhRk A3;+NC diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol index 94125ab787..7d81c39549 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol @@ -9,6 +9,7 @@ contract naming { uint constant MY_other_CONSTANT = 2; uint public immutable i_myImutableVar = 1; + uint private immutable i_myPrivateImutableVar = 1; uint Var_One = 1; uint varTwo = 2; @@ -55,7 +56,9 @@ contract Test { contract T { uint private _myPrivateVar; + uint private s_myPrivateVar; uint internal _myInternalVar; + uint internal s_myInternalVar; uint public _myPublicVar; uint public s_myStateVar; uint public myPublicVar; diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol-0.6.11.zip b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol-0.6.11.zip index 86ce8485c735b311c8de39cc2663f7500ea34900..d46a8569c0593a4ec0a50b693c66f7c8af729d14 100644 GIT binary patch delta 3755 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/no_warning_for_public_constants.sol-0.6.11.zip b/tests/e2e/detectors/test_data/naming-convention/0.6.11/no_warning_for_public_constants.sol-0.6.11.zip index 9cf6fe45063f87430f0ad7a12f9b030453f68d1a..bed78289e56ef3f5908f4435662a4a36bc1e0d75 100644 GIT binary patch delta 152 zcmZqV{?8>H;LXfp&%ngM$6&BfKm6JDr`qdT7#Mc&GccG>He|Kh7@EM6GDUlq+o2gh zm#?)=-02%wex$nIeVM!5(!~n7Z+Ue@jkYITC@M=mx#Y{%Nv4J6C#LSu5@Rvwb<1Qr u@K8|Bk-c4NYSGR`rm|u delta 154 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

`SzWTGfhTHsW5sLi>79FwcE zRZ3MV!e~F#-jfmbuVP3z&S_+M8-}NMImsoDz{GZyCoZgAduOL8VHC#$!+ZI~j=|iV zxlM89hqotV!M0G+0Q-S**+JoZrDi1@$KHE?0tF1*CxPeLk}VzldAklb@eT}4W{Z;$ zAACM-5)T$q{XH$gFas6mv@r6lskB@HW@RtFVkfnV(arzTT{jJ!N?al`+k|9DS-azU zeB+swb7BbZ&)cYki-Kix!sKITtCuV6Lz#};-=1W?#X1vIVe<&2okWR&>-IuUQ?Xuu zmfu>+jxVwQ^6*WgQnTsgPKL`+wU7QRdK#z<(Uh|=oMnH)Ud1qqqL zs#E7dj_@r0H0ebWl3loaCcHd}Y)Ko8mw7I`21MA0+UE z2o~@TevKw9TT4J&Hk7X^Kk~|1DKHq;IUaRqG2A&m*|i>r8{ZQ2jrS9w0-pl91j-2j zURr=NHl17H$HE+>#fF@~wkgf}H5_*Cu$4oNzgo5E7Fc38Z8qQ(#uae=OM@f_5 z{gFDPJKl#*LK8u+Vj?kEBTCn)F))s^J*Lp3mz4rRe_z&a!g4o)vg3#@e~4wtTt$HiOFM<4~D#m&soo)(VGa`x4A`+;dIb!VSa!Ls{*U)j8<(mFU; zQ_HV6@++r9-{h`frk3aRm>N4LJt8upC{4&u*lOiZsRkggxY$b+DKA@ zt(8ISxZ`gMFhs@(HYh(Qr8#c}u0^r+Em z7$KDd;eeN`+x8%TqGy6j#G+t9j{8+4DG&xF6dNa(bwS?@^?W;keoJ%SGTmh0Z`HuO zdKy8$4dd>uDjX-Fn;?OQz(il5>V8eeZ!fZ=@5RbZtg-0V_SVjeFN4Vp~;G|G=}Z=uk@m0zUvh h00ICG05730SGz9y>bnjA06C45xeiSR0uKNH008g*{DlAj delta 3570 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.7.6/no_warning_for_public_constants.sol-0.7.6.zip b/tests/e2e/detectors/test_data/naming-convention/0.7.6/no_warning_for_public_constants.sol-0.7.6.zip index 8caf6ecf2fdd994d985c73bb4f2847eb9c71d560..e2697df8906ba02a14d43a104fff0b469ff6984d 100644 GIT binary patch delta 141 zcmcc4b(Kpvz?+%Ho`H#hkHKJ}e)vk=GQrl3!sRTf*PDOlEs}J0n4UZ*+k3ge5gph1 zm2;n0WS8sY{ZE{%`%#QjUZ?J_zHj6Q$BB!J&E;2X|2xPbYxnfSqAf@N@-_+zPL(*Q jbnLXqRN3$U&s4AG3-D%SvS&cEY4S&w1h!i&3_t(?0v|Os delta 143 zcmcc0b)8E%z?+%Ho`H#hk73msjc{v`GM@I0!sRUK=hcpglyk4no6NYbM|h9mp+$L5 z4_ti|t)|?3Oh>k7rczGBr|R|bm2Z>X_@7;p|2pTGX7v`{LjSmf46C%fZmM(CHB7D9 lpk4fO`P)+(|Npl$T2%#jGcwsTpxHI~Jxc=H9To;4005YlHlY9j From b116728bc117f0911f187556eae6c9f101218c00 Mon Sep 17 00:00:00 2001 From: Judy Wu Date: Fri, 15 Sep 2023 20:31:48 -0400 Subject: [PATCH 148/169] Follow linter --- slither/detectors/naming_convention/naming_convention.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 1e10b5543c..85e1a6a65b 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -176,7 +176,9 @@ def _detect(self) -> List[Output]: else: if var.visibility in ["private", "internal"]: - correct_naming = self.is_mixed_case_with_underscore(var.name) or self.is_state_naming(var.name) + correct_naming = self.is_mixed_case_with_underscore( + var.name + ) or self.is_state_naming(var.name) if not correct_naming and var.is_immutable: correct_naming = self.is_immutable_naming(var.name) From 72f0837ef0214aa5ee19bb5a13f7e6831f8c3605 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:30:25 -0500 Subject: [PATCH 149/169] Bump docker/setup-buildx-action from 2 to 3 (#2132) Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-buildx-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 05406d0edc..8a950c022d 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -23,7 +23,7 @@ jobs: uses: docker/setup-qemu-action@v2 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 id: buildx with: install: true From a234e34858d1e540e4823ee76d35f82bbc789688 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:30:35 -0500 Subject: [PATCH 150/169] Bump docker/build-push-action from 4 to 5 (#2133) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8a950c022d..2bc826de49 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -47,7 +47,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Docker Build and Push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v5 with: platforms: linux/amd64,linux/arm64/v8,linux/arm/v7 target: final From 1f6b7bfded90df505e43e943032c75f6fdde66c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:30:45 -0500 Subject: [PATCH 151/169] Bump docker/setup-qemu-action from 2 to 3 (#2134) Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 2bc826de49..215c5e1ade 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 From 0501fefa459691557e16be812de4783f3f96749c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:30:54 -0500 Subject: [PATCH 152/169] Bump docker/login-action from 2 to 3 (#2135) Bumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 215c5e1ade..e0e303ed84 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -40,7 +40,7 @@ jobs: type=edge - name: GitHub Container Registry Login - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} From cc9e0a568e5b1e25eb43b57cdc624945c9fee822 Mon Sep 17 00:00:00 2001 From: Simone Date: Fri, 29 Sep 2023 17:41:52 +0200 Subject: [PATCH 153/169] Fix parsing super call expression --- slither/solc_parsing/expressions/expression_parsing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/solc_parsing/expressions/expression_parsing.py b/slither/solc_parsing/expressions/expression_parsing.py index 74ff593c70..4ed896ed9c 100644 --- a/slither/solc_parsing/expressions/expression_parsing.py +++ b/slither/solc_parsing/expressions/expression_parsing.py @@ -175,7 +175,7 @@ def parse_call( called = parse_expression(children[0], caller_context) arguments = [parse_expression(a, caller_context) for a in children[1::]] - if isinstance(called, SuperCallExpression): + if isinstance(called, SuperIdentifier): sp = SuperCallExpression(called, arguments, type_return) sp.set_offset(expression["src"], caller_context.compilation_unit) return sp From 838680bed7720df3800eb167835fb9b80ee16a04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Oct 2023 09:29:34 -0500 Subject: [PATCH 154/169] Bump sigstore/gh-action-sigstore-python from 2.0.1 to 2.1.0 (#2154) Bumps [sigstore/gh-action-sigstore-python](https://github.com/sigstore/gh-action-sigstore-python) from 2.0.1 to 2.1.0. - [Release notes](https://github.com/sigstore/gh-action-sigstore-python/releases) - [Commits](https://github.com/sigstore/gh-action-sigstore-python/compare/v2.0.1...v2.1.0) --- updated-dependencies: - dependency-name: sigstore/gh-action-sigstore-python dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index fef0a4a2eb..7b4d61e89f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -47,7 +47,7 @@ jobs: uses: pypa/gh-action-pypi-publish@v1.8.10 - name: sign - uses: sigstore/gh-action-sigstore-python@v2.0.1 + uses: sigstore/gh-action-sigstore-python@v2.1.0 with: inputs: ./dist/*.tar.gz ./dist/*.whl release-signing-artifacts: true From c31faa0df5eee5ab928db0998b0a1676deda69b3 Mon Sep 17 00:00:00 2001 From: Jeff Schroeder Date: Wed, 4 Oct 2023 01:03:59 +0000 Subject: [PATCH 155/169] Fix a typo in the help text --- slither/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/__main__.py b/slither/__main__.py index d9201a90d9..c639200362 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -442,7 +442,7 @@ def parse_args( group_checklist.add_argument( "--checklist-limit", - help="Limite the number of results per detector in the markdown file", + help="Limit the number of results per detector in the markdown file", action="store", default="", ) From 700794971ba6bb1d905c6de171331dbd265619e3 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 5 Oct 2023 14:27:28 +0200 Subject: [PATCH 156/169] Release 2 new detectors --- slither/detectors/all_detectors.py | 2 + .../detectors/assembly/incorrect_return.py | 91 ++++++++++++++++++ .../assembly/return_instead_of_leave.py | 64 ++++++++++++ ...tReturn_0_8_10_incorrect_return_sol__0.txt | 4 + ...OfLeave_0_8_10_incorrect_return_sol__0.txt | 2 + .../0.8.10/incorrect_return.sol | 36 +++++++ .../0.8.10/incorrect_return.sol-0.8.10.zip | Bin 0 -> 2892 bytes .../return-leave/0.8.10/incorrect_return.sol | 8 ++ .../0.8.10/incorrect_return.sol-0.8.10.zip | Bin 0 -> 1445 bytes tests/e2e/detectors/test_detectors.py | 10 ++ tests/e2e/solc_parsing/test_ast_parsing.py | 8 +- 11 files changed, 221 insertions(+), 4 deletions(-) create mode 100644 slither/detectors/assembly/incorrect_return.py create mode 100644 slither/detectors/assembly/return_instead_of_leave.py create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_IncorrectReturn_0_8_10_incorrect_return_sol__0.txt create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_ReturnInsteadOfLeave_0_8_10_incorrect_return_sol__0.txt create mode 100644 tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol create mode 100644 tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol-0.8.10.zip create mode 100644 tests/e2e/detectors/test_data/return-leave/0.8.10/incorrect_return.sol create mode 100644 tests/e2e/detectors/test_data/return-leave/0.8.10/incorrect_return.sol-0.8.10.zip diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index 57f44bc56e..4a111bb64a 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -92,3 +92,5 @@ from .operations.cache_array_length import CacheArrayLength from .statements.incorrect_using_for import IncorrectUsingFor from .operations.encode_packed import EncodePackedCollision +from .assembly.incorrect_return import IncorrectReturn +from .assembly.return_instead_of_leave import ReturnInsteadOfLeave diff --git a/slither/detectors/assembly/incorrect_return.py b/slither/detectors/assembly/incorrect_return.py new file mode 100644 index 0000000000..dc1868e646 --- /dev/null +++ b/slither/detectors/assembly/incorrect_return.py @@ -0,0 +1,91 @@ +from typing import List, Optional + +from slither.core.declarations import SolidityFunction, Function +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.slithir.operations import SolidityCall +from slither.utils.output import Output + + +def _assembly_node(function: Function) -> Optional[SolidityCall]: + """ + Check if there is a node that use return in assembly + + Args: + function: + + Returns: + + """ + + for ir in function.all_slithir_operations(): + if isinstance(ir, SolidityCall) and ir.function == SolidityFunction( + "return(uint256,uint256)" + ): + return ir + return None + + +class IncorrectReturn(AbstractDetector): + """ + Check for cases where a return(a,b) is used in an assembly function + """ + + ARGUMENT = "incorrect-return" + HELP = "If a `return` is incorrectly used in assembly mode." + IMPACT = DetectorClassification.HIGH + CONFIDENCE = DetectorClassification.MEDIUM + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-assembly-return" + + WIKI_TITLE = "Incorrect return in assembly" + WIKI_DESCRIPTION = "Detect if `return` in an assembly block halts unexpectedly the execution." + WIKI_EXPLOIT_SCENARIO = """ +```solidity +contract C { + function f() internal returns (uint a, uint b) { + assembly { + return (5, 6) + } + } + + function g() returns (bool){ + f(); + return true; + } +} +``` +The return statement in `f` will cause execution in `g` to halt. +The function will return 6 bytes starting from offset 5, instead of returning a boolean.""" + + WIKI_RECOMMENDATION = "Use the `leave` statement." + + # pylint: disable=too-many-nested-blocks + def _detect(self) -> List[Output]: + results: List[Output] = [] + for c in self.contracts: + for f in c.functions_declared: + + for node in f.nodes: + if node.sons: + for function_called in node.internal_calls: + if isinstance(function_called, Function): + found = _assembly_node(function_called) + if found: + + info: DETECTOR_INFO = [ + f, + " calls ", + function_called, + " which halt the execution ", + found.node, + "\n", + ] + json = self.generate_result(info) + + results.append(json) + + return results diff --git a/slither/detectors/assembly/return_instead_of_leave.py b/slither/detectors/assembly/return_instead_of_leave.py new file mode 100644 index 0000000000..74c377d400 --- /dev/null +++ b/slither/detectors/assembly/return_instead_of_leave.py @@ -0,0 +1,64 @@ +from typing import List + +from slither.core.declarations import SolidityFunction, Function +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.slithir.operations import SolidityCall +from slither.utils.output import Output + + +class ReturnInsteadOfLeave(AbstractDetector): + """ + Check for cases where a return(a,b) is used in an assembly function that also returns two variables + """ + + ARGUMENT = "return-leave" + HELP = "If a `return` is used instead of a `leave`." + IMPACT = DetectorClassification.HIGH + CONFIDENCE = DetectorClassification.MEDIUM + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-assembly-return" + + WIKI_TITLE = "Return instead of leave in assembly" + WIKI_DESCRIPTION = "Detect if a `return` is used where a `leave` should be used." + WIKI_EXPLOIT_SCENARIO = """ +```solidity +contract C { + function f() internal returns (uint a, uint b) { + assembly { + return (5, 6) + } + } + +} +``` +The function will halt the execution, instead of returning a two uint.""" + + WIKI_RECOMMENDATION = "Use the `leave` statement." + + def _check_function(self, f: Function) -> List[Output]: + results: List[Output] = [] + + for node in f.nodes: + for ir in node.irs: + if isinstance(ir, SolidityCall) and ir.function == SolidityFunction( + "return(uint256,uint256)" + ): + info: DETECTOR_INFO = [f, " contains an incorrect call to return: ", node, "\n"] + json = self.generate_result(info) + + results.append(json) + return results + + def _detect(self) -> List[Output]: + results: List[Output] = [] + for c in self.contracts: + for f in c.functions_declared: + + if len(f.returns) == 2 and f.contains_assembly: + results += self._check_function(f) + + return results diff --git a/tests/e2e/detectors/snapshots/detectors__detector_IncorrectReturn_0_8_10_incorrect_return_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_IncorrectReturn_0_8_10_incorrect_return_sol__0.txt new file mode 100644 index 0000000000..5d87cd932d --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_IncorrectReturn_0_8_10_incorrect_return_sol__0.txt @@ -0,0 +1,4 @@ +C.bad1() (tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol#21-24) calls C.indirect() (tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol#17-19) which halt the execution return(uint256,uint256)(5,6) (tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol#4) + +C.bad0() (tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol#8-11) calls C.internal_return() (tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol#2-6) which halt the execution return(uint256,uint256)(5,6) (tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol#4) + diff --git a/tests/e2e/detectors/snapshots/detectors__detector_ReturnInsteadOfLeave_0_8_10_incorrect_return_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_ReturnInsteadOfLeave_0_8_10_incorrect_return_sol__0.txt new file mode 100644 index 0000000000..28f579f818 --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_ReturnInsteadOfLeave_0_8_10_incorrect_return_sol__0.txt @@ -0,0 +1,2 @@ +C.f() (tests/e2e/detectors/test_data/return-leave/0.8.10/incorrect_return.sol#3-7) contains an incorrect call to return: return(uint256,uint256)(5,6) (tests/e2e/detectors/test_data/return-leave/0.8.10/incorrect_return.sol#5) + diff --git a/tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol b/tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol new file mode 100644 index 0000000000..e81a747ba1 --- /dev/null +++ b/tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol @@ -0,0 +1,36 @@ +contract C { + function internal_return() internal{ + assembly { + return (5, 6) + } + } + + function bad0() public returns (bool){ + internal_return(); + return true; + } + + function indirect2() internal { + internal_return(); + } + + function indirect() internal { + indirect2(); + } + + function bad1() public returns (bool){ + indirect(); + return true; + } + + function good0() public{ + // Dont report if there is no following operation + internal_return(); + } + + function good1() public returns (uint a, uint b){ + assembly { + return (5, 6) + } + } +} \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol-0.8.10.zip b/tests/e2e/detectors/test_data/incorrect-return/0.8.10/incorrect_return.sol-0.8.10.zip new file mode 100644 index 0000000000000000000000000000000000000000..2491a10a6554d40be21373fc9f7eeb55ceb9f46e GIT binary patch literal 2892 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 literal 0 HcmV?d00001 diff --git a/tests/e2e/detectors/test_detectors.py b/tests/e2e/detectors/test_detectors.py index 6fc04e4e1f..9ca1bfcde9 100644 --- a/tests/e2e/detectors/test_detectors.py +++ b/tests/e2e/detectors/test_detectors.py @@ -1654,6 +1654,16 @@ def id_test(test_item: Test): "encode_packed_collision.sol", "0.7.6", ), + Test( + all_detectors.IncorrectReturn, + "incorrect_return.sol", + "0.8.10", + ), + Test( + all_detectors.ReturnInsteadOfLeave, + "incorrect_return.sol", + "0.8.10", + ), ] GENERIC_PATH = "/GENERIC_PATH" diff --git a/tests/e2e/solc_parsing/test_ast_parsing.py b/tests/e2e/solc_parsing/test_ast_parsing.py index 2da4cf1e26..37f6d7274b 100644 --- a/tests/e2e/solc_parsing/test_ast_parsing.py +++ b/tests/e2e/solc_parsing/test_ast_parsing.py @@ -4,13 +4,13 @@ import sys from pathlib import Path from typing import List, Dict, Tuple -from packaging.version import parse as parse_version -import pytest + +from crytic_compile import CryticCompile, save_to_zip +from crytic_compile.utils.zip import load_from_zip from deepdiff import DeepDiff +from packaging.version import parse as parse_version from solc_select.solc_select import install_artifacts as install_solc_versions from solc_select.solc_select import installed_versions as get_installed_solc_versions -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 From 561a6f88d01ba4f3478dc12c74a63ed9b70f336c Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 5 Oct 2023 15:01:35 +0200 Subject: [PATCH 157/169] Update slither/detectors/assembly/incorrect_return.py Co-authored-by: alpharush <0xalpharush@protonmail.com> --- slither/detectors/assembly/incorrect_return.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/detectors/assembly/incorrect_return.py b/slither/detectors/assembly/incorrect_return.py index dc1868e646..f5f0a98d9d 100644 --- a/slither/detectors/assembly/incorrect_return.py +++ b/slither/detectors/assembly/incorrect_return.py @@ -67,7 +67,7 @@ class IncorrectReturn(AbstractDetector): def _detect(self) -> List[Output]: results: List[Output] = [] for c in self.contracts: - for f in c.functions_declared: + for f in c.functions_and_modifiers_declared: for node in f.nodes: if node.sons: From 1cdb2022cbe778fbe7d0a021a0f1241aceb11c14 Mon Sep 17 00:00:00 2001 From: Judy Wu Date: Thu, 5 Oct 2023 22:54:10 -0400 Subject: [PATCH 158/169] address issue #2127 and allow function parameter name to be empty when casting to string --- slither/core/variables/variable.py | 1 - .../test_contract_data/test_contract_data.sol | 5 +++++ tests/e2e/compilation/test_resolution.py | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/compilation/test_data/test_contract_data/test_contract_data.sol diff --git a/slither/core/variables/variable.py b/slither/core/variables/variable.py index 2b777e6723..1afcc47575 100644 --- a/slither/core/variables/variable.py +++ b/slither/core/variables/variable.py @@ -179,5 +179,4 @@ def solidity_signature(self) -> str: return f'{name}({",".join(parameters)})' def __str__(self) -> str: - assert self._name return self._name diff --git a/tests/e2e/compilation/test_data/test_contract_data/test_contract_data.sol b/tests/e2e/compilation/test_data/test_contract_data/test_contract_data.sol new file mode 100644 index 0000000000..a99001da34 --- /dev/null +++ b/tests/e2e/compilation/test_data/test_contract_data/test_contract_data.sol @@ -0,0 +1,5 @@ +contract TestSlither { + function testFunction(uint256 param1, uint256, address param3) public { + + } +} \ No newline at end of file diff --git a/tests/e2e/compilation/test_resolution.py b/tests/e2e/compilation/test_resolution.py index 71edaa143f..479e87d4a1 100644 --- a/tests/e2e/compilation/test_resolution.py +++ b/tests/e2e/compilation/test_resolution.py @@ -43,3 +43,18 @@ def test_cycle(solc_binary_path) -> None: solc_path = solc_binary_path("0.8.0") slither = Slither(Path(TEST_DATA_DIR, "test_cyclic_import", "a.sol").as_posix(), solc=solc_path) _run_all_detectors(slither) + + +def test_contract_function_parameter(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.0") + standard_json = SolcStandardJson() + standard_json.add_source_file( + Path(TEST_DATA_DIR, "test_contract_data", "test_contract_data.sol").as_posix() + ) + compilation = CryticCompile(standard_json, solc=solc_path) + slither = Slither(compilation) + contract = slither.contracts[0] + + for function in contract.functions: + for parameter in function.parameters: + str(parameter) From 8feb4943d9a5e8bba3435544e4e2277fa63a9809 Mon Sep 17 00:00:00 2001 From: Judy Wu Date: Fri, 6 Oct 2023 10:43:15 -0400 Subject: [PATCH 159/169] Update test to assert expected parameter names --- tests/e2e/compilation/test_resolution.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/e2e/compilation/test_resolution.py b/tests/e2e/compilation/test_resolution.py index 479e87d4a1..af7cbe2c77 100644 --- a/tests/e2e/compilation/test_resolution.py +++ b/tests/e2e/compilation/test_resolution.py @@ -54,7 +54,9 @@ def test_contract_function_parameter(solc_binary_path) -> None: compilation = CryticCompile(standard_json, solc=solc_path) slither = Slither(compilation) contract = slither.contracts[0] + function = contract.functions[0] + parameters = function.parameters - for function in contract.functions: - for parameter in function.parameters: - str(parameter) + assert (parameters[0].name == 'param1') + assert (parameters[1].name == '') + assert (parameters[2].name == 'param3') From 4d738ec358c394d7cf7d056d0095ce2673f50166 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 11 Oct 2023 09:56:10 +0200 Subject: [PATCH 160/169] Minor --- slither/detectors/assembly/return_instead_of_leave.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/slither/detectors/assembly/return_instead_of_leave.py b/slither/detectors/assembly/return_instead_of_leave.py index 74c377d400..a1591d834b 100644 --- a/slither/detectors/assembly/return_instead_of_leave.py +++ b/slither/detectors/assembly/return_instead_of_leave.py @@ -58,7 +58,11 @@ def _detect(self) -> List[Output]: for c in self.contracts: for f in c.functions_declared: - if len(f.returns) == 2 and f.contains_assembly: + if ( + len(f.returns) == 2 + and f.contains_assembly + and f.visibility not in ["public", "external"] + ): results += self._check_function(f) return results From f7ab4a734fb93433eca7afa4e867acafbeb05605 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 11 Oct 2023 10:12:41 +0200 Subject: [PATCH 161/169] Add incorrect-exp detector --- slither/detectors/operations/incorrect_exp.py | 0 ...onentiation_0_7_6_incorrect_exp_sol__0.txt | 9 ++++++ .../incorrect-exp/0.7.6/incorrect_exp.sol | 30 ++++++++++++++++++ .../0.7.6/incorrect_exp.sol-0.7.6.zip | Bin 0 -> 2473 bytes 4 files changed, 39 insertions(+) create mode 100644 slither/detectors/operations/incorrect_exp.py create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_IncorrectOperatorExponentiation_0_7_6_incorrect_exp_sol__0.txt create mode 100644 tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol create mode 100644 tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol-0.7.6.zip diff --git a/slither/detectors/operations/incorrect_exp.py b/slither/detectors/operations/incorrect_exp.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/e2e/detectors/snapshots/detectors__detector_IncorrectOperatorExponentiation_0_7_6_incorrect_exp_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_IncorrectOperatorExponentiation_0_7_6_incorrect_exp_sol__0.txt new file mode 100644 index 0000000000..458dd3bdcd --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_IncorrectOperatorExponentiation_0_7_6_incorrect_exp_sol__0.txt @@ -0,0 +1,9 @@ +Test.bad1() (tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol#9-12) has bitwise-xor operator ^ instead of the exponentiation operator **: + - UINT_MAX = 2 ^ 256 - 1 (tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol#10) + +Test.bad0(uint256) (tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol#5-7) has bitwise-xor operator ^ instead of the exponentiation operator **: + - a ^ 2 (tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol#6) + +Derived.slitherConstructorVariables() (tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol#30) has bitwise-xor operator ^ instead of the exponentiation operator **: + - my_var = 2 ^ 256 - 1 (tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol#3) + diff --git a/tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol b/tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol new file mode 100644 index 0000000000..b930ee5c1f --- /dev/null +++ b/tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol @@ -0,0 +1,30 @@ +contract Test { + + uint my_var = 2 ^ 256-1; + + function bad0(uint a) internal returns (uint) { + return a^2; + } + + function bad1() internal returns (uint) { + uint UINT_MAX = 2^256-1; + return UINT_MAX; + } + + /* Correct exponentiation operator */ + function good0(uint a) internal returns (uint) { + return a**2; + } + + /* Neither operand is a constant */ + function good1(uint a) internal returns (uint) { + return a^a; + } + + /* The constant operand 0xff in hex typically means bitwise xor */ + function good2(uint a) internal returns (uint) { + return a^0xff; + } +} + +contract Derived is Test {} diff --git a/tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol-0.7.6.zip b/tests/e2e/detectors/test_data/incorrect-exp/0.7.6/incorrect_exp.sol-0.7.6.zip new file mode 100644 index 0000000000000000000000000000000000000000..c6fea01511ee4ecf31db7b382c3ca0f81ef8bd15 GIT binary patch literal 2473 zcma);`8U)H1IE80#!|+f7=|$n*~z|4Mac-mMY0YivKz~_G_sGx*hSYi3Af>52-$VZ zmUZk)MpE`QveR4d@9#P9^Zf8R&pFQ@@G(WvGw1?zz-2%ajk21?2^5}z03g~30N?-s zJo0w-!QrsZ0S?$;Us-=2&)@XH1vp@E&Tfx_u(Iy{KHkg>7Xdo}hyVcX_;^>PQzbvr z@IamBrQ8nhNANbG*d(*7I>HnFExZc5tA(F|rHkV~MlaLp;je?<-aOxsjfTl}^s>-t zUqr-no=ivx42eD3RF{{h7|4x0u0MU(@a!X`poZ9=ZhDxN!92n_;}W#BMNUXsec^bE z#fu|Xn&`Kleyu<%PBN1usF!TSz(a80d%mR5qHGGLSKPjW)o?J^2nW#P5_*+Syx(uE4Z7ec(nf3?Y`oDLXNx8+Ey!MU?w+rKBIzp5@Eq5U7-;Ub1f)G8U54_02*F|7zJKra3|~b`zgTGEkVZ zC7t&F*wo&wWcMeo!Ly<}h2&J&n&au0KX-^(I6Se@F-P2Rrl5+nSvQW|WYC?pv{Nsi z2*gsWpNgtd{iFuh__QY_nTYTC(0^a%>~E)GlP8GTQ^6;6q`MTGj&OzQxuh zl$YpUaj$NSNA7EqnckDMEw@GgnM?7lYh7G2o;dFZp}y_PsQq?%Bv`pP>dhKWEVCL^&ATIw;={?s)hmzm<ort6JLG7eTx=o7pz}Bq_UqKY_c&e0HJoFWQcoew-`U=26qbI7i_oF!yRMN((lVirZ{TO4}6JDWv%)Bs#<>PZ>102Sq z%TfT|)yQpy+M9C;PR%vkOYO1Q3+A?uA3W{6`ubgwd#7uwqg}WVw?oXIyth(43s;(j z@Dfs z5{83?1#{6eT;xY;f}k0cA@c7z3^$zceB~&phNun@bKDx-L_aC8;Gip8_-xR#q!Cv> z2h#q)cXtVzG!{EaiJE2jk$eij{^@S2k|^)l$I(IT2-M5+s1VkT?DoiySqwUKajJf& zXj>lk2ZXoPZHr6`Hl4HRUl-b-=a`b2*d|oO@Kli}r~8*<_&yw2ps6Pu*l5w4Mos+| zN*x>AHC&)?&-oU$+sR1O$v*Ao{wB8>Bc9|dG~qO<&|Z>7%=W*PZ@g4uQ|>nHEFB4^ zeuiPn?h z@j&7xSR|D0umM`S!n)Z49SLCk7V6csKI~{{Qt;D7(P8aHHt4m-0GraKUGEWW`d!{& zW;lx7Lp{7>UGGh!Kcn|DeN7g{<|s6+iGbhydFL^ha~OFoHw{q`9z57Fg6@}_qw%x) zx1e6mUGG!TVu~v|!HUI6J$2y1oP>Kl%cfNYmS#AD?{yq)$IWMicDUYd@*e%F{ZtVx zbmd_D==|WWGif_?3_l2JC_FTCK6Q{zZPFDQUlo$ciqi(t1lgxmk}nr9BEzGFpQF zBnQ$nQ1DtwfB0Q#EZ%pWw+-~u{fDou?X3-Q+hr2!GTyEsfPOtgP90;+F|D~rUriNy zoJO%z(n=(C5v(%aERZJ%rNsk0oraPVn-MxNabK?C1=PZC0(lcFC`a_(uu`}kE; zLY5uC+TH`gpBGxgGovbx@Ivf7bBSxm%0J+`NFT7|00t4_xcY(s-6r0 literal 0 HcmV?d00001 From 4d1d32b63fd06eeba69af35cd64680bfa2338167 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 11 Oct 2023 10:22:27 +0200 Subject: [PATCH 162/169] Add tautological-compare --- slither/detectors/all_detectors.py | 2 + slither/detectors/operations/incorrect_exp.py | 93 ++++++++++++++++++ .../statements/tautological_compare.py | 69 +++++++++++++ .../tautological-compare/0.8.20/compare.sol | 6 ++ .../0.8.20/compare.sol-0.8.20.zip | Bin 0 -> 2032 bytes tests/e2e/detectors/test_detectors.py | 10 ++ 6 files changed, 180 insertions(+) create mode 100644 slither/detectors/statements/tautological_compare.py create mode 100644 tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol create mode 100644 tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol-0.8.20.zip diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index 4a111bb64a..97622f8878 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -94,3 +94,5 @@ from .operations.encode_packed import EncodePackedCollision from .assembly.incorrect_return import IncorrectReturn from .assembly.return_instead_of_leave import ReturnInsteadOfLeave +from .operations.incorrect_exp import IncorrectOperatorExponentiation +from .statements.tautological_compare import TautologicalCompare diff --git a/slither/detectors/operations/incorrect_exp.py b/slither/detectors/operations/incorrect_exp.py index e69de29bb2..6188f5cb16 100644 --- a/slither/detectors/operations/incorrect_exp.py +++ b/slither/detectors/operations/incorrect_exp.py @@ -0,0 +1,93 @@ +""" +Module detecting incorrect operator usage for exponentiation where bitwise xor '^' is used instead of '**' +""" +from typing import Tuple, List, Union + +from slither.core.cfg.node import Node +from slither.core.declarations import Contract, Function +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.slithir.operations import Binary, BinaryType, Operation +from slither.slithir.utils.utils import RVALUE +from slither.slithir.variables.constant import Constant +from slither.utils.output import Output + + +def _is_constant_candidate(var: Union[RVALUE, Function]) -> bool: + """ + Check if the variable is a constant. + Do not consider variable that are expressed with hexadecimal. + Something like 2^0xf is likely to be a correct bitwise operator + :param var: + :return: + """ + return isinstance(var, Constant) and not var.original_value.startswith("0x") + + +def _is_bitwise_xor_on_constant(ir: Operation) -> bool: + return ( + isinstance(ir, Binary) + and ir.type == BinaryType.CARET + and (_is_constant_candidate(ir.variable_left) or _is_constant_candidate(ir.variable_right)) + ) + + +def _detect_incorrect_operator(contract: Contract) -> List[Tuple[Function, Node]]: + ret: List[Tuple[Function, Node]] = [] + f: Function + for f in contract.functions + contract.modifiers: # type:ignore + # Heuristic: look for binary expressions with ^ operator where at least one of the operands is a constant, and + # the constant is not in hex, because hex typically is used with bitwise xor and not exponentiation + nodes = [node for node in f.nodes for ir in node.irs if _is_bitwise_xor_on_constant(ir)] + for node in nodes: + ret.append((f, node)) + return ret + + +# pylint: disable=too-few-public-methods +class IncorrectOperatorExponentiation(AbstractDetector): + """ + Incorrect operator usage of bitwise xor mistaking it for exponentiation + """ + + ARGUMENT = "incorrect-exp" + HELP = "Incorrect exponentiation" + IMPACT = DetectorClassification.HIGH + CONFIDENCE = DetectorClassification.MEDIUM + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-exponentiation" + + WIKI_TITLE = "Incorrect exponentiation" + WIKI_DESCRIPTION = "Detect use of bitwise `xor ^` instead of exponential `**`" + WIKI_EXPLOIT_SCENARIO = """ +```solidity +contract Bug{ + uint UINT_MAX = 2^256 - 1; + ... +} +``` +Alice deploys a contract in which `UINT_MAX` incorrectly uses `^` operator instead of `**` for exponentiation""" + + WIKI_RECOMMENDATION = "Use the correct operator `**` for exponentiation." + + def _detect(self) -> List[Output]: + """Detect the incorrect operator usage for exponentiation where bitwise xor ^ is used instead of ** + + Returns: + list: (function, node) + """ + results: List[Output] = [] + for c in self.compilation_unit.contracts_derived: + res = _detect_incorrect_operator(c) + for (func, node) in res: + info: DETECTOR_INFO = [ + func, + " has bitwise-xor operator ^ instead of the exponentiation operator **: \n", + ] + info += ["\t - ", node, "\n"] + results.append(self.generate_result(info)) + + return results diff --git a/slither/detectors/statements/tautological_compare.py b/slither/detectors/statements/tautological_compare.py new file mode 100644 index 0000000000..0dc34b582f --- /dev/null +++ b/slither/detectors/statements/tautological_compare.py @@ -0,0 +1,69 @@ +from typing import List +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.slithir.operations import ( + Binary, + BinaryType, +) + +from slither.core.declarations import Function +from slither.utils.output import Output + + +class TautologicalCompare(AbstractDetector): + """ + Same variable comparison detector + """ + + ARGUMENT = "tautological-compare" + HELP = "Comparing a variable to itself always returns true or false, depending on comparison" + IMPACT = DetectorClassification.MEDIUM + CONFIDENCE = DetectorClassification.HIGH + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#tautological-compare" + + WIKI_TITLE = "Tautological compare" + WIKI_DESCRIPTION = "A variable compared to itself is probably an error as it will always return `true` for `==`, `>=`, `<=` and always `false` for `<`, `>` and `!=`." + WIKI_EXPLOIT_SCENARIO = """ +```solidity + function check(uint a) external returns(bool){ + return (a >= a); + } +``` +`check` always return true.""" + + WIKI_RECOMMENDATION = "Remove comparison or compare to different value." + + def _check_function(self, f: Function) -> List[Output]: + affected_nodes = set() + for node in f.nodes: + for ir in node.irs: + if isinstance(ir, Binary): + if ir.type in [ + BinaryType.GREATER, + BinaryType.GREATER_EQUAL, + BinaryType.LESS, + BinaryType.LESS_EQUAL, + BinaryType.EQUAL, + BinaryType.NOT_EQUAL, + ]: + if ir.variable_left == ir.variable_right: + affected_nodes.add(node) + + results = [] + for n in affected_nodes: + info: DETECTOR_INFO = [f, " compares a variable to itself:\n\t", n, "\n"] + res = self.generate_result(info) + results.append(res) + return results + + def _detect(self): + results = [] + + for f in self.compilation_unit.functions_and_modifiers: + results.extend(self._check_function(f)) + + return results diff --git a/tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol b/tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol new file mode 100644 index 0000000000..ede2f0fc18 --- /dev/null +++ b/tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol @@ -0,0 +1,6 @@ + +contract A{ + function check(uint a) external returns(bool){ + return (a >= a); + } +} \ No newline at end of file diff --git a/tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol-0.8.20.zip b/tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol-0.8.20.zip new file mode 100644 index 0000000000000000000000000000000000000000..05b78fad0871c604d79bcb87bb5f0eeedc3d9cea GIT binary patch literal 2032 zcmai#Ydq5n1IPb!zvQ|~mSgS;F_(o!ZiUX!TneqR4(58yZA3)I*$fpO#By1YCYR){ z4JnkJL<%7?xuhl6i5XAldH;N#-|xlu&F}5+^F<*Ag{%MpKpME}hV&F8q}*yfd%1_&G*s*XOiGzt+spL^@-{RJuC?U zOW|W=dETh@(Ls&iWpfy;frU3%KGpG*H;lXJ;86DmMT}pba9fAb#e5Hm9%^zgfToc6 zeu~N2E1ww0{(@Ps42^Yf$2D|g#9y@4MDs+O|Fqn^VRM^E%HH&T%5_aPyWHNNZp00m zZ<*6Hk!ly;mRU&1!COHSR6i-ogDY_>CkmXh+ov7f)iHCqp?-W&2c-%d|4fZ%Uq2Iv zGg>Np8MtwB$PTSkW?6KI8RY2P;b)T|hYQgcOpQ^(EO5EVxBj7>u zD^itIwwv>j0A9^c};AP!!gw z5|^os{ZO)YdnoVH=Ymad?uJe=?UI*914S{~?{*j(D>Op-w z4FVU-y+7=BCxGVM1^ih*KfqcDtFjKL`!0g?UOoALyjH52UfP-uH*`bYyBG-i#-M^ZG#jhJB8@bFWJTTW?R7irU|p`e^th7~%27IX7MGOUX+_HD?x&A4`=n-X2}f3#oc9*a~C44wG(|jA`6S0dhJb%-AwTKH;3K-A6dyZ}lT? ztGRHH0s9s-$gR*pw`y`hfhY-bRV|+No>DX-=hXMOjKPdYjiIS~mz1kVH@dczo%JK1 zXMy&j3Jq(i6{qcU*0bug!bU2Q?Dm<(i>UJ5io2+>eaS`aFr{z7PGiwG{-6p<)LeXt z6Ca-m|5WEn|LsU+t&dX;0U_soyn<1m#pPbGzehz`usV<9Njov;&}b`f2=3%tQ|(nO zartbkKD75Jjh)ctP>?JhZg*WPU7lt6BQNKNx-31ZqtaN}WQV_z+4%E?$BVThMNal7 z0oB!)0BrB{iu+~4-oqB%yl+(;uM(Vs(V-$ArROA*DhQ_8e)Bc5v4E6kr^yJx%=eFF zs&!scO_ZpgLx2N=ZhF7SbvV}=u*4gW5DXYHT)Jf*=xN#!G1B{GsX0FW2;l@}j+tO$ z8N-?0?lU$0=NmXE`A6uiS1#~!@Na9meU&L9aXf*c;&^u)Rjy}Xq3>5V5i9aXE{;BS z+>9m`?yCki2b64uFSAhZl z)TnTxb<0|q6I`z(P5QtaO7vL*FW=xBC2fF1b#YUbAy~}B38exy*OGajmTit|-%7*n zRIdB)U)3N_e-=<$hln;z*&Q-_9ahu0R@QX5ME((#oc>@@07a8Bt(<^qkNO zwpC1Ble02@3dL(SmJ2+CxnA2ox#GT03uP^j`&wT=@ar^c<4!#n=`~Y_E5VLn!7H&O zxS1*@(hQ1OT9}z_L$5OjGz?gf)bKE;vT)aek~}R5C!s{xW33bqx}(|v+nukvBg%QY zk;HXQ(2ud5bL(W08`xaC=}_BtjqPZIZnsgs2>Q(qFe$$_V@k z#=(Q>^(XF=15FMz5cWLGd^Rbzwe1JU_N+VxUy;+2k*1PSxPFzdH@R;9I1xN)h(0gW z>hY+B#Ay0HiPxPheus=?A5KU0w{`7gzA5mX;k*w>$+YVYNTU$rl!M>(7I@X7X)%>0IU=`u< z6}c5DKG=N08qNfNeZ}14t6ig_kRSmo!T+t}Uq=3KQb7OW|Hv7I6c+h+2KrU!U(EjH HbpZGeo!!Aw literal 0 HcmV?d00001 diff --git a/tests/e2e/detectors/test_detectors.py b/tests/e2e/detectors/test_detectors.py index 9ca1bfcde9..99e9095fff 100644 --- a/tests/e2e/detectors/test_detectors.py +++ b/tests/e2e/detectors/test_detectors.py @@ -1664,6 +1664,16 @@ def id_test(test_item: Test): "incorrect_return.sol", "0.8.10", ), + Test( + all_detectors.IncorrectOperatorExponentiation, + "incorrect_exp.sol", + "0.7.6", + ), + Test( + all_detectors.TautologicalCompare, + "compare.sol", + "0.8.20", + ), ] GENERIC_PATH = "/GENERIC_PATH" From 538539ba9e9eb97a3ffbba87e181cb8118d40df7 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Wed, 11 Oct 2023 10:32:42 +0200 Subject: [PATCH 163/169] Add return-bomb detector --- slither/detectors/all_detectors.py | 1 + slither/detectors/statements/return_bomb.py | 123 ++++++++++++++++++ ...r_ReturnBomb_0_8_20_return_bomb_sol__0.txt | 5 + ...tologicalCompare_0_8_20_compare_sol__0.txt | 3 + .../return-bomb/0.8.20/return_bomb.sol | 57 ++++++++ .../0.8.20/return_bomb.sol-0.8.20.zip | Bin 0 -> 7966 bytes tests/e2e/detectors/test_detectors.py | 5 + 7 files changed, 194 insertions(+) create mode 100644 slither/detectors/statements/return_bomb.py create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_ReturnBomb_0_8_20_return_bomb_sol__0.txt create mode 100644 tests/e2e/detectors/snapshots/detectors__detector_TautologicalCompare_0_8_20_compare_sol__0.txt create mode 100644 tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol create mode 100644 tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol-0.8.20.zip diff --git a/slither/detectors/all_detectors.py b/slither/detectors/all_detectors.py index 97622f8878..fab9562d20 100644 --- a/slither/detectors/all_detectors.py +++ b/slither/detectors/all_detectors.py @@ -96,3 +96,4 @@ from .assembly.return_instead_of_leave import ReturnInsteadOfLeave from .operations.incorrect_exp import IncorrectOperatorExponentiation from .statements.tautological_compare import TautologicalCompare +from .statements.return_bomb import ReturnBomb diff --git a/slither/detectors/statements/return_bomb.py b/slither/detectors/statements/return_bomb.py new file mode 100644 index 0000000000..8b6cd07a29 --- /dev/null +++ b/slither/detectors/statements/return_bomb.py @@ -0,0 +1,123 @@ +from typing import List + +from slither.core.cfg.node import Node +from slither.core.declarations import Contract +from slither.core.declarations.function import Function +from slither.core.solidity_types import Type +from slither.detectors.abstract_detector import ( + AbstractDetector, + DetectorClassification, + DETECTOR_INFO, +) +from slither.slithir.operations import LowLevelCall, HighLevelCall +from slither.analyses.data_dependency.data_dependency import is_tainted +from slither.utils.output import Output + + +class ReturnBomb(AbstractDetector): + + ARGUMENT = "return-bomb" + HELP = "A low level callee may consume all callers gas unexpectedly." + IMPACT = DetectorClassification.LOW + CONFIDENCE = DetectorClassification.MEDIUM + + WIKI = "https://github.com/crytic/slither/wiki/Detector-Documentation#return-bomb" + + WIKI_TITLE = "Return Bomb" + WIKI_DESCRIPTION = "A low level callee may consume all callers gas unexpectedly." + WIKI_EXPLOIT_SCENARIO = """ +```solidity +//Modified from https://github.com/nomad-xyz/ExcessivelySafeCall +contract BadGuy { + function youveActivateMyTrapCard() external pure returns (bytes memory) { + assembly{ + revert(0, 1000000) + } + } +} + +contract Mark { + function oops(address badGuy) public{ + bool success; + bytes memory ret; + + // Mark pays a lot of gas for this copy + //(success, ret) = badGuy.call{gas:10000}( + (success, ret) = badGuy.call( + abi.encodeWithSelector( + BadGuy.youveActivateMyTrapCard.selector + ) + ); + + // Mark may OOG here, preventing local state changes + //importantCleanup(); + } +} + +``` +After Mark calls BadGuy bytes are copied from returndata to memory, the memory expansion cost is paid. This means that when using a standard solidity call, the callee can "returnbomb" the caller, imposing an arbitrary gas cost. +Callee unexpectedly makes the caller OOG. +""" + + WIKI_RECOMMENDATION = "Avoid unlimited implicit decoding of returndata." + + @staticmethod + def is_dynamic_type(ty: Type) -> bool: + # ty.is_dynamic ? + name = str(ty) + if "[]" in name or name in ("bytes", "string"): + return True + return False + + def get_nodes_for_function(self, function: Function, contract: Contract) -> List[Node]: + nodes = [] + for node in function.nodes: + for ir in node.irs: + if isinstance(ir, (HighLevelCall, LowLevelCall)): + if not is_tainted(ir.destination, contract): # type:ignore + # Only interested if the target address is controlled/tainted + continue + + if isinstance(ir, HighLevelCall) and isinstance(ir.function, Function): + # in normal highlevel calls return bombs are _possible_ + # if the return type is dynamic and the caller tries to copy and decode large data + has_dyn = False + if ir.function.return_type: + has_dyn = any( + self.is_dynamic_type(ty) for ty in ir.function.return_type + ) + + if not has_dyn: + continue + + # If a gas budget was specified then the + # user may not know about the return bomb + if ir.call_gas is None: + # if a gas budget was NOT specified then the caller + # may already suspect the call may spend all gas? + continue + + nodes.append(node) + # TODO: check that there is some state change after the call + + return nodes + + def _detect(self) -> List[Output]: + results = [] + + for contract in self.compilation_unit.contracts: + for function in contract.functions_declared: + nodes = self.get_nodes_for_function(function, contract) + if nodes: + info: DETECTOR_INFO = [ + function, + " tries to limit the gas of an external call that controls implicit decoding\n", + ] + + for node in sorted(nodes, key=lambda x: x.node_id): + info += ["\t", node, "\n"] + + res = self.generate_result(info) + results.append(res) + + return results diff --git a/tests/e2e/detectors/snapshots/detectors__detector_ReturnBomb_0_8_20_return_bomb_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_ReturnBomb_0_8_20_return_bomb_sol__0.txt new file mode 100644 index 0000000000..f53b5233fd --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_ReturnBomb_0_8_20_return_bomb_sol__0.txt @@ -0,0 +1,5 @@ +Mark.oops(address) (tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol#31-55) tries to limit the gas of an external call that controls implicit decoding + ret1 = BadGuy(badGuy).fbad{gas: 2000}() (tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol#42) + (x,str) = BadGuy(badGuy).fbad1{gas: 2000}() (tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol#44) + (success,ret) = badGuy.call{gas: 10000}(abi.encodeWithSelector(BadGuy.llbad.selector)) (tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol#47-51) + diff --git a/tests/e2e/detectors/snapshots/detectors__detector_TautologicalCompare_0_8_20_compare_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_TautologicalCompare_0_8_20_compare_sol__0.txt new file mode 100644 index 0000000000..76685043ce --- /dev/null +++ b/tests/e2e/detectors/snapshots/detectors__detector_TautologicalCompare_0_8_20_compare_sol__0.txt @@ -0,0 +1,3 @@ +A.check(uint256) (tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol#3-5) compares a variable to itself: + (a >= a) (tests/e2e/detectors/test_data/tautological-compare/0.8.20/compare.sol#4) + diff --git a/tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol b/tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol new file mode 100644 index 0000000000..76413fdcaa --- /dev/null +++ b/tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol @@ -0,0 +1,57 @@ +contract BadGuy { + function llbad() external pure returns (bytes memory) { + assembly{ + revert(0, 1000000) + } + } + + function fgood() external payable returns (uint){ + assembly{ + return(0, 1000000) + } + } + + function fbad() external payable returns (uint[] memory){ + assembly{ + return(0, 1000000) + } + } + + function fbad1() external payable returns (uint, string memory){ + assembly{ + return(0, 1000000) + } + } + + +} + +contract Mark { + + function oops(address badGuy) public{ + bool success; + string memory str; + bytes memory ret; + uint x; + uint[] memory ret1; + + x = BadGuy(badGuy).fgood{gas:2000}(); + + ret1 = BadGuy(badGuy).fbad(); //good (no gas specified) + + ret1 = BadGuy(badGuy).fbad{gas:2000}(); + + (x, str) = BadGuy(badGuy).fbad1{gas:2000}(); + + // Mark pays a lot of gas for this copy 😬😬😬 + (success, ret) = badGuy.call{gas:10000}( + abi.encodeWithSelector( + BadGuy.llbad.selector + ) + ); + + // Mark may OOG here, preventing local state changes + //importantCleanup(); + } +} + diff --git a/tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol-0.8.20.zip b/tests/e2e/detectors/test_data/return-bomb/0.8.20/return_bomb.sol-0.8.20.zip new file mode 100644 index 0000000000000000000000000000000000000000..4c10ea6fea0dfc804d3fef44769721e1be8d5765 GIT binary patch literal 7966 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 Date: Thu, 12 Oct 2023 14:47:31 +0200 Subject: [PATCH 164/169] Minor improvements --- slither/__main__.py | 19 ++++++++++ slither/core/slither_core.py | 22 +++++++++++ slither/utils/command_line.py | 2 + slither/utils/sarif.py | 71 +++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 slither/utils/sarif.py diff --git a/slither/__main__.py b/slither/__main__.py index c639200362..f4fca54937 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -79,6 +79,11 @@ def process_single( ast = "--ast-json" slither = Slither(target, ast_format=ast, **vars(args)) + if args.sarif_input: + slither.sarif_input = args.sarif_input + if args.sarif_triage: + slither.sarif_triage = args.sarif_triage + return _process(slither, detector_classes, printer_classes) @@ -469,6 +474,20 @@ def parse_args( default=defaults_flag_in_config["sarif"], ) + group_misc.add_argument( + "--sarif-input", + help="Sarif input (beta)", + action="store", + default=defaults_flag_in_config["sarif_input"], + ) + + group_misc.add_argument( + "--sarif-triage", + help="Sarif triage (beta)", + action="store", + default=defaults_flag_in_config["sarif_triage"], + ) + group_misc.add_argument( "--json-types", help="Comma-separated list of result types to output to JSON, defaults to " diff --git a/slither/core/slither_core.py b/slither/core/slither_core.py index 798008707f..e6bbef8ff4 100644 --- a/slither/core/slither_core.py +++ b/slither/core/slither_core.py @@ -21,6 +21,7 @@ from slither.core.source_mapping.source_mapping import SourceMapping, Source from slither.slithir.variables import Constant from slither.utils.colors import red +from slither.utils.sarif import read_triage_info from slither.utils.source_mapping import get_definition, get_references, get_implementation logger = logging.getLogger("Slither") @@ -48,6 +49,10 @@ def __init__(self) -> None: self._source_code_to_line: Optional[Dict[str, List[str]]] = None self._previous_results_filename: str = "slither.db.json" + + # TODO: add cli flag to set these variables + self.sarif_input: str = "export.sarif" + self.sarif_triage: str = "export.sarif.sarifexplorer" self._results_to_hide: List = [] self._previous_results: List = [] # From triaged result @@ -444,6 +449,8 @@ def valid_result(self, r: Dict) -> bool: return True def load_previous_results(self) -> None: + self.load_previous_results_from_sarif() + filename = self._previous_results_filename try: if os.path.isfile(filename): @@ -453,9 +460,24 @@ def load_previous_results(self) -> None: for r in self._previous_results: if "id" in r: self._previous_results_ids.add(r["id"]) + except json.decoder.JSONDecodeError: logger.error(red(f"Impossible to decode {filename}. Consider removing the file")) + def load_previous_results_from_sarif(self) -> None: + sarif = pathlib.Path(self.sarif_input) + triage = pathlib.Path(self.sarif_triage) + + if not sarif.exists(): + return + if not triage.exists(): + return + + triaged = read_triage_info(sarif, triage) + + for id_triaged in triaged: + self._previous_results_ids.add(id_triaged) + def write_results_to_hide(self) -> None: if not self._results_to_hide: return diff --git a/slither/utils/command_line.py b/slither/utils/command_line.py index 0824725821..6c50fcab93 100644 --- a/slither/utils/command_line.py +++ b/slither/utils/command_line.py @@ -68,6 +68,8 @@ class FailOnLevel(enum.Enum): "zip_type": "lzma", "show_ignored_findings": False, "no_fail": False, + "sarif_input": "export.sarif", + "sarif_triage": "export.sarif.sarifexplorer", **DEFAULTS_FLAG_IN_CONFIG_CRYTIC_COMPILE, } diff --git a/slither/utils/sarif.py b/slither/utils/sarif.py new file mode 100644 index 0000000000..600ac35c76 --- /dev/null +++ b/slither/utils/sarif.py @@ -0,0 +1,71 @@ +""" +Various utils for sarif/vscode +""" +import json +from pathlib import Path +from typing import List, Dict, Optional, Tuple, Any + + +def _parse_index(key: str) -> Optional[Tuple[int, int]]: + if key.count(":") != 2: + return None + + try: + run = int(key[key.find(":") + 1 : key.rfind(":")]) + index = int(key[key.rfind(":") + 1 :]) + return run, index + except ValueError: + return None + + +def _get_indexes(path_to_triage: Path) -> List[Tuple[int, int]]: + try: + with open(path_to_triage, encoding="utf8") as file_desc: + triage = json.load(file_desc) + except json.decoder.JSONDecodeError: + return [] + + resultIdToNotes: Dict[str, Dict] = triage.get("resultIdToNotes", {}) + + indexes: List[Tuple[int, int]] = [] + for key, data in resultIdToNotes.items(): + if "status" in data and data["status"] == 1: + parsed = _parse_index(key) + if parsed: + indexes.append(parsed) + + return indexes + + +def read_triage_info(path_to_sarif: Path, path_to_triage: Path) -> List[str]: + try: + with open(path_to_sarif, encoding="utf8") as file_desc: + sarif = json.load(file_desc) + except json.decoder.JSONDecodeError: + return [] + + runs: List[Dict[str, Any]] = sarif.get("runs", []) + + # Don't support multiple runs for now + if len(runs) != 1: + return [] + + run_results: List[Dict] = runs[0].get("results", []) + + indexes = _get_indexes(path_to_triage) + + ids: List[str] = [] + for run, index in indexes: + + # We dont support multiple runs for now + if run != 0: + continue + try: + elem = run_results[index] + except KeyError: + continue + if "partialFingerprints" in elem: + if "id" in elem["partialFingerprints"]: + ids.append(elem["partialFingerprints"]["id"]) + + return ids From 37d714bb0cf798d91c497a07e0ad2bbade5e33c9 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 12 Oct 2023 15:52:55 +0200 Subject: [PATCH 165/169] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 905470920f..16aa805680 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ "prettytable>=3.3.0", "pycryptodome>=3.4.6", # "crytic-compile>=0.3.1,<0.4.0", - "crytic-compile@git+https://github.com/crytic/crytic-compile.git@feat/vyper-standard-json#egg=crytic-compile", + "crytic-compile@git+https://github.com/crytic/crytic-compile.git@master#egg=crytic-compile", "web3>=6.0.0", "eth-abi>=4.0.0", "eth-typing>=3.0.0", From 98da04fb06bd3018995bce6136440919354a4140 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 12 Oct 2023 16:01:19 +0200 Subject: [PATCH 166/169] Minor --- slither/core/variables/variable.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/slither/core/variables/variable.py b/slither/core/variables/variable.py index 1afcc47575..f9ef190246 100644 --- a/slither/core/variables/variable.py +++ b/slither/core/variables/variable.py @@ -179,4 +179,6 @@ def solidity_signature(self) -> str: return f'{name}({",".join(parameters)})' def __str__(self) -> str: + if self._name is None: + return "" return self._name From 4a8385813f0cf9df945fc8519090d8e8923cf9f4 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 12 Oct 2023 16:11:21 +0200 Subject: [PATCH 167/169] fix CI --- tests/unit/slithir/test_ssa_generation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/slithir/test_ssa_generation.py b/tests/unit/slithir/test_ssa_generation.py index 688c0a5fb1..1ecf82a2dd 100644 --- a/tests/unit/slithir/test_ssa_generation.py +++ b/tests/unit/slithir/test_ssa_generation.py @@ -1118,7 +1118,7 @@ def test_issue_1846_ternary_in_ternary(slither_from_solidity_source): assert node.son_false.type == NodeType.EXPRESSION -def test_issue_2016(slither_from_source): +def test_issue_2016(slither_from_solidity_source): source = """ contract Contract { function test() external { @@ -1126,7 +1126,7 @@ def test_issue_2016(slither_from_source): } } """ - with slither_from_source(source) as slither: + with slither_from_solidity_source(source) as slither: c = slither.get_contract_from_name("Contract")[0] f = c.functions[0] operations = f.slithir_operations From 2a7e514a5d2db8276c6bef675e137a3cbf92a780 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Thu, 12 Oct 2023 16:24:41 +0200 Subject: [PATCH 168/169] Fix snapshot --- .../snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt | 2 +- .../ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt | 2 +- .../snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt | 2 +- .../snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt index 3c6eaec3e1..1f973fcdb6 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_c__0.txt @@ -8,7 +8,7 @@ EXPRESSION: user_shares = () IRs: -user_shares(uint256[10]) = []"]; +user_shares(uint256[10]) = []"]; 1->2; 2[label="Node Type: EXPRESSION 2 diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt index 9b7768a6b5..4719d99269 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_builtins_test_builtins__0.txt @@ -66,7 +66,7 @@ i = slice()(msg.data,0,32) IRs: TMP_1(None) = SOLIDITY_CALL slice()(msg.data,0,32) -i(bytes[32]) = ['TMP_1(None)']"]; +i(bytes[32]) = ['TMP_1(None)']"]; 8->9; 9[label="Node Type: NEW VARIABLE 9 diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt index c1f5f2f13d..9e35f147e3 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_for2_for_loop__0.txt @@ -8,7 +8,7 @@ EXPRESSION: _strategies = strategies IRs: -_strategies(address[3]) = ['strategies(address[3])']"]; +_strategies(address[3]) = ['strategies(address[3])']"]; 1->2; 2[label="Node Type: BEGIN_LOOP 2 "]; diff --git a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt index 15a091f260..ac49178228 100644 --- a/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt +++ b/tests/e2e/vyper_parsing/snapshots/ast_parsing__vyper_cfgir_initarry_coins__0.txt @@ -10,7 +10,7 @@ EXPRESSION: IRs: TMP_2 = CONVERT BORROWED_TOKEN to address TMP_3 = CONVERT COLLATERAL_TOKEN to address -TMP_4(address[2]) = ['TMP_2(address)', 'TMP_3(address)'] +TMP_4(address[2]) = ['TMP_2(address)', 'TMP_3(address)'] REF_0(address) -> TMP_4[i] RETURN REF_0"]; } From 73f2dc6989242398297cddd7876aefaa4b945181 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Fri, 13 Oct 2023 10:28:46 +0200 Subject: [PATCH 169/169] Revert #1984 --- slither/core/dominators/utils.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/slither/core/dominators/utils.py b/slither/core/dominators/utils.py index 77ff22611f..eb20ef00cb 100644 --- a/slither/core/dominators/utils.py +++ b/slither/core/dominators/utils.py @@ -9,16 +9,21 @@ def intersection_predecessor(node: "Node") -> Set["Node"]: if not node.fathers: return set() - if not any(father.is_reachable for father in node.fathers): - return set() - - ret = set() - for pred in node.fathers: - ret = ret.union(pred.dominators) - for pred in node.fathers: - if pred.is_reachable: - ret = ret.intersection(pred.dominators) + # Revert PR1984 + ret = node.fathers[0].dominators + for pred in node.fathers[1:]: + ret = ret.intersection(pred.dominators) + # if not any(father.is_reachable for father in node.fathers): + # return set() + # + # ret = set() + # for pred in node.fathers: + # ret = ret.union(pred.dominators) + # + # for pred in node.fathers: + # if pred.is_reachable: + # ret = ret.intersection(pred.dominators) return ret @@ -91,8 +96,9 @@ def compute_dominance_frontier(nodes: List["Node"]) -> None: for node in nodes: if len(node.fathers) >= 2: for father in node.fathers: - if not father.is_reachable: - continue + # Revert PR1984 + # if not father.is_reachable: + # continue runner = father # Corner case: if there is a if without else # we need to add update the conditional node