-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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