Skip to content

Instantly share code, notes, and snippets.

@RandyMcMillan
Forked from jleo84/key_converter.py
Last active December 1, 2023 00:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RandyMcMillan/d7bb81110f3b94a400d72e7c7c84cd4b to your computer and use it in GitHub Desktop.
Save RandyMcMillan/d7bb81110f3b94a400d72e7c7c84cd4b to your computer and use it in GitHub Desktop.
Convert any Bitcoin key prefix to another (e.g.: xpub to ypub, zpriv to Zpriv)
#!/usr/bin/python3
import pip
while True:
try:
#import your modules here. !
from distutils.spawn import find_executable
from shutil import which
import hashlib
import base58
import sys
import os
## pip.main(['install', '-q', 'bip85-cli'])
break
except ImportError as err_mdl:
print((err_mdl.name))
pip.main(['install', err_mdl.name])
def in_path(name):
"""Check whether `name` is on PATH."""
## print(os.path.abspath(name))
## print(os.path.dirname(os.path.abspath(name)))
return find_executable(name) is not None
## if in_path("key_converter.py"):
## print("True")
prefix_dict = {
"xprv": "0488ade4", # Mainnet - P2PKH or P2SH - m/44'/0'
"yprv": "049d7878", # Mainnet - P2WPKH in P2SH - m/49'/0'
"zprv": "04b2430c", # Mainnet - P2WPKH - m/84'/0'
"Yprv": "0295b005", # Mainnet - Multi-signature P2WSH in P2SH
"Zprv": "02aa7a99", # Mainnet - Multi-signature P2WSH
"tprv": "04358394", # Testnet - P2PKH or P2SH - m/44'/1'
"uprv": "044a4e28", # Testnet - P2WPKH in P2SH - m/49'/1'
"vprv": "045f18bc", # Testnet - P2WPKH - m/84'/1'
"Uprv": "024285b5", # Testnet - Multi-signature P2WSH in P2SH
"Vprv": "02575048", # Testnet - Multi-signature P2WSH
'xpub': '0488b21e', # Mainnet - P2PKH or P2SH - m/44'/0'
'ypub': '049d7cb2', # Mainnet - P2WPKH in P2SH - m/49'/0'
'zpub': '04b24746', # Mainnet - P2WPKH - m/84'/0'
'Ypub': '0295b43f', # Mainnet - Multi-signature P2WSH in P2SH
'Zpub': '02aa7ed3', # Mainnet - Multi-signature P2WSH
'tpub': '043587cf', # Testnet - P2PKH or P2SH - m/44'/1'
'upub': '044a5262', # Testnet - P2WPKH in P2SH - m/49'/1'
'vpub': '045f1cf6', # Testnet - P2WPKH - m/84'/1'
'Upub': '024289ef', # Testnet - Multi-signature P2WSH in P2SH
'Vpub': '02575483' # Testnet - Multi-signature P2WSH
}
def supported_prefixes():
import json
print("\nSupported prefixes:\n");
print(json.dumps(prefix_dict, indent=4));
def help():
print("Usage:\n")
print(" key_converter.py [-t, --tests] - run tests()")
print(" key_converter.py [-p, --prefixes] - print supported prefixes")
print(" key_converter.py <key> <type>\n")
print("For tests:")
print("zpub6qwqZGWt6Gqm9i2bY2ErmJcTfRHHYX4LeUeszP33bSH3zgNdGiD7LEg57BQp2k5EQ4Qr5UAhgG1DMRSMZSA44UTNy1rLTqa3qaSnT9GmdsF")
print("xpub6CHJwwB3nukoT7eMsJfcM8RTKUzPfH5LpFcSRbFGqRXHtUkAmPsz67Mo4mVe2vmPanBEaWyakwJ7arDE83L2U16BELTVJ1w5J8KVfyMqtzE")
print("ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94VcBVdz")
print("yprvAJ8Dr6K57Djz5vm1bdvEC5aDwRJMCSLzN9D4QbjYf6NC4nEFUWjJANhTEghL3npior1TjTXW8vcuiaXoRGH8ZrEBn62qzPxbVKn6x5oY5vq")
print("xprv9yHxYRe9xYCWEdZtmH8byzUimT9uFpMVT2gqdCqfH5zK1gR2DrZjYK3KDUjk3tAoQCteyyvwgGGMqHvEhZs7mcYaukLRQV97DbiTZSJRaKC")
print("zprvAcxV9kyzFuHTwDx8RzhrQAfj7PSo94LVHFjHBzdS36k57t3UjAtrnSMbFtev3hUeDV8GUw84bayTbs9N8xh9N5uneRjGaJn5m3qkLdQwiaZ")
print("python3 key_converter.py zpub6qwqZGWt6Gqm9i2bY2ErmJcTfRHHYX4LeUeszP33bSH3zgNdGiD7LEg57BQp2k5EQ4Qr5UAhgG1DMRSMZSA44UTNy1rLTqa3qaSnT9GmdsF ypub")
print("python3 key_converter.py ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94VcBVdz xpub")
print("python3 key_converter.py xpub6CHJwwB3nukoT7eMsJfcM8RTKUzPfH5LpFcSRbFGqRXHtUkAmPsz67Mo4mVe2vmPanBEaWyakwJ7arDE83L2U16BELTVJ1w5J8KVfyMqtzE zpub")
print("python3 key_converter.py yprvAJ8Dr6K57Djz5vm1bdvEC5aDwRJMCSLzN9D4QbjYf6NC4nEFUWjJANhTEghL3npior1TjTXW8vcuiaXoRGH8ZrEBn62qzPxbVKn6x5oY5vq xprv")
print("python3 key_converter.py xprv9yHxYRe9xYCWEdZtmH8byzUimT9uFpMVT2gqdCqfH5zK1gR2DrZjYK3KDUjk3tAoQCteyyvwgGGMqHvEhZs7mcYaukLRQV97DbiTZSJRaKC zprv")
print("python3 key_converter.py zprvAcxV9kyzFuHTwDx8RzhrQAfj7PSo94LVHFjHBzdS36k57t3UjAtrnSMbFtev3hUeDV8GUw84bayTbs9N8xh9N5uneRjGaJn5m3qkLdQwiaZ yprv")
def convert_key(key, target_prefix):
decoded_key_bytes = base58.b58decode_check(key)
target_key_bytes = bytes.fromhex(prefix_dict[target_prefix]) + decoded_key_bytes[4:]
return base58.b58encode_check(target_key_bytes)
def main(key, target_prefix):
if not key or not target_prefix:
help();
return "Insufficient parameters."
if key[1:4] != target_prefix[1:4]:
return "The key and the target prefix must be both public or both private."
if not key[:4] in prefix_dict:
return "Invalid key target version."
if not target_prefix in prefix_dict:
return "Invalid prefix target version."
return convert_key(key, target_prefix)
def tests():
result = main("zpub6qwqZGWt6Gqm9i2bY2ErmJcTfRHHYX4LeUeszP33bSH3zgNdGiD7LEg57BQp2k5EQ4Qr5UAhgG1DMRSMZSA44UTNy1rLTqa3qaSnT9GmdsF", "ypub");
print(result);
result = main("ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94VcBVdz", "xpub");
print(result);
result = main("xpub6CHJwwB3nukoT7eMsJfcM8RTKUzPfH5LpFcSRbFGqRXHtUkAmPsz67Mo4mVe2vmPanBEaWyakwJ7arDE83L2U16BELTVJ1w5J8KVfyMqtzE", "zpub");
print(result);
result = main("yprvAJ8Dr6K57Djz5vm1bdvEC5aDwRJMCSLzN9D4QbjYf6NC4nEFUWjJANhTEghL3npior1TjTXW8vcuiaXoRGH8ZrEBn62qzPxbVKn6x5oY5vq", "xprv");
print(result);
result = main("xprv9yHxYRe9xYCWEdZtmH8byzUimT9uFpMVT2gqdCqfH5zK1gR2DrZjYK3KDUjk3tAoQCteyyvwgGGMqHvEhZs7mcYaukLRQV97DbiTZSJRaKC", "zprv");
print(result);
result = main("zprvAcxV9kyzFuHTwDx8RzhrQAfj7PSo94LVHFjHBzdS36k57t3UjAtrnSMbFtev3hUeDV8GUw84bayTbs9N8xh9N5uneRjGaJn5m3qkLdQwiaZ", "yprv");
print(result);
try:
key = sys.argv[1]
if key == "-t" or key == "--tests":
tests();
exit();
if key == "-p" or key == "--prefixes":
supported_prefixes();
exit();
target_prefix = sys.argv[2]
result = main(key, target_prefix)
print(result)
except IndexError:
help();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment