bip39_recovery.py (1285B)
1 #!/usr/bin/env python3 2 3 import sys 4 import asyncio 5 6 from electrum.util import json_encode, print_msg, create_and_start_event_loop, log_exceptions 7 from electrum.simple_config import SimpleConfig 8 from electrum.network import Network 9 from electrum.keystore import bip39_to_seed 10 from electrum.bip32 import BIP32Node 11 from electrum.bip39_recovery import account_discovery 12 13 try: 14 mnemonic = sys.argv[1] 15 passphrase = sys.argv[2] if len(sys.argv) > 2 else "" 16 except Exception: 17 print("usage: bip39_recovery <mnemonic> [<passphrase>]") 18 sys.exit(1) 19 20 loop, stopping_fut, loop_thread = create_and_start_event_loop() 21 22 config = SimpleConfig() 23 network = Network(config) 24 network.start() 25 26 @log_exceptions 27 async def f(): 28 try: 29 def get_account_xpub(account_path): 30 root_seed = bip39_to_seed(mnemonic, passphrase) 31 root_node = BIP32Node.from_rootseed(root_seed, xtype="standard") 32 account_node = root_node.subkey_at_private_derivation(account_path) 33 account_xpub = account_node.to_xpub() 34 return account_xpub 35 active_accounts = await account_discovery(network, get_account_xpub) 36 print_msg(json_encode(active_accounts)) 37 finally: 38 stopping_fut.set_result(1) 39 40 asyncio.run_coroutine_threadsafe(f(), loop)