|
|
@ -67,19 +67,12 @@ class Issue: |
|
|
|
|
|
|
|
|
|
|
|
@property |
|
|
|
@property |
|
|
|
def transaction_sequence_users(self): |
|
|
|
def transaction_sequence_users(self): |
|
|
|
""" Returns the transaction sequence in json without pre-generated block data""" |
|
|
|
""" Returns the transaction sequence without pre-generated block data""" |
|
|
|
return ( |
|
|
|
return self.transaction_sequence |
|
|
|
json.dumps(self.transaction_sequence, indent=4) |
|
|
|
|
|
|
|
if self.transaction_sequence |
|
|
|
|
|
|
|
else None |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property |
|
|
|
@property |
|
|
|
def transaction_sequence_jsonv2(self): |
|
|
|
def transaction_sequence_jsonv2(self): |
|
|
|
""" |
|
|
|
""" Returns the transaction sequence as a json string with pre-generated block data""" |
|
|
|
Returns the transaction sequence with pre-generated block data. |
|
|
|
|
|
|
|
Jsonv2 tx sequence isn't formatted for user readability. |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
return ( |
|
|
|
return ( |
|
|
|
self.add_block_data(self.transaction_sequence) |
|
|
|
self.add_block_data(self.transaction_sequence) |
|
|
|
if self.transaction_sequence |
|
|
|
if self.transaction_sequence |
|
|
@ -105,6 +98,7 @@ class Issue: |
|
|
|
|
|
|
|
|
|
|
|
:return: |
|
|
|
:return: |
|
|
|
""" |
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
issue = { |
|
|
|
issue = { |
|
|
|
"title": self.title, |
|
|
|
"title": self.title, |
|
|
|
"swc-id": self.swc_id, |
|
|
|
"swc-id": self.swc_id, |
|
|
@ -113,7 +107,7 @@ class Issue: |
|
|
|
"function": self.function, |
|
|
|
"function": self.function, |
|
|
|
"severity": self.severity, |
|
|
|
"severity": self.severity, |
|
|
|
"address": self.address, |
|
|
|
"address": self.address, |
|
|
|
"tx_sequence": self.transaction_sequence_users, |
|
|
|
"tx_sequence": self.transaction_sequence, |
|
|
|
"min_gas_used": self.min_gas_used, |
|
|
|
"min_gas_used": self.min_gas_used, |
|
|
|
"max_gas_used": self.max_gas_used, |
|
|
|
"max_gas_used": self.max_gas_used, |
|
|
|
"sourceMap": self.source_mapping, |
|
|
|
"sourceMap": self.source_mapping, |
|
|
@ -165,13 +159,13 @@ class Report: |
|
|
|
loader=PackageLoader("mythril.analysis"), trim_blocks=True |
|
|
|
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.issues = {} |
|
|
|
self.verbose = verbose |
|
|
|
|
|
|
|
self.solc_version = "" |
|
|
|
self.solc_version = "" |
|
|
|
self.meta = {} |
|
|
|
self.meta = {} |
|
|
|
self.source = Source() |
|
|
|
self.source = Source() |
|
|
@ -203,9 +197,7 @@ class Report: |
|
|
|
name = self._file_name() |
|
|
|
name = self._file_name() |
|
|
|
template = Report.environment.get_template("report_as_text.jinja2") |
|
|
|
template = Report.environment.get_template("report_as_text.jinja2") |
|
|
|
|
|
|
|
|
|
|
|
return template.render( |
|
|
|
return template.render(filename=name, issues=self.sorted_issues()) |
|
|
|
filename=name, issues=self.sorted_issues(), verbose=self.verbose |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def as_json(self): |
|
|
|
def as_json(self): |
|
|
|
""" |
|
|
|
""" |
|
|
@ -274,9 +266,7 @@ class Report: |
|
|
|
""" |
|
|
|
""" |
|
|
|
filename = self._file_name() |
|
|
|
filename = self._file_name() |
|
|
|
template = Report.environment.get_template("report_as_markdown.jinja2") |
|
|
|
template = Report.environment.get_template("report_as_markdown.jinja2") |
|
|
|
return template.render( |
|
|
|
return template.render(filename=filename, issues=self.sorted_issues()) |
|
|
|
filename=filename, issues=self.sorted_issues(), verbose=self.verbose |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _file_name(self): |
|
|
|
def _file_name(self): |
|
|
|
""" |
|
|
|
""" |
|
|
|