complement, compose, curry, dissoc, ) from web3.exceptions import ( ValidationError, ) from web3.middleware.formatting import ( construct_web3_formatting_middleware, ) MAX_EXTRADATA_LENGTH = 32 is_not_null = complement(is_null) @curry def validate_chain_id(web3, chain_id): if chain_id == web3.net.chainId: return chain_id else: raise ValidationError( "The transaction declared chain ID %r, " "but the connected node is on %r" % ( chain_id, "UNKNOWN", ) )
return seq[:index] normalize_topic_list = compose( remove_trailing_from_seq(remove_value=None), pop_singlets, ) def is_indexed(arg): if isinstance(arg, TopicArgumentFilter) is True: return True return False is_not_indexed = complement(is_indexed) class EventFilterBuilder: formatter = None _fromBlock = None _toBlock = None _address = None _immutable = False def __init__(self, event_abi, formatter=None): self.event_abi = event_abi self.formatter = formatter self.event_topic = initialize_event_topics(self.event_abi) self.args = AttributeDict( _build_argument_filters_from_event_abi(event_abi))
construct_formatting_middleware, ) def bytes_to_ascii(value): return codecs.decode(value, 'ascii') to_ascii_if_bytes = apply_formatter_if(is_bytes, bytes_to_ascii) to_integer_if_hex = apply_formatter_if(is_string, hex_to_integer) block_number_formatter = apply_formatter_if(is_integer, integer_to_hex) is_false = partial(operator.is_, False) is_not_false = complement(is_false) is_not_null = complement(is_null) @curry def to_hexbytes(num_bytes, val, variable_length=False): if isinstance(val, (str, int, bytes)): result = HexBytes(val) else: raise TypeError("Cannot convert %r to HexBytes" % val) extra_bytes = len(result) - num_bytes if extra_bytes == 0 or (variable_length and extra_bytes < 0): return result elif all(byte == 0 for byte in result[:extra_bytes]): return HexBytes(result[extra_bytes:])
""" self.data_filter_set = data_filter_set if any(data_filter_set): self.data_filter_set_function = match_fn(data_filter_set) def is_valid_entry(self, entry): if not self.data_filter_set: return True return bool(self.data_filter_set_function(entry['data'])) def decode_utf8_bytes(value): return value.decode("utf-8") not_text = complement(is_text) normalize_to_text = apply_formatter_if(not_text, decode_utf8_bytes) def normalize_data_values(type_string, data_value): """Decodes utf-8 bytes to strings for abi string values. eth-abi v1 returns utf-8 bytes for string values. This can be removed once eth-abi v2 is required. """ _type = parse_type_string(type_string) if _type.base == "string": if _type.arrlist is not None: return tuple((normalize_to_text(value) for value in data_value)) else: return normalize_to_text(data_value)
construct_fixture_middleware, construct_formatting_middleware, ) def is_named_block(value): return value in {"latest", "earliest", "pending"} def is_hexstr(value): return is_string(value) and is_hex(value) to_integer_if_hex = apply_formatter_if(is_hexstr, hex_to_integer) is_not_named_block = complement(is_named_block) TRANSACTION_KEY_MAPPINGS = { 'block_hash': 'blockHash', 'block_number': 'blockNumber', 'gas_price': 'gasPrice', 'transaction_hash': 'transactionHash', 'transaction_index': 'transactionIndex', } transaction_key_remapper = apply_key_map(TRANSACTION_KEY_MAPPINGS) LOG_KEY_MAPPINGS = { 'log_index': 'logIndex', 'transaction_index': 'transactionIndex', 'transaction_hash': 'transactionHash',
""" self.data_filter_set = data_filter_set if any(data_filter_set): self.data_filter_set_function = match_fn(data_filter_set) def is_valid_entry(self, entry): if not self.data_filter_set: return True return bool(self.data_filter_set_function(entry['data'])) def decode_utf8_bytes(value): return value.decode("utf-8") not_text = complement(is_text) normalize_to_text = apply_formatter_if(not_text, decode_utf8_bytes) def normalize_data_values(type_string, data_value): """Decodes utf-8 bytes to strings for abi string values. eth-abi v1 returns utf-8 bytes for string values. This can be removed once eth-abi v2 is required. """ _type = parse_type_string(type_string) if _type.base == "string": if _type.arrlist is not None: return tuple((normalize_to_text(value) for value in data_value)) else: return normalize_to_text(data_value)
def is_testrpc_available(): try: import testrpc # noqa: F401 return True except ImportError: return False to_integer_if_hex = apply_formatter_if(is_string, hex_to_integer) TRANSACTION_FORMATTERS = { 'to': apply_formatter_if( compose(complement(bool), decode_hex), static_return(None), ), } def ethtestrpc_string_middleware(make_request, web3): def middleware(method, params): return valmap(to_text, make_request(method, params)) return middleware ethtestrpc_middleware = construct_formatting_middleware( request_formatters={ 'eth_uninstallFilter': apply_formatter_at_index(to_integer_if_hex, 0), 'eth_getFilterChanges': apply_formatter_at_index(to_integer_if_hex, 0),
index -= 1 return seq[:index] normalize_topic_list = compose( remove_trailing_from_seq(remove_value=None), pop_singlets,) def is_indexed(arg): if isinstance(arg, TopicArgumentFilter) is True: return True return False is_not_indexed = complement(is_indexed) class EventFilterBuilder: formatter = None _fromBlock = None _toBlock = None _address = None _immutable = False def __init__(self, event_abi, formatter=None): self.event_abi = event_abi self.formatter = formatter self.event_topic = initialize_event_topics(self.event_abi) self.args = AttributeDict( _build_argument_filters_from_event_abi(event_abi))
def is_testrpc_available(): try: import testrpc # noqa: F401 return True except ImportError: return False to_integer_if_hex = apply_formatter_if(is_string, hex_to_integer) TRANSACTION_FORMATTERS = { 'to': apply_formatter_if( compose(complement(bool), decode_hex), static_return(None), ), } def ethtestrpc_string_middleware(make_request, web3): def middleware(method, params): return valmap(to_text, make_request(method, params)) return middleware ethtestrpc_middleware = construct_formatting_middleware( request_formatters={ 'eth_uninstallFilter': apply_formatter_at_index(to_integer_if_hex, 0),
construct_formatting_middleware, ) def is_named_block(value): return value in {"latest", "earliest", "pending"} def is_hexstr(value): return is_string(value) and is_hex(value) to_integer_if_hex = apply_formatter_if(is_hexstr, hex_to_integer) is_not_named_block = complement(is_named_block) TRANSACTION_KEY_MAPPINGS = { 'block_hash': 'blockHash', 'block_number': 'blockNumber', 'gas_price': 'gasPrice', 'transaction_hash': 'transactionHash', 'transaction_index': 'transactionIndex', } transaction_key_remapper = apply_key_map(TRANSACTION_KEY_MAPPINGS) LOG_KEY_MAPPINGS = { 'log_index': 'logIndex',
construct_formatting_middleware, ) def bytes_to_ascii(value): return codecs.decode(value, 'ascii') to_ascii_if_bytes = apply_formatter_if(is_bytes, bytes_to_ascii) to_integer_if_hex = apply_formatter_if(is_string, hex_to_integer) block_number_formatter = apply_formatter_if(is_integer, integer_to_hex) is_false = partial(operator.is_, False) is_not_false = complement(is_false) is_not_null = complement(is_null) @curry def to_hexbytes(num_bytes, val, variable_length=False): if isinstance(val, (str, int, bytes)): result = HexBytes(val) else: raise TypeError("Cannot convert %r to HexBytes" % val) extra_bytes = len(result) - num_bytes if extra_bytes == 0 or (variable_length and extra_bytes < 0): return result elif all(byte == 0 for byte in result[:extra_bytes]): return HexBytes(result[extra_bytes:])