def test_standard_electrum(self, tmp_storage) -> None: password = '******' seed_words = 'cycle rocket west magnet parrot shuffle foot correct salt library feed song' child_keystore = from_seed(seed_words, '') wallet = Wallet(tmp_storage) masterkey_row = wallet.create_masterkey_from_keystore(child_keystore) wallet.update_password(password) account_row = AccountRow(1, masterkey_row.masterkey_id, ScriptType.P2PKH, '...') account = StandardAccount(wallet, account_row, [], []) wallet.register_account(account.get_id(), account) check_legacy_parent_of_standard_wallet(wallet, password=password) check_create_keys(wallet, account_row.default_script_type)
def run_non_RPC(config): cmdname = config.get('cmd') storage = WalletStorage(config.get_wallet_path()) if storage.file_exists(): sys.exit("Error: Remove the existing wallet first!") def password_dialog(): return prompt_password( "Password (hit return if you do not wish to encrypt your wallet):") if cmdname == 'restore': text = config.get('text').strip() passphrase = config.get('passphrase', '') password = password_dialog() if keystore.is_private(text) else None if keystore.is_address_list(text): wallet = ImportedAddressWallet.from_text(storage, text) elif keystore.is_private_key_list(text): wallet = ImportedPrivkeyWallet.from_text(storage, text, password) else: if keystore.is_seed(text): k = keystore.from_seed(text, passphrase, False) elif keystore.is_master_key(text): k = keystore.from_master_key(text) else: sys.exit("Error: Seed or key not recognized") if password: k.update_password(None, password) storage.put('keystore', k.dump()) storage.put('wallet_type', 'standard') storage.put('use_encryption', bool(password)) storage.write() wallet = Wallet(storage) if not config.get('offline'): network = Network(config) network.start() wallet.start_threads(network) print("Recovering wallet...") wallet.synchronize() wallet.wait_until_synchronized() msg = ("Recovery successful" if wallet.is_found() else "Found no history for this wallet") else: msg = ("This wallet was restored offline. " "It may contain more addresses than displayed.") print(msg) elif cmdname == 'create': password = password_dialog() passphrase = config.get('passphrase', '') seed_type = 'standard' seed = Mnemonic('en').make_seed(seed_type) k = keystore.from_seed(seed, passphrase, False) storage.put('keystore', k.dump()) storage.put('wallet_type', 'standard') wallet = Wallet(storage) wallet.update_password(None, password, True) wallet.synchronize() print("Your wallet generation seed is:\n\"%s\"" % seed) print("Please keep it in a safe place; if you lose it, " "you will not be able to restore your wallet.") wallet.storage.write() print("Wallet saved in '%s'" % wallet.storage.path) sys.exit(0)
def test_legacy_wallet_loading(storage_info: WalletStorageInfo) -> None: # When a wallet is composed of multiple files, we need to know which to load. wallet_filenames = [] if storage_info.kind != StorageKind.DATABASE: wallet_filenames.append(storage_info.filename) if storage_info.kind in (StorageKind.DATABASE, StorageKind.HYBRID): wallet_filenames.append(storage_info.filename + DATABASE_EXT) temp_dir = tempfile.mkdtemp() for _wallet_filename in wallet_filenames: source_wallet_path = os.path.join(TEST_WALLET_PATH, _wallet_filename) wallet_path = os.path.join(temp_dir, _wallet_filename) shutil.copyfile(source_wallet_path, wallet_path) wallet_filename = storage_info.filename wallet_path = os.path.join(temp_dir, wallet_filename) if "testnet" in wallet_filename: Net.set_to(SVTestnet) if storage_info.kind == StorageKind.HYBRID: pytest.xfail("old development database wallets not supported yet") password = None storage = WalletStorage(wallet_path) if "passworded" in wallet_filename: password = "******" text_store = storage.get_text_store() text_store.load_data(text_store.decrypt(password)) if "encrypted" in wallet_filename: password = "******" check_no_password = False storage.upgrade(password is not None, password) try: wallet = Wallet(storage) except FileNotFoundError as e: if sys.version_info[:3] >= (3, 8, 0): msg = "Could not find module 'libusb-1.0.dll' (or one of its dependencies)." if msg in e.args[0]: pytest.xfail("libusb DLL could not be found") return raise e except OSError as e: if sys.version_info[:3] < (3, 8, 0): if "The specified module could not be found" in e.args[1]: pytest.xfail("libusb DLL could not be found") return raise e old_password = password password = "******" wallet.update_password(password, old_password) if "standard" in wallet_filename: is_bip39 = "bip39" in wallet_filename check_legacy_parent_of_standard_wallet(wallet, is_bip39=is_bip39, password=password) elif "imported_privkey" in wallet_filename: check_legacy_parent_of_imported_privkey_wallet(wallet) elif "imported_address" in wallet_filename: check_legacy_parent_of_imported_address_wallet(wallet) elif "multisig" in wallet_filename: check_legacy_parent_of_multisig_wallet(wallet) elif "hardware" in wallet_filename: check_legacy_parent_of_hardware_wallet(wallet) else: raise Exception(f"unrecognised wallet file {wallet_filename}") if "testnet" in wallet_filename: Net.set_to(SVMainnet)
def test_legacy_wallet_loading(storage_info: WalletStorageInfo) -> None: # When a wallet is composed of multiple files, we need to know which to load. wallet_filenames = [] if storage_info.kind != StorageKind.DATABASE: wallet_filenames.append(storage_info.filename) if storage_info.kind in (StorageKind.DATABASE, StorageKind.HYBRID): wallet_filenames.append(storage_info.filename + DATABASE_EXT) temp_dir = tempfile.mkdtemp() for _wallet_filename in wallet_filenames: source_wallet_path = os.path.join(TEST_WALLET_PATH, _wallet_filename) wallet_path = os.path.join(temp_dir, _wallet_filename) shutil.copyfile(source_wallet_path, wallet_path) wallet_filename = storage_info.filename wallet_path = os.path.join(temp_dir, wallet_filename) if "testnet" in wallet_filename: Net.set_to(SVTestnet) if storage_info.kind == StorageKind.HYBRID: pytest.xfail("old development database wallets not supported yet") password = None storage = WalletStorage(wallet_path) if "passworded" in wallet_filename: password = "******" text_store = storage.get_text_store() text_store.load_data(text_store.decrypt(password)) if "encrypted" in wallet_filename: password = "******" check_no_password = False storage.upgrade(password is not None, password) try: wallet = Wallet(storage) except OSError as e: if "is not a valid Win32 application" not in e.args[1]: raise e pytest.xfail("Missing libusb for this architecture") return old_password = password password = "******" wallet.update_password(password, old_password) if "standard" in wallet_filename: is_bip39 = "bip39" in wallet_filename check_legacy_parent_of_standard_wallet(wallet, is_bip39=is_bip39, password=password) elif "imported_privkey" in wallet_filename: check_legacy_parent_of_imported_privkey_wallet(wallet) elif "imported_address" in wallet_filename: check_legacy_parent_of_imported_address_wallet(wallet) elif "multisig" in wallet_filename: check_legacy_parent_of_multisig_wallet(wallet) elif "hardware" in wallet_filename: check_legacy_parent_of_hardware_wallet(wallet) else: raise Exception(f"unrecognised wallet file {wallet_filename}") if "testnet" in wallet_filename: Net.set_to(SVMainnet)