blockcypher / blockcypher-python

Python library for the BlockCypher web services
https://www.blockcypher.com/dev/bitcoin
Apache License 2.0
215 stars 123 forks source link

is_valid_address_for_coinsymbol fails for Ethereum addresses with uppercase characters #163

Open BrynGibson opened 6 months ago

BrynGibson commented 6 months ago

To replicate:

import blockcypher
eth_addr = '0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed'
blockcypher.get_address_details(address=eth_addr , coin_symbol='eth', api_key=API_KEY)

after doing some digging it appears that is_valid_address_for_coinsymbol calls is_valid_eth_address which in turn calls: uses_only_hash_chars(addr).

uses_only_hash_chars is defined as:

HEX_CHARS_RE = re.compile('^[0-9a-f]*$')

def uses_only_hash_chars(string):
    return bool(HEX_CHARS_RE.match(string))

We could update this by making it a non-case sensitive regex query such as: HEX_CHARS_RE = re.compile('^[0-9a-f]*$', re.IGNORECASE).

If we detect a mixed case eth address we could also perfom a checksum validation to ensure the address checksum validates before creating an api call. Checksum validation of eth addresses using Python is described here: https://eips.ethereum.org/EIPS/eip-55

Is checksum validation something we should be doing here, or simply adapting the regex to be case insensitive?