def get_xkeys(self, seed, t, passphrase, derivation): assert is_any_2fa_seed_type(t) xtype = 'standard' if t == '2fa' else 'p2wsh' bip32_seed = Mnemonic.mnemonic_to_seed(seed, passphrase) rootnode = BIP32Node.from_rootseed(bip32_seed, xtype=xtype) child_node = rootnode.subkey_at_private_derivation(derivation) return child_node.to_xprv(), child_node.to_xpub()
def _do_test_bip32(self, seed: str, sequence): node = BIP32Node.from_rootseed(bfh(seed), xtype='standard') xprv, xpub = node.to_xprv(), node.to_xpub() self.assertEqual("m/", sequence[0:2]) sequence = sequence[2:] for n in sequence.split('/'): if n[-1] != "'": xpub2 = BIP32Node.from_xkey(xpub).subkey_at_public_derivation(n).to_xpub() node = BIP32Node.from_xkey(xprv).subkey_at_private_derivation(n) xprv, xpub = node.to_xprv(), node.to_xpub() if n[-1] != "'": self.assertEqual(xpub, xpub2) return xpub, xprv
def main(): seed = globals().get('seed', None) if 'wallet' not in globals(): # Not in electrum console, free to toggle network constants.set_testnet() if len(argv) > 1: seed = argv[1] if (constants.net.TESTNET): bip = {} (mnemo, tprv, gwif) = [None] * 3 if seed: (tmp, seed) = (seed, None) if '0x' == tmp[:2].lower(): tmp = tmp[2:] if set(tmp).issubset(hexdigits) and 64 == len(tmp): seed = bytes.fromhex(tmp) gwif = to_wif(seed, True, 'p2pkh').split(':')[ -1] # to_wif(seed,True,'').split(':')[-1] elif 'tprv' == tmp[:4]: tprv = tmp elif 12 == len(tmp.split()): mnemo = tmp else: gwif = tmp _, seed, _ = from_wif(tmp) bip39 = BIP39("English") if not (seed or mnemo or gwif or tprv): mnemo = bip39.generate() if mnemo: seed = bip39.to_seed(mnemo) if tprv: bip32 = BIP32Node.from_xkey(tprv) if seed: bip32 = BIP32Node.from_rootseed(seed, xtype='standard') tprv = bip32.to_xprv() desc = { '44': ['pkh'], '49': ['wpkh', 'sh'], '84': ['wpkh'], '86': ['tr'] } conf = { '44': 'legacy', '49': 'p2sh-segwit', '84': 'bech32', '86': 'bech32m' } for k in desc.keys(): imp = {'timestamp': 'now', 'range': [0, 1000], 'next_index': 1} imp = [dict(imp), dict(imp)] acct = f"{k}'/1'/0'" if gwif: key = seed wif = gwif else: key = bip32.subkey_at_private_derivation( f"m/{acct}/0/0").eckey.get_secret_bytes() wif = to_wif(key, True, 'p2pkh').split(':')[-1] bip[k] = {} bip[k]['key'] = key.hex() bip[k]['wif'] = wif change = 0 for j in ['addr', 'change']: path = f"{acct}/{change}" desc_str = f"{tprv}/{path}/*" for i in desc[k]: desc_str = f"{i}({desc_str})" desc_str = descsum_create(desc_str) imp[change]['desc'] = desc_str imp[change]['internal'] = bool(change) imp[change]['active'] = not bool(change) bip[k][j] = {} bip[k][j]['derivation'] = path bip[k][j]['desc'] = desc_str bip[k][j]['import'] = 'importdescriptors ' + dumps( imp[change]).replace('"', r'\"') change += 1 imp_txt = dumps(imp).replace('"', r'\"') if '86' == k: cmd = '' else: cmd = f'createwallet "bip{k}-berkley" false true\n' cmd += f'sethdseed true "{wif}"\n' cmd += f'createwallet "bip{k}-sqlite" false true "" false true\n' cmd += f'importdescriptors "{imp_txt}"' bip[k]['import'] = imp_txt bip[k]['commands'] = cmd print(f'\n# Your BIP39 Mnemonic: "{mnemo}"') print(f'# Your BIP32 Root Key: "{tprv}"') print( f'\n# Your legacy hdseed wif:"{bip["44"]["wif"]}", priv:"{bip["44"]["key"]}"' ) print( f'# Your p2sh-segwit hdseed wif:"{bip["49"]["wif"]}", priv:"{bip["49"]["key"]}"' ) print( f'# Your bech32 hdseed wif:"{bip["84"]["wif"]}", priv:"{bip["84"]["key"]}"\n' ) for k in desc.keys(): print(f'##################################################') print( f'# Your BIP{k} config is:\ntest.addresstype={conf[k]}\ntest.changetype={conf[k]}\n' ) print(f'# Your BIP{k} commands are:\n{bip[k]["commands"]}\n') else: print("You are not on Testnet, Exiting for safety")
def get_account_xpub(account_path): root_seed = bip39_to_seed(mnemonic, passphrase) root_node = BIP32Node.from_rootseed(root_seed, xtype="standard") account_node = root_node.subkey_at_private_derivation(account_path) account_xpub = account_node.to_xpub() return account_xpub