Post
Topic
Board Development & Technical Discussion
Merits 1 from 1 user
Re: Help Unable to export private key
by
mcdouglasx
on 10/02/2025, 21:56:54 UTC
⭐ Merited by vapourminer (1)
The export of the private key failed and this prompt appears

“Only legacy wallets are supported by this command (code -4)”

It's because it's a descriptor wallet which you should extract the master private key(xpriv) using "listdescriptors true" and from there derive the addresses. I'll give you a script that does it, but it's missing the taproot addresses which this script doesn't derive.

Code:
import hashlib
import base58
import bip32utils
import ecdsa

def sha256(data):
    return hashlib.sha256(data).digest()

def ripemd160(data):
    h = hashlib.new('ripemd160')
    h.update(data)
    return h.digest()

def bch32_plmd(vals):
    gen = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
    chk = 1
    for v in vals:
        b = (chk >> 25)
        chk = (chk & 0x1ffffff) << 5 ^ v
        for i in range(5):
            chk ^= gen[i] if ((b >> i) & 1) else 0
    return chk

def bch32_expd(hrp):
    return [ord(x) >> 5 for x in hrp] + [0] + [ord(x) & 31 for x in hrp]

def bch32_chksm(hrp, data):
    vals = bch32_expd(hrp) + data
    plmd = bch32_plmd(vals + [0, 0, 0, 0, 0, 0]) ^ 1
    return [(plmd >> 5 * (5 - i)) & 31 for i in range(6)]

def bch32_enc(hrp, data):
    comb = data + bch32_chksm(hrp, data)
    BECH_CHRS = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l'
    return hrp + '1' + ''.join([BECH_CHRS[d] for d in comb])

def cnvrt_bits(data, fbits, tbits, pad=True):
    acc = 0
    bits = 0
    ret = []
    maxv = (1 << tbits) - 1
    for val in data:
        if val < 0 or val >> fbits:
            raise ValueError("Invalid value")
        acc = (acc << fbits) | val
        bits += fbits
        while bits >= tbits:
            bits -= tbits
            ret.append((acc >> bits) & maxv)
    if pad:
        if bits:
            ret.append((acc << (tbits - bits)) & maxv)
        elif bits >= fbits or ((acc << (tbits - bits)) & maxv):
            raise ValueError("Invalid bits")
    return ret

def bch_addr(pubk):
    sha256_r = sha256(pubk)
    rmd = ripemd160(sha256_r)
    data = cnvrt_bits(rmd, 8, 5)
    data = [0] + data
    hrp = 'bc'
    addr = bch32_enc(hrp, data)
    return addr

def p2sh_p2wpkh_addr(pubk):
    sha256_r = sha256(pubk)
    rmd = ripemd160(sha256_r)
    scr_sig = b'\x00\x14' + rmd
    scr_hash = ripemd160(sha256(scr_sig))
    return base58.b58encode_check(b'\x05' + scr_hash).decode()

def derive_addresses(xprv, drv):
    bip32_root_key_obj = bip32utils.BIP32Key.fromExtendedKey(xprv)
    result_text = ""
   
    result_text += "Bech32 Addresses (BIP84):\n"
    for i in range(int(drv)):
        # Receiving Address (index 0)
        drv_key_b84_recv = bip32_root_key_obj.ChildKey(84 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0).ChildKey(i)
        priv_key_b84_recv = drv_key_b84_recv.WalletImportFormat()
        pubkey_b84_recv = drv_key_b84_recv.PublicKey().hex()
        pubk_bytes_b84_recv = bytes.fromhex(pubkey_b84_recv)
        bch32_addr_recv = bch_addr(pubk_bytes_b84_recv)
        result_text += f"Receiving Address {i}:\nPrivate Key: {priv_key_b84_recv}\nPublic Key: {pubkey_b84_recv}\nSegWit Address (Bech32): {bch32_addr_recv}\n\n"
       
        # Change Address (index 1)
        drv_key_b84_change = bip32_root_key_obj.ChildKey(84 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(1).ChildKey(i)
        priv_key_b84_change = drv_key_b84_change.WalletImportFormat()
        pubkey_b84_change = drv_key_b84_change.PublicKey().hex()
        pubk_bytes_b84_change = bytes.fromhex(pubkey_b84_change)
        bch32_addr_change = bch_addr(pubk_bytes_b84_change)
        result_text += f"Change Address {i}:\nPrivate Key: {priv_key_b84_change}\nPublic Key: {pubkey_b84_change}\nSegWit Address (Bech32): {bch32_addr_change}\n\n"
   
    result_text += "Legacy Addresses (BIP44):\n"
    for i in range(int(drv)):
        # Receiving Address (index 0)
        drv_key_b44_recv = bip32_root_key_obj.ChildKey(44 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0).ChildKey(i)
        priv_key_b44_recv = drv_key_b44_recv.WalletImportFormat()
        pubkey_b44_recv = drv_key_b44_recv.PublicKey().hex()
        result_text += f"Receiving Address {i}:\nPrivate Key: {priv_key_b44_recv}\nPublic Key: {pubkey_b44_recv}\nLegacy Address (BIP44): {drv_key_b44_recv.Address()}\n\n"
       
        # Change Address (index 1)
        drv_key_b44_change = bip32_root_key_obj.ChildKey(44 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(1).ChildKey(i)
        priv_key_b44_change = drv_key_b44_change.WalletImportFormat()
        pubkey_b44_change = drv_key_b44_change.PublicKey().hex()
        result_text += f"Change Address {i}:\nPrivate Key: {priv_key_b44_change}\nPublic Key: {pubkey_b44_change}\nLegacy Address (BIP44): {drv_key_b44_change.Address()}\n\n"
   
    result_text += "P2SH Addresses (BIP49):\n"
    for i in range(int(drv)):
        # Receiving Address (index 0)
        drv_key_b49_recv = bip32_root_key_obj.ChildKey(49 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0).ChildKey(i)
        priv_key_b49_recv = drv_key_b49_recv.WalletImportFormat()
        pubkey_b49_recv = drv_key_b49_recv.PublicKey().hex()
        pubk_bytes_b49_recv = bytes.fromhex(pubkey_b49_recv)
        p2sh_addr_recv = p2sh_p2wpkh_addr(pubk_bytes_b49_recv)
        result_text += f"Receiving Address {i}:\nPrivate Key: {priv_key_b49_recv}\nPublic Key: {pubkey_b49_recv}\nP2SH Address (BIP49): {p2sh_addr_recv}\n\n"
       
        # Change Address (index 1)
        drv_key_b49_change = bip32_root_key_obj.ChildKey(49 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(0 + 0x80000000).ChildKey(1).ChildKey(i)
        priv_key_b49_change = drv_key_b49_change.WalletImportFormat()
        pubkey_b49_change = drv_key_b49_change.PublicKey().hex()
        pubk_bytes_b49_change = bytes.fromhex(pubkey_b49_change)
        p2sh_addr_change = p2sh_p2wpkh_addr(pubk_bytes_b49_change)
        result_text += f"Change Address {i}:\nPrivate Key: {priv_key_b49_change}\nPublic Key: {pubkey_b49_change}\nP2SH Address (BIP49): {p2sh_addr_change}\n\n"
   
    return result_text

xprv = "Your-Xpriv"

drv =10

result = derive_addresses(xprv, drv)

print(result)

Code:
xprv = "Your-Xpriv"

drv =Number of addresses to generate