def check_legacy_parent_of_multisig_wallet(wallet: Wallet) -> None: assert len(wallet.get_accounts()) == 1 account: MultisigAccount = wallet.get_accounts()[0] m = account.m n = account.n parent_keystores = wallet.get_keystores() assert len(parent_keystores) == 1 keystore = parent_keystores[0] child_keystores = keystore.get_cosigner_keystores() assert len(child_keystores) == n parent_data = keystore.to_derivation_data() for i in range(n): masterkey_row = child_keystores[i].to_masterkey_row() assert masterkey_row.derivation_type == DerivationType.BIP32 keystore_data = parent_data["cosigner-keys"][i][1] if len(keystore_data) == 3: assert keystore_data['seed'] is not None # == seed_words assert keystore_data['xpub'] is not None assert keystore_data['xprv'] is not None else: assert len(keystore_data) == 2 assert keystore_data['xpub'] is not None assert keystore_data['xprv'] is None
def check_legacy_parent_of_imported_privkey_wallet(wallet: Wallet, keypairs: Optional[Dict[str, str]]=None, password: Optional[str]=None) -> None: assert len(wallet.get_accounts()) == 1 account: ImportedPrivkeyAccount = wallet.get_accounts()[0] parent_keystores = wallet.get_keystores() assert len(parent_keystores) == 0 child_keystores = account.get_keystores() assert len(child_keystores) == 1 assert child_keystores[0] is not None assert not child_keystores[0].has_masterkey() with pytest.raises(IncompatibleWalletError): child_keystores[0].to_masterkey_row() with pytest.raises(IncompatibleWalletError): child_keystores[0].to_derivation_data() keyinstance_datas = child_keystores[0].get_keyinstance_derivation_data() assert len(keyinstance_datas) == 1 if keypairs is not None: for key_id, data in keyinstance_datas: assert pw_decode(data['prv'], password) == keypairs[data['pub']]
def check_legacy_parent_of_standard_wallet( wallet: Wallet, seed_words: Optional[str] = None, is_bip39: bool = False, password: Optional[str] = None) -> None: assert len(wallet.get_accounts()) == 1 account: StandardAccount = wallet.get_accounts()[0] parent_keystores = wallet.get_keystores() assert len(parent_keystores) == 1 child_keystores = account.get_keystores() assert len(child_keystores) == 1 assert parent_keystores[0] is child_keystores[0] assert password is not None assert not child_keystores[0].has_seed() or child_keystores[0].get_seed( password) assert type(child_keystores[0].get_passphrase(password)) is str assert child_keystores[0].get_master_private_key(password) keystore_data = parent_keystores[0].to_derivation_data() entry_count = 4 if is_bip39: entry_count = 3 assert len(keystore_data) == entry_count, keystore_data assert 'xpub' in keystore_data assert 'xprv' in keystore_data keystore_encrypted = False try: parent_keystores[0].check_password(None) except InvalidPassword: keystore_encrypted = True assert "encrypted" not in wallet.name() or keystore_encrypted if is_bip39: assert "seed" not in keystore_data else: if seed_words is None: assert "seed" in keystore_data else: assert keystore_data['seed'] == seed_words
def check_legacy_parent_of_hardware_wallet(wallet: Wallet) -> None: assert len(wallet.get_accounts()) == 1 child_account = wallet.get_accounts()[0] parent_keystores = wallet.get_keystores() assert len(parent_keystores) == 1 child_keystores = child_account.get_keystores() assert len(child_keystores) == 1 assert parent_keystores[0] is child_keystores[0] masterkey_row = parent_keystores[0].to_masterkey_row() assert masterkey_row.derivation_type == DerivationType.HARDWARE keystore_data = parent_keystores[0].to_derivation_data() # General hardware wallet. entry_count = 5 if keystore_data['hw_type'] == "ledger": # Ledger wallets extend the keystore. assert "cfg" in keystore_data entry_count = 6 assert len(keystore_data) == entry_count assert 'hw_type' in keystore_data assert 'label' in keystore_data assert "derivation" in keystore_data assert "subpaths" in keystore_data
def check_create_keys(wallet: Wallet, account_script_type: ScriptType) -> None: def check_rows(rows: List[KeyInstanceRow], script_type: ScriptType) -> None: for row in rows: assert isinstance(row.keyinstance_id, int) assert account.get_id() == row.account_id assert 1 == row.masterkey_id assert script_type == row.script_type assert DerivationType.BIP32_SUBPATH == row.derivation_type assert None is row.description accounts = wallet.get_accounts() assert len(accounts) == 1 account = accounts[0] assert [] == account.get_existing_fresh_keys(RECEIVING_SUBPATH) assert [] == account.get_existing_fresh_keys(CHANGE_SUBPATH) assert account_script_type == account.get_default_script_type() keyinstances: List[KeyInstanceRow] = [] keyinstance_ids: Set[int] = set() for count in (0, 1, 5): new_keyinstances = account.create_keys(count, RECEIVING_SUBPATH) assert count == len(new_keyinstances) check_rows(new_keyinstances, account_script_type) keyinstance_ids |= set(keyinstance.keyinstance_id for keyinstance in new_keyinstances) keyinstances.extend(new_keyinstances) assert len(keyinstance_ids) == len(keyinstances) assert [] == account.get_existing_fresh_keys(RECEIVING_SUBPATH) for count in (0, 1, 5): last_row = keyinstances[-1] last_index = account.get_derivation_path(last_row.keyinstance_id)[-1] next_index = account.get_next_derivation_index(RECEIVING_SUBPATH) assert next_index == last_index + 1 try: new_keyinstances = account.create_keys_until( RECEIVING_SUBPATH + (next_index + count - 1,)) except AssertionError: assert 0 == count continue assert 0 != count assert count == len(new_keyinstances) check_rows(new_keyinstances, account_script_type) keyinstance_ids |= set(keyinstance.keyinstance_id for keyinstance in new_keyinstances) keyinstances.extend(new_keyinstances) assert len(keyinstance_ids) == len(keyinstances) assert [] == account.get_existing_fresh_keys(RECEIVING_SUBPATH) keyinstance_batches: List[List[KeyInstanceRow]] = [] for count in (0, 1, 5): new_keyinstances = account.get_fresh_keys(RECEIVING_SUBPATH, count) assert count == len(new_keyinstances) assert new_keyinstances == account.get_existing_fresh_keys(RECEIVING_SUBPATH) check_rows(new_keyinstances, ScriptType.NONE) # Verify each batch includes the last batch and the extra created keys. if len(keyinstance_batches) > 0: last_keyinstances = keyinstance_batches[-1] assert last_keyinstances == new_keyinstances[:len(last_keyinstances)] keyinstance_batches.append(new_keyinstances)
def check_legacy_parent_of_imported_address_wallet(wallet: Wallet) -> None: assert len(wallet.get_accounts()) == 1 account: ImportedAddressAccount = wallet.get_accounts()[0] assert len(wallet.get_keystores()) == 0 assert len(account.get_keystores()) == 0
def check_parent_of_blank_wallet(wallet: Wallet) -> None: assert len(wallet.get_accounts()) == 0 parent_keystores = wallet.get_keystores() assert len(parent_keystores) == 0
def _accounts_dto(self, wallet: Wallet): """child wallets data transfer object""" accounts = {} for account in wallet.get_accounts(): accounts.update(self._account_dto(account)) return accounts