def get_call_params(self, computation: ComputationAPI) -> CallParams: gas = computation.stack_pop1_int() code_address = force_bytes_to_address(computation.stack_pop1_bytes()) ( memory_input_start_position, memory_input_size, memory_output_start_position, memory_output_size, ) = computation.stack_pop_ints(4) to = computation.msg.storage_address sender = computation.msg.sender value = computation.msg.value return ( gas, value, to, sender, code_address, memory_input_start_position, memory_input_size, memory_output_start_position, memory_output_size, False, # should_transfer_value, computation.msg.is_static, )
def mload(computation: ComputationAPI) -> None: start_position = computation.stack_pop1_int() computation.extend_memory(start_position, 32) value = computation.memory_read_bytes(start_position, 32) computation.stack_push_bytes(value)
def get_call_params(self, computation: ComputationAPI) -> CallParams: gas = computation.stack_pop1_int() to = force_bytes_to_address(computation.stack_pop1_bytes()) ( value, memory_input_start_position, memory_input_size, memory_output_start_position, memory_output_size, ) = computation.stack_pop_ints(5) return ( gas, value, to, None, # sender None, # code_address memory_input_start_position, memory_input_size, memory_output_start_position, memory_output_size, True, # should_transfer_value, computation.msg.is_static, )
def log_XX(computation: ComputationAPI, topic_count: int) -> None: if topic_count < 0 or topic_count > 4: raise TypeError("Invalid log topic size. Must be 0, 1, 2, 3, or 4") mem_start_position, size = computation.stack_pop_ints(2) if not topic_count: topics: Tuple[int, ...] = () elif topic_count > 1: topics = computation.stack_pop_ints(topic_count) else: topics = (computation.stack_pop1_int(), ) data_gas_cost = constants.GAS_LOGDATA * size topic_gas_cost = constants.GAS_LOGTOPIC * topic_count total_gas_cost = data_gas_cost + topic_gas_cost computation.consume_gas( total_gas_cost, reason="Log topic and data gas cost", ) computation.extend_memory(mem_start_position, size) log_data = computation.memory_read_bytes(mem_start_position, size) computation.add_log_entry( account=computation.msg.storage_address, topics=topics, data=log_data, )
def sload(computation: ComputationAPI) -> None: slot = computation.stack_pop1_int() value = computation.state.get_storage( address=computation.msg.storage_address, slot=slot, ) computation.stack_push_int(value)
def not_op(computation: ComputationAPI) -> None: """ Not """ value = computation.stack_pop1_int() result = constants.UINT_256_MAX - value computation.stack_push_int(result)
def mstore(computation: ComputationAPI) -> None: start_position = computation.stack_pop1_int() value = computation.stack_pop1_bytes() padded_value = value.rjust(32, b'\x00') normalized_value = padded_value[-32:] computation.extend_memory(start_position, 32) computation.memory_write(start_position, 32, normalized_value)
def calldataload(computation: ComputationAPI) -> None: """ Load call data into memory. """ start_position = computation.stack_pop1_int() value = computation.msg.data_as_bytes[start_position:start_position + 32] padded_value = value.ljust(32, b'\x00') normalized_value = padded_value.lstrip(b'\x00') computation.stack_push_bytes(normalized_value)
def iszero(computation: ComputationAPI) -> None: """ Not """ value = computation.stack_pop1_int() if value == 0: result = 1 else: result = 0 computation.stack_push_int(result)
def blockhash(computation: ComputationAPI) -> None: block_number = computation.stack_pop1_int() block_hash = computation.state.get_ancestor_hash(block_number) computation.stack_push_bytes(block_hash)