예제 #1
0
def get_callee_account(
    global_state: GlobalState,
    callee_address: Union[str, BitVec],
    dynamic_loader: DynLoader,
):
    """Gets the callees account from the global_state.

    :param global_state: state to look in
    :param callee_address: address of the callee
    :param dynamic_loader: dynamic loader to use
    :return: Account belonging to callee
    """
    if isinstance(callee_address, BitVec):
        if callee_address.symbolic:
            return Account(callee_address,
                           balances=global_state.world_state.balances)
        else:
            callee_address = hex(callee_address.value)[2:]

    try:
        return global_state.accounts[int(callee_address, 16)]
    except KeyError:
        # We have a valid call address, but contract is not in the modules list
        log.debug("Module with address %s not loaded.", callee_address)

    if dynamic_loader is None:
        raise ValueError("dynamic_loader is None")

    log.debug("Attempting to load dependency")

    try:
        code = dynamic_loader.dynld(callee_address)
    except ValueError as error:
        log.debug("Unable to execute dynamic loader because: %s", error)
        raise error
    if code is None:
        log.debug("No code returned, not a contract account?")
        raise ValueError("No code returned")
    log.debug("Dependency loaded: " + callee_address)

    callee_account = Account(
        symbol_factory.BitVecVal(int(callee_address, 16), 256),
        code,
        callee_address,
        dynamic_loader=dynamic_loader,
        balances=global_state.world_state.balances,
    )
    global_state.accounts[int(callee_address, 16)] = callee_account

    return callee_account
예제 #2
0
def get_callee_account(global_state: GlobalState, callee_address: str,
                       dynamic_loader: DynLoader):
    """Gets the callees account from the global_state.

    :param global_state: state to look in
    :param callee_address: address of the callee
    :param dynamic_loader: dynamic loader to use
    :return: Account belonging to callee
    """
    environment = global_state.environment
    accounts = global_state.accounts

    try:
        return global_state.accounts[int(callee_address, 16)]
    except KeyError:
        # We have a valid call address, but contract is not in the modules list
        log.debug("Module with address " + callee_address + " not loaded.")

    if dynamic_loader is None:
        raise ValueError()

    log.debug("Attempting to load dependency")

    try:
        code = dynamic_loader.dynld(callee_address)
    except ValueError as error:
        log.debug("Unable to execute dynamic loader because: {}".format(
            str(error)))
        raise error
    if code is None:
        log.debug("No code returned, not a contract account?")
        raise ValueError()
    log.debug("Dependency loaded: " + callee_address)

    callee_account = Account(
        symbol_factory.BitVecVal(int(callee_address, 16), 256),
        code,
        callee_address,
        dynamic_loader=dynamic_loader,
        balances=global_state.world_state.balances,
    )
    accounts[callee_address] = callee_account

    return callee_account
예제 #3
0
 def accounts_exist_or_load(self, addr: str,
                            dynamic_loader: DynLoader) -> str:
     """
     returns account if it exists, else it loads from the dynamic loader
     :param addr: address
     :param dynamic_loader: Dynamic Loader
     :return: The code
     """
     addr_bitvec = symbol_factory.BitVecVal(int(addr, 16), 256)
     if addr_bitvec.value in self.accounts:
         code = self.accounts[addr_bitvec.value].code
     else:
         code = dynamic_loader.dynld(addr)
         self.create_account(balance=0,
                             address=addr_bitvec.value,
                             dynamic_loader=dynamic_loader)
     if code is None:
         code = ""
     else:
         code = code.bytecode
     return code