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
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
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