mirror of
https://github.com/ail-project/ail-framework.git
synced 2024-11-30 01:37:17 +00:00
fix: [bitcoin bech32] fix address validator
This commit is contained in:
parent
86af7dd749
commit
32761fb30e
1 changed files with 31 additions and 1 deletions
|
@ -22,8 +22,33 @@ baseurl = config_loader.get_config_str("Notifications", "ail_domain")
|
||||||
config_loader = None
|
config_loader = None
|
||||||
|
|
||||||
digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
digits58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
||||||
|
digits32 = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'
|
||||||
|
|
||||||
|
|
||||||
|
def decode_bech32(address):
|
||||||
|
if not all(33 <= ord(x) <= 126 for x in address):
|
||||||
|
return None, None
|
||||||
|
address = address.lower()
|
||||||
|
pos = address.rfind('1')
|
||||||
|
if pos < 1 or pos + 7 > len(address):
|
||||||
|
return None, None
|
||||||
|
hrp = address[:pos]
|
||||||
|
data = address[pos+1:]
|
||||||
|
if not all(x in digits32 for x in data):
|
||||||
|
return None, None
|
||||||
|
data = [digits32.find(c) for c in data]
|
||||||
|
# if not verify_checksum(hrp, data): # TODO checksum ???
|
||||||
|
# return None, None
|
||||||
|
return hrp, data[:-6]
|
||||||
|
|
||||||
|
def check_bech32_address(address):
|
||||||
|
hrp, data = decode_bech32(address)
|
||||||
|
if hrp is None or data is None:
|
||||||
|
return False
|
||||||
|
if hrp != 'bc' and hrp != 'tb':
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
# http://rosettacode.org/wiki/Bitcoin/address_validation#Python
|
# http://rosettacode.org/wiki/Bitcoin/address_validation#Python
|
||||||
def decode_base58(bc, length):
|
def decode_base58(bc, length):
|
||||||
n = 0
|
n = 0
|
||||||
|
@ -60,7 +85,12 @@ class CryptoCurrency(AbstractSubtypeObject):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def is_valid_address(self):
|
def is_valid_address(self):
|
||||||
if self.subtype == 'bitcoin' or self.subtype == 'dash' or self.subtype == 'litecoin' or self.subtype == 'tron':
|
if self.subtype == 'bitcoin':
|
||||||
|
if self.id.startswith('bc'):
|
||||||
|
if check_bech32_address(self.id):
|
||||||
|
return True
|
||||||
|
return check_base58_address(self.id)
|
||||||
|
elif self.subtype == 'dash' or self.subtype == 'litecoin' or self.subtype == 'tron':
|
||||||
return check_base58_address(self.id)
|
return check_base58_address(self.id)
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
Loading…
Reference in a new issue