diff --git a/mythril/analysis/report.py b/mythril/analysis/report.py index 6e76c47c..fcc66713 100644 --- a/mythril/analysis/report.py +++ b/mythril/analysis/report.py @@ -67,19 +67,12 @@ class Issue: @property def transaction_sequence_users(self): - """ Returns the transaction sequence in json without pre-generated block data""" - return ( - json.dumps(self.transaction_sequence, indent=4) - if self.transaction_sequence - else None - ) + """ Returns the transaction sequence without pre-generated block data""" + return self.transaction_sequence @property def transaction_sequence_jsonv2(self): - """ - Returns the transaction sequence with pre-generated block data. - Jsonv2 tx sequence isn't formatted for user readability. - """ + """ Returns the transaction sequence as a json string with pre-generated block data""" return ( self.add_block_data(self.transaction_sequence) if self.transaction_sequence @@ -105,6 +98,7 @@ class Issue: :return: """ + issue = { "title": self.title, "swc-id": self.swc_id, @@ -113,7 +107,7 @@ class Issue: "function": self.function, "severity": self.severity, "address": self.address, - "tx_sequence": self.transaction_sequence_users, + "tx_sequence": self.transaction_sequence, "min_gas_used": self.min_gas_used, "max_gas_used": self.max_gas_used, "sourceMap": self.source_mapping, @@ -165,13 +159,13 @@ class Report: loader=PackageLoader("mythril.analysis"), trim_blocks=True ) - def __init__(self, verbose=False, contracts=None, exceptions=None): + def __init__(self, contracts=None, exceptions=None): """ - :param verbose: + :param contracts: + :param exceptions: """ self.issues = {} - self.verbose = verbose self.solc_version = "" self.meta = {} self.source = Source() @@ -203,9 +197,7 @@ class Report: name = self._file_name() template = Report.environment.get_template("report_as_text.jinja2") - return template.render( - filename=name, issues=self.sorted_issues(), verbose=self.verbose - ) + return template.render(filename=name, issues=self.sorted_issues()) def as_json(self): """ @@ -274,9 +266,7 @@ class Report: """ filename = self._file_name() template = Report.environment.get_template("report_as_markdown.jinja2") - return template.render( - filename=filename, issues=self.sorted_issues(), verbose=self.verbose - ) + return template.render(filename=filename, issues=self.sorted_issues()) def _file_name(self): """ diff --git a/mythril/analysis/templates/report_as_markdown.jinja2 b/mythril/analysis/templates/report_as_markdown.jinja2 index 289d1871..4fd73f84 100644 --- a/mythril/analysis/templates/report_as_markdown.jinja2 +++ b/mythril/analysis/templates/report_as_markdown.jinja2 @@ -24,15 +24,20 @@ In file: {{ issue.filename }}:{{ issue.lineno }} {{ issue.code }} ``` {% endif %} -{% if verbose and issue.tx_sequence %} --------------------- -### Debugging Information: +{% if issue.tx_sequence %} -{{ issue.tx_sequence }} +### Transaction Sequence +{% for step in issue.tx_sequence.steps %} +{% if step == issue.tx_sequence.steps[0] and step.input != "0x" and step.origin == "0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe" %} +Caller: [CREATOR], data: [CONTRACT CREATION], value: {{ step.value }} +{% else %} +Caller: {% if step.origin == "0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe" %}[CREATOR]{% elif step.origin == "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" %}[ATTACKER]{% else %}[SOMEGUY]{% endif %}, data: {{ step.input }}, value: {{ step.value }} {% endif %} {% endfor %} -{% else %} +{% endif %} +{% endfor %} +{% else %} The analysis was completed successfully. No issues were detected. {% endif %} diff --git a/mythril/analysis/templates/report_as_text.jinja2 b/mythril/analysis/templates/report_as_text.jinja2 index da962583..dd70bb45 100644 --- a/mythril/analysis/templates/report_as_text.jinja2 +++ b/mythril/analysis/templates/report_as_text.jinja2 @@ -18,11 +18,16 @@ In file: {{ issue.filename }}:{{ issue.lineno }} -------------------- {% endif %} -{% if verbose and issue.tx_sequence %} --------------------- +{% if issue.tx_sequence %} Transaction Sequence: -{{ issue.tx_sequence }} +{% for step in issue.tx_sequence.steps %} +{% if step == issue.tx_sequence.steps[0] and step.input != "0x" and step.origin == "0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe" %} +Caller: [CREATOR], data: [CONTRACT CREATION], value: {{ step.value }} +{% else %} +Caller: {% if step.origin == "0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe" %}[CREATOR]{% elif step.origin == "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" %}[ATTACKER]{% else %}[SOMEGUY]{% endif %}, data: {{ step.input }}, value: {{ step.value }} +{% endif %} +{% endfor %} {% endif %} {% endfor %} diff --git a/mythril/interfaces/cli.py b/mythril/interfaces/cli.py index 7d661218..a860ef50 100644 --- a/mythril/interfaces/cli.py +++ b/mythril/interfaces/cli.py @@ -119,11 +119,6 @@ def get_output_parser() -> ArgumentParser: help="report output format", metavar="", ) - parser.add_argument( - "--verbose-report", - action="store_true", - help="Include debugging information in report", - ) return parser @@ -599,7 +594,6 @@ def execute_command( modules=[m.strip() for m in args.modules.strip().split(",")] if args.modules else [], - verbose_report=args.verbose_report, transaction_count=args.transaction_count, ) outputs = { diff --git a/mythril/mythril/mythril_analyzer.py b/mythril/mythril/mythril_analyzer.py index d6267a94..3bef8203 100644 --- a/mythril/mythril/mythril_analyzer.py +++ b/mythril/mythril/mythril_analyzer.py @@ -122,12 +122,10 @@ class MythrilAnalyzer: def fire_lasers( self, modules: Optional[List[str]] = None, - verbose_report: bool = False, transaction_count: Optional[int] = None, ) -> Report: """ :param modules: The analysis modules which should be executed - :param verbose_report: Gives out the transaction sequence of the vulnerability :param transaction_count: The amount of transactions to be executed :return: The Report class which contains the all the issues/vulnerabilities """ @@ -177,7 +175,7 @@ class MythrilAnalyzer: source_data = Source() source_data.get_source_from_contracts_list(self.contracts) # Finally, output the results - report = Report(verbose_report, contracts=self.contracts, exceptions=exceptions) + report = Report(contracts=self.contracts, exceptions=exceptions) for issue in all_issues: report.append_issue(issue)