def apply_message( cls, state: StateAPI, message: MessageAPI, transaction_context: TransactionContextAPI) -> ComputationAPI: snapshot = state.snapshot() if message.depth > STACK_DEPTH_LIMIT: raise StackDepthLimit("Stack depth limit reached") if message.should_transfer_value and message.value: sender_balance = state.get_balance(message.sender) if sender_balance < message.value: raise InsufficientFunds( f"Insufficient funds: {sender_balance} < {message.value}") state.delta_balance(message.sender, -1 * message.value) state.delta_balance(message.storage_address, message.value) cls.logger.debug2( "TRANSFERRED: %s from %s -> %s", message.value, encode_hex(message.sender), encode_hex(message.storage_address), ) state.touch_account(message.storage_address) computation = cls.apply_computation( state, message, transaction_context, ) if computation.is_error: state.revert(snapshot) else: state.commit(snapshot) return computation
def apply_message(self) -> BaseComputation: snapshot = self.state.snapshot() if self.msg.depth > STACK_DEPTH_LIMIT: raise StackDepthLimit("Stack depth limit reached") if self.msg.should_transfer_value and self.msg.value: sender_balance = self.state.account_db.get_balance(self.msg.sender) if sender_balance < self.msg.value: raise InsufficientFunds("Insufficient funds: {0} < {1}".format( sender_balance, self.msg.value)) self.state.account_db.delta_balance(self.msg.sender, -1 * self.msg.value) self.state.account_db.delta_balance(self.msg.storage_address, self.msg.value) self.logger.trace( "TRANSFERRED: %s from %s -> %s", self.msg.value, encode_hex(self.msg.sender), encode_hex(self.msg.storage_address), ) self.state.account_db.touch_account(self.msg.storage_address) computation = self.apply_computation( self.state, self.msg, self.transaction_context, ) if computation.is_error: self.state.revert(snapshot) else: self.state.commit(snapshot) return computation