mirror of https://github.com/ConsenSys/mythril
parent
ffea1a2cda
commit
8a526ad48e
@ -1,48 +0,0 @@ |
||||
import re |
||||
from typing import List |
||||
from z3 import * |
||||
from mythril.laser.ethereum.transaction import ContractCreationTransaction |
||||
from mythril.laser.ethereum.state.global_state import GlobalState |
||||
|
||||
|
||||
def get_non_creator_constraints(state: GlobalState) -> (List, bool): |
||||
""" |
||||
Get constraints which say that the caller isn't the creator of the contract |
||||
:param state: The state |
||||
:return: tuple of (constraints, bool) where the bool says whether the caller is constrained or not |
||||
""" |
||||
not_creator_constraints = [] |
||||
creator = None |
||||
if isinstance( |
||||
state.world_state.transaction_sequence[0], ContractCreationTransaction |
||||
): |
||||
creator = state.world_state.transaction_sequence[0].caller |
||||
|
||||
if creator is not None: |
||||
for transaction in state.world_state.transaction_sequence[1:]: |
||||
not_creator_constraints.append( |
||||
Not(Extract(159, 0, transaction.caller) == Extract(159, 0, creator)) |
||||
) |
||||
not_creator_constraints.append( |
||||
Not(Extract(159, 0, transaction.caller) == 0) |
||||
) |
||||
else: |
||||
for transaction in state.world_state.transaction_sequence: |
||||
not_creator_constraints.append( |
||||
Not(Extract(159, 0, transaction.caller) == 0) |
||||
) |
||||
if not has_caller_check_constraint(state.mstate.constraints): |
||||
return [], True |
||||
return not_creator_constraints, False |
||||
|
||||
|
||||
def has_caller_check_constraint(constraints: List) -> bool: |
||||
""" |
||||
Checks whether the caller is constrained to a value or not |
||||
""" |
||||
for constraint in constraints: |
||||
if re.search( |
||||
r"caller.*==[0-9]{20}", str(constraint).replace("\n", "").replace(" ", "") |
||||
): |
||||
return False |
||||
return True |
Loading…
Reference in new issue