def print_p2pkh(tprv, path, start=0, end=2): root = tbtc.parse(tprv) for i in range(start, 1 + end): npath = path + f"/{i}" node = root.subkey_for_path(npath) addr = node.address() print(npath, addr)
def print_segwit(tprv, path, start=0, end=2): root = tbtc.parse(tprv) for i in range(start, 1 + end): npath = path + f"/{i}" node = root.subkey_for_path(npath) hash = node.hash160(is_compressed=True) addr = tbtc.address.for_p2pkh_wit(hash) print(npath, addr)
def print_p2tr(tprv, path, start=0, end=2): root = tbtc.parse(tprv) for i in range(start, 1 + end): npath = path + f"/{i}" node = root.subkey_for_path(npath) pk = node.sec() p2tr = taproot_construct(pk[1:]) words = [1] + convertbits((list(p2tr.output_pubkey)), 8, 5) addr = bech32_encode(Encoding.BECH32M, 'tb', words) print(npath, addr)
def test_repr(self): key = XTN.keys.private(secret_exponent=273) address = key.address() pub_k = XTN.parse(address) self.assertEqual(repr(pub_k), '<mhDVBkZBWLtJkpbszdjZRkH1o5RZxMwxca>') wif = key.wif() priv_k = XTN.parse.wif(wif) self.assertEqual( repr(priv_k), 'private_for <XTNSEC:0264e1b1969f9102977691a40431b0b672055dcf31163897d996434420e6c95dc9>')
def test_parse_bip32_prv_xtn(self): key = XTN.parse( "tprv8ZgxMBicQKsPdpQD2swL99YVLB6W2GDqNVcCSfAZ9zMXvh6DYj5iJMZmUVrF66" "x7uXBDJSunexZjAtFLtd89iLTWGCEpBdBxs7GTBnEksxV") self.assertEqual( key.secret_exponent(), 0x91880b0e3017ba586b735fe7d04f1790f3c46b818a2151fb2def5f14dd2fd9c3) self.assertEqual(key.address(), "mp1nuBzKGgv4ZtS5x8YywbCLD5CnVfT7hV") self.assertEqual(key.address(is_compressed=False), "n2ThiotfoCrcRofQcFbCrVX2PC89s2KUjh") subkey = key.subkey_for_path("0") self.assertEqual(subkey.address(), "n31129TfTCBky6N9RyitnGTf3t4LYwCV6A")
def test_repr(self): key = XTN.keys.private(secret_exponent=273) address = key.address() pub_k = XTN.parse(address) self.assertEqual(repr(pub_k), '<mhDVBkZBWLtJkpbszdjZRkH1o5RZxMwxca>') wif = key.wif() priv_k = XTN.parse.wif(wif) self.assertEqual( repr(priv_k), 'private_for <XTNSEC:0264e1b1969f9102977691a40431b0b672055dcf31163897d996434420e6c95dc9>' )
def main(): wallet = {} db = Database(expandvars(filepath)) for row in db['main'].rows: key = fmt_key(row['key']) value = fmt_key(row['value']) ktxt = key.split(',')[0].strip() kbin = key.split(',')[-1].strip() data = {kbin: value} if kbin != ktxt: data = {ktxt: data} if wallet.get(ktxt, False): wallet[ktxt].update(data[ktxt]) else: wallet.update(data) # print(dumps(wallet, indent=2)) assert wallet["walletdescriptor"] and wallet["walletdescriptorkey"] for dkey in wallet["walletdescriptor"].keys(): for kkey in wallet["walletdescriptorkey"].keys(): if kkey.startswith(dkey): print() desc = wallet["walletdescriptor"][dkey].split('#')[0] der = wallet["walletdescriptorkey"][kkey] assert der.startswith('d63081d30201010420') m = search('\(([A-z0-9]*)/', desc) pub = m.group(1) path = '/'.join(desc.split('/')[1:-1]) sec = bytes.fromhex('00') + bytes.fromhex(der)[9:][:32] tpub = a2b_hashed_base58(pub) blob = tpub[4:-33] + sec prv = tbtc.bip32_as_string(blob, as_private=True) hwif = tbtc.parse(prv).hwif() assert hwif == pub print(descsum_create(desc)) desc = desc.replace(pub, prv) print(descsum_create(desc)) if desc.startswith("pkh(tprv"): print_p2pkh(prv, path) elif desc.startswith("sh(wpkh(tprv"): print_p2sh_segwit(prv, path) if desc.startswith("wpkh(tprv"): print_segwit(prv, path) if desc.startswith("tr(tprv"): print_p2tr(prv, path)