def make_myself_wallet(dev, set_bip39_pw, offer_ms_import, need_keypress, clear_ms): # construct a wallet (M of 4) using different bip39 passwords, and default sim def doit(M, addr_fmt=None, do_import=True): passwords = ['Me', 'Myself', 'And I', ''] if 0: # WORKING, but slow .. and it's constant data keys = [] for pw in passwords: xfp = set_bip39_pw(pw) sk = dev.send_recv(CCProtocolPacker.get_xpub("m/45'")) node = BIP32Node.from_wallet_key(sk) keys.append((xfp, None, node)) assert len(set(x for x,_,_ in keys)) == 4, keys pprint(keys) else: # Much, FASTER! assert dev.is_simulator keys = [(3503269483, None, BIP32Node.from_hwif('tpubD9429UXFGCTKJ9NdiNK4rC5ygqSUkginycYHccqSg5gkmyQ7PZRHNjk99M6a6Y3NY8ctEUUJvCu6iCCui8Ju3xrHRu3Ez1CKB4ZFoRZDdP9')), (2389277556, None, BIP32Node.from_hwif('tpubD97nVL37v5tWyMf9ofh5rznwhh1593WMRg6FT4o6MRJkKWANtwAMHYLrcJFsFmPfYbY1TE1LLQ4KBb84LBPt1ubvFwoosvMkcWJtMwvXgSc')), (3190206587, None, BIP32Node.from_hwif('tpubD9ArfXowvGHnuECKdGXVKDMfZVGdephVWg8fWGWStH3VKHzT4ph3A4ZcgXWqFu1F5xGTfxncmrnf3sLC86dup2a8Kx7z3xQ3AgeNTQeFxPa')), (1130956047, None, BIP32Node.from_hwif('tpubD8NXmKsmWp3a3DXhbihAYbYLGaRNVdTnr6JoSxxfXYQcmwVtW2hv8QoDwng6JtEonmJoL3cNEwfd2cLXMpGezwZ2vL2dQ7259bueNKj9C8n')), ] if do_import: # render as a file for import config = f"name: Myself-{M}\npolicy: {M} / 4\n\n" if addr_fmt: config += f'format: {addr_fmt.upper()}\n' config += '\n'.join('%s: %s' % (xfp2str(xfp), sk.hwif()) for xfp, _, sk in keys) #print(config) title, story = offer_ms_import(config) #print(story) # dont care if update or create; accept it. time.sleep(.1) need_keypress('y') def select_wallet(idx): # select to specific pw xfp = set_bip39_pw(passwords[idx]) assert xfp == keys[idx][0] return (keys, select_wallet) yield doit set_bip39_pw('')
def select_wallet(idx): # select to specific pw xfp = set_bip39_pw(passwords[idx]) assert xfp == keys[idx][0]
def test_make_airgapped(addr_fmt, goto_home, cap_story, pick_menu_item, cap_menu, need_keypress, microsd_path, set_bip39_pw, clear_ms, get_settings, N=4): # test UX and math for bip45 export # cleanup from glob import glob for fn in glob(microsd_path('ccxp-*.json')): assert fn os.unlink(fn) clear_ms() for idx in range(N): if N == 4: set_bip39_pw(['Me', 'Myself', 'And I', ''][idx]) else: set_bip39_pw(f'test {idx}' if idx else '') goto_home() pick_menu_item('Settings') pick_menu_item('Multisig Wallets') pick_menu_item('Export XPUB') time.sleep(.05) need_keypress('y') need_keypress('y') set_bip39_pw('') assert len(glob(microsd_path('ccxp-*.json'))) == N goto_home() pick_menu_item('Settings') pick_menu_item('Multisig Wallets') pick_menu_item('Create Airgapped') time.sleep(.05) title, story = cap_story() assert 'XPUB' in story if addr_fmt == 'p2wsh': need_keypress('y') elif addr_fmt == 'p2wsh-p2sh': need_keypress('1') elif addr_fmt == 'p2sh': need_keypress('2') else: assert 0, addr_fmt time.sleep(.1) title, story = cap_story() assert ('(N=%d #files=%d' % (N, N)) in story if N == 3: assert '2 of 3' in story M = 2 elif N == 14: assert '8 of 14' in story M = 8 elif N == 4: assert '3 of 4' in story need_keypress('7') time.sleep(.05) title, story = cap_story() assert '2 of 4' in story M = 2 else: assert 0, N need_keypress('y') time.sleep(.1) title, story = cap_story() assert "Create new multisig" in story need_keypress('y') # writes out ckcc config file, then electrum wallet time.sleep(.1) title, story = cap_story() print(repr(story)) assert 'Coldcard' in story assert 'that file onto the other Coldcards involved' in story fname = story.split('\n')[2] cc_fname = microsd_path(fname) impf = open(cc_fname, 'rt').read() assert f'Policy: {M} of {N}' in impf if addr_fmt != 'p2sh': assert f'Format: {addr_fmt.upper()}' in impf need_keypress('y') time.sleep(.1) title, story = cap_story() fname = story.split('\n')[-1] assert fname.startswith('el-') assert fname.endswith('.json') el_fname = microsd_path(fname) import json wal = json.load(open(el_fname, 'rt')) assert f'{M}of{N}' in wal['wallet_type'] need_keypress('y') need_keypress('y') if N == 4: import shutil # capture useful test data for testing Electrum plugin, etc for fn in glob(microsd_path('ccxp-*.json')): shutil.copy(fn, 'data/multisig/'+fn.rsplit('/', 1)[1]) shutil.copy(el_fname, f'data/multisig/el-{addr_fmt}-myself.json') shutil.copy(cc_fname, f'data/multisig/export-{addr_fmt}-myself.txt') json.dump(get_settings()['multisig'][0], open(f'data/multisig/setting-{addr_fmt}-myself.json', 'w')) clear_ms() # test re-importing the wallet from export file goto_home() pick_menu_item('Settings') pick_menu_item('Multisig Wallets') pick_menu_item('Import from SD') time.sleep(.05) need_keypress('y') time.sleep(.05) pick_menu_item(cc_fname.rsplit('/', 1)[1]) time.sleep(.05) title, story = cap_story() assert "Create new multisig" in story assert f"Policy: {M} of {N}" in story need_keypress('1') time.sleep(.05) title, story = cap_story() # test code ehre # abort import, good enough need_keypress('x') need_keypress('x')