def test_invalid_address(self): """Test whether invalid addresses fail to decode.""" for test in INVALID_ADDRESS: witver, _ = btc.bech32addr_decode("bc", test) self.assertIsNone(witver) witver, _ = btc.bech32addr_decode("tb", test) self.assertIsNone(witver)
def validate_address(addr): try: assert len(addr) > 2 if addr[:2].lower() in ['bc', 'tb']: # Regtest special case if addr[:4] == 'bcrt': if btc.bech32addr_decode('bcrt', addr)[1]: return True, 'address validated' return False, 'Invalid bech32 regtest address' #Else, enforce testnet/mainnet per config if get_network() == "testnet": hrpreq = 'tb' else: hrpreq = 'bc' if btc.bech32addr_decode(hrpreq, addr)[1]: return True, 'address validated' return False, 'Invalid bech32 address' #Not bech32; assume b58 from here ver = btc.get_version_byte(addr) except AssertionError: return False, 'Checksum wrong. Typo in address?' except Exception: return False, "Invalid bitcoin address" if ver != get_p2pk_vbyte() and ver != get_p2sh_vbyte(): return False, 'Wrong address version. Testnet/mainnet confused?' if len(btc.b58check_to_bin(addr)) != 20: return False, "Address has correct checksum but wrong length." return True, 'address validated'
def test_valid_address(self): """Test whether valid addresses decode to the correct output.""" for (address, hexscript) in VALID_ADDRESS: hrp = "bc" witver, witprog = btc.bech32addr_decode(hrp, address) if witver is None: hrp = "tb" witver, witprog = btc.bech32addr_decode(hrp, address) self.assertIsNotNone(witver) scriptpubkey = segwit_scriptpubkey(witver, witprog) self.assertEqual(scriptpubkey, binascii.unhexlify(hexscript)) addr = btc.bech32addr_encode(hrp, witver, witprog) self.assertEqual(address.lower(), addr)