passphrase working

This commit is contained in:
Matthew Fosse 2024-04-26 10:18:34 -07:00
parent b6cb22b4fa
commit acd9fb329f
35 changed files with 90 additions and 34 deletions

View file

@ -70,6 +70,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
required String password,
required WalletInfo walletInfo,
required Box<UnspentCoinsInfo> unspentCoinsInfo,
String? passphrase,
String? addressPageType,
BasedUtxoNetwork? network,
List<BitcoinAddressRecord>? initialAddresses,
@ -81,7 +82,10 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
switch (walletInfo.derivationInfo?.derivationType) {
case DerivationType.bip39:
seedBytes = await bip39.mnemonicToSeed(mnemonic);
seedBytes = await bip39.mnemonicToSeed(
mnemonic,
passphrase: passphrase ?? "",
);
break;
case DerivationType.electrum:
default:

View file

@ -33,6 +33,7 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
final wallet = await BitcoinWalletBase.create(
mnemonic: await generateElectrumMnemonic(),
password: credentials.password!,
passphrase: credentials.passphrase,
walletInfo: credentials.walletInfo!,
unspentCoinsInfo: unspentCoinsInfoSource,
network: network,
@ -116,6 +117,7 @@ class BitcoinWalletService extends WalletService<BitcoinNewWalletCredentials,
final wallet = await BitcoinWalletBase.create(
password: credentials.password!,
passphrase: credentials.passphrase,
mnemonic: credentials.mnemonic,
walletInfo: credentials.walletInfo!,
unspentCoinsInfo: unspentCoinsInfoSource,

View file

@ -19,6 +19,7 @@ enum DerivationType {
@HiveField(4)
electrum,
}
@HiveType(typeId: DerivationInfo.typeId)
class DerivationInfo extends HiveObject {
DerivationInfo({
@ -33,11 +34,10 @@ class DerivationInfo extends HiveObject {
static const typeId = DERIVATION_INFO_TYPE_ID;
@HiveField(0)
@HiveField(0, defaultValue: '')
String address;
@HiveField(1)
@HiveField(1, defaultValue: '')
String balance;
@HiveField(2)
@ -90,19 +90,20 @@ class WalletInfo extends HiveObject {
DerivationInfo? derivationInfo,
}) {
return WalletInfo(
id,
name,
type,
isRecovery,
restoreHeight,
date.millisecondsSinceEpoch,
dirPath,
path,
address,
yatEid,
yatLastUsedAddressRaw,
showIntroCakePayCard,
derivationInfo);
id,
name,
type,
isRecovery,
restoreHeight,
date.millisecondsSinceEpoch,
dirPath,
path,
address,
yatEid,
yatLastUsedAddressRaw,
showIntroCakePayCard,
derivationInfo,
);
}
static const typeId = WALLET_INFO_TYPE_ID;
@ -154,10 +155,10 @@ class WalletInfo extends HiveObject {
List<String>? usedAddresses;
@HiveField(16)
DerivationType? derivationType;// no longer used
DerivationType? derivationType; // no longer used
@HiveField(17)
String? derivationPath;// no longer used
String? derivationPath; // no longer used
@HiveField(18)
String? addressPageType;

View file

@ -280,8 +280,11 @@ class CWBitcoin extends Bitcoin {
}
@override
Future<List<DerivationInfo>> getDerivationsFromMnemonic(
{required String mnemonic, required Node node}) async {
Future<List<DerivationInfo>> getDerivationsFromMnemonic({
required String mnemonic,
required Node node,
String? passphrase,
}) async {
List<DerivationInfo> list = [];
final electrumClient = ElectrumClient();
@ -306,7 +309,7 @@ class CWBitcoin extends Bitcoin {
if (dType == DerivationType.electrum) {
seedBytes = await mnemonicToSeedBytes(mnemonic);
} else if (dType == DerivationType.bip39) {
seedBytes = bip39.mnemonicToSeed(mnemonic);
seedBytes = bip39.mnemonicToSeed(mnemonic, passphrase: passphrase ?? '');
}
for (DerivationInfo dInfo in bitcoin_derivations[dType]!) {

View file

@ -58,9 +58,6 @@ class WalletCreationService {
checkIfExists(credentials.name);
final password = generateWalletPassword();
credentials.password = password;
if (credentials.passphrase != null) {
credentials.password = credentials.passphrase;
}
if (type == WalletType.bitcoinCash || type == WalletType.ethereum) {
credentials.seedPhraseLength = settingsStore.seedPhraseLength.value;
}
@ -92,10 +89,9 @@ class WalletCreationService {
Future<WalletBase> restoreFromSeed(WalletCredentials credentials, {bool? isTestnet}) async {
checkIfExists(credentials.name);
if (credentials.password == null) {
credentials.password = generateWalletPassword();
}
await keyService.saveWalletPassword(password: credentials.password!, walletName: credentials.name);
final password = generateWalletPassword();
credentials.password = password;
await keyService.saveWalletPassword(password: password, walletName: credentials.name);
final wallet = await _service!.restoreFromSeed(credentials, isTestnet: isTestnet);
if (wallet.type == WalletType.monero) {

View file

@ -20,6 +20,7 @@ class WalletRestoreFromSeedForm extends StatefulWidget {
{Key? key,
required this.displayLanguageSelector,
required this.displayBlockHeightSelector,
required this.displayPassphrase,
required this.type,
required this.seedTypeViewModel,
this.blockHeightFocusNode,
@ -31,6 +32,7 @@ class WalletRestoreFromSeedForm extends StatefulWidget {
final WalletType type;
final bool displayLanguageSelector;
final bool displayBlockHeightSelector;
final bool displayPassphrase;
final SeedTypeViewModel seedTypeViewModel;
final FocusNode? blockHeightFocusNode;
final Function(bool)? onHeightOrDateEntered;
@ -48,6 +50,7 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
formKey = GlobalKey<FormState>(),
languageController = TextEditingController(),
nameTextEditingController = TextEditingController(),
passphraseController = TextEditingController(),
seedTypeController = TextEditingController();
final GlobalKey<SeedWidgetState> seedWidgetStateKey;
@ -55,6 +58,7 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
final TextEditingController languageController;
final TextEditingController nameTextEditingController;
final TextEditingController seedTypeController;
final TextEditingController passphraseController;
final GlobalKey<FormState> formKey;
late ReactionDisposer moneroSeedTypeReaction;
String language;
@ -194,6 +198,13 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
key: blockchainHeightKey,
onHeightOrDateEntered: widget.onHeightOrDateEntered,
hasDatePicker: widget.type == WalletType.monero),
if (widget.displayPassphrase) ...[
const SizedBox(height: 10),
BaseTextFormField(
hintText: S.current.passphrase,
controller: passphraseController,
),
]
]));
}

View file

@ -38,6 +38,7 @@ class WalletRestorePage extends BasePage {
displayBlockHeightSelector:
walletRestoreViewModel.hasBlockchainHeightLanguageSelector,
displayLanguageSelector: walletRestoreViewModel.hasSeedLanguageSelector,
displayPassphrase: walletRestoreViewModel.hasPassphrase,
type: walletRestoreViewModel.type,
key: walletRestoreFromSeedFormKey,
blockHeightFocusNode: _blockHeightFocusNode,
@ -296,6 +297,11 @@ class WalletRestorePage extends BasePage {
-1;
}
if (walletRestoreViewModel.hasPassphrase) {
credentials['passphrase'] =
walletRestoreFromSeedFormKey.currentState!.passphraseController.text;
}
credentials['name'] =
walletRestoreFromSeedFormKey.currentState!.nameTextEditingController.text;
} else if (walletRestoreViewModel.mode == WalletRestoreMode.keys) {

View file

@ -67,6 +67,8 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
final bool hasBlockchainHeightLanguageSelector;
final bool hasRestoreFromPrivateKey;
bool get hasPassphrase => [WalletType.bitcoin].contains(type);
@observable
WalletRestoreMode mode;
@ -201,7 +203,12 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
case WalletType.bitcoin:
case WalletType.litecoin:
String? mnemonic = credentials['seed'] as String?;
return bitcoin!.getDerivationsFromMnemonic(mnemonic: mnemonic!, node: node);
String? passphrase = credentials['passphrase'] as String?;
return bitcoin!.getDerivationsFromMnemonic(
mnemonic: mnemonic!,
node: node,
passphrase: passphrase,
);
case WalletType.nano:
String? mnemonic = credentials['seed'] as String?;
String? seedKey = credentials['private_key'] as String?;

View file

@ -411,6 +411,7 @@
"outputs": "المخرجات",
"overwrite_amount": "تغير المبلغ",
"pairingInvalidEvent": "ﺢﻟﺎﺻ ﺮﻴﻏ ﺙﺪﺣ ﻥﺍﺮﻗﺇ",
"passphrase": "عبارة الممر",
"password": "كلمة المرور",
"paste": "لصق",
"pause_wallet_creation": ".ﺎﻴًﻟﺎﺣ ﺎﺘًﻗﺆﻣ ﺔﻔﻗﻮﺘﻣ Haven Wallet ءﺎﺸﻧﺇ ﻰﻠﻋ ﺓﺭﺪﻘﻟﺍ",

View file

@ -411,6 +411,7 @@
"outputs": "Изходи",
"overwrite_amount": "Промени сума",
"pairingInvalidEvent": "Невалидно събитие при сдвояване",
"passphrase": "Парола",
"password": "Парола",
"paste": "Поставяне",
"pause_wallet_creation": "Възможността за създаване на Haven Wallet в момента е на пауза.",

View file

@ -411,6 +411,7 @@
"outputs": "Výstupy",
"overwrite_amount": "Přepsat částku",
"pairingInvalidEvent": "Neplatná událost párování",
"passphrase": "Passphrase",
"password": "Heslo",
"paste": "Vložit",
"pause_wallet_creation": "Možnost vytvářet Haven Wallet je momentálně pozastavena.",

View file

@ -411,6 +411,7 @@
"outputs": "Ausgänge",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Paarung ungültiges Ereignis",
"passphrase": "Passphrase",
"password": "Passwort",
"paste": "Einfügen",
"pause_wallet_creation": "Die Möglichkeit, Haven Wallet zu erstellen, ist derzeit pausiert.",
@ -425,8 +426,8 @@
"placeholder_transactions": "Ihre Transaktionen werden hier angezeigt",
"please_fill_totp": "Bitte geben Sie den 8-stelligen Code ein, der auf Ihrem anderen Gerät vorhanden ist",
"please_make_selection": "Bitte treffen Sie unten eine Auswahl zum Erstellen oder Wiederherstellen Ihrer Wallet.",
"Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
"please_reference_document": "Bitte verweisen Sie auf die folgenden Dokumente, um weitere Informationen zu erhalten.",
"Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
"please_select": "Bitte auswählen:",
"please_select_backup_file": "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.",
"please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Knoten zu verbinden",
@ -822,4 +823,4 @@
"you_will_get": "Konvertieren zu",
"you_will_send": "Konvertieren von",
"yy": "YY"
}
}

View file

@ -411,6 +411,7 @@
"outputs": "Outputs",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Pairing Invalid Event",
"passphrase": "Passphrase",
"password": "Password",
"paste": "Paste",
"pause_wallet_creation": "Ability to create Haven Wallet is currently paused.",

View file

@ -411,6 +411,7 @@
"outputs": "Salidas",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Evento de emparejamiento no válido",
"passphrase": "Frase",
"password": "Contraseña",
"paste": "Pegar",
"pause_wallet_creation": "La capacidad para crear Haven Wallet está actualmente pausada.",

View file

@ -411,6 +411,7 @@
"outputs": "Les sorties",
"overwrite_amount": "Remplacer le montant",
"pairingInvalidEvent": "Événement de couplage non valide",
"passphrase": "Phrase secrète",
"password": "Mot de passe",
"paste": "Coller",
"pause_wallet_creation": "La possibilité de créer Haven Wallet est actuellement suspendue.",

View file

@ -413,6 +413,7 @@
"outputs": "Abubuwan fashewa",
"overwrite_amount": "Rubuta adadin",
"pairingInvalidEvent": "Haɗa Lamarin mara inganci",
"passphrase": "Mashiganya",
"password": "Kalmar wucewa",
"paste": "Manna",
"pause_wallet_creation": "A halin yanzu an dakatar da ikon ƙirƙirar Haven Wallet.",

View file

@ -411,6 +411,7 @@
"outputs": "आउटपुट",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "अमान्य ईवेंट युग्मित करना",
"passphrase": "पदबंध",
"password": "पारण शब्द",
"paste": "पेस्ट करें",
"pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।",

View file

@ -411,6 +411,7 @@
"outputs": "Izlazi",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Nevažeći događaj uparivanja",
"passphrase": "Prolazna fraza",
"password": "Lozinka",
"paste": "Zalijepi",
"pause_wallet_creation": "Mogućnost stvaranja novčanika Haven trenutno je pauzirana.",

View file

@ -413,6 +413,7 @@
"outputs": "Output",
"overwrite_amount": "Timpa jumlah",
"pairingInvalidEvent": "Menyandingkan Acara Tidak Valid",
"passphrase": "Frasa sandi",
"password": "Kata Sandi",
"paste": "Tempel",
"pause_wallet_creation": "Kemampuan untuk membuat Haven Wallet saat ini dijeda.",

View file

@ -413,6 +413,7 @@
"outputs": "Output",
"overwrite_amount": "Sovrascrivi quantità",
"pairingInvalidEvent": "Associazione evento non valido",
"passphrase": "Frase d'accesso",
"password": "Password",
"paste": "Incolla",
"pause_wallet_creation": "La possibilità di creare Haven Wallet è attualmente sospesa.",

View file

@ -412,6 +412,7 @@
"outputs": "出力",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "ペアリング無効イベント",
"passphrase": "パスフレーズ",
"password": "パスワード",
"paste": "ペースト",
"pause_wallet_creation": "Haven Wallet を作成する機能は現在一時停止されています。",

View file

@ -411,6 +411,7 @@
"outputs": "출력",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "잘못된 이벤트 페어링",
"passphrase": "패스 프레이즈",
"password": "암호",
"paste": "풀",
"pause_wallet_creation": "Haven Wallet 생성 기능이 현재 일시 중지되었습니다.",
@ -425,8 +426,8 @@
"placeholder_transactions": "거래가 여기에 표시됩니다",
"please_fill_totp": "다른 기기에 있는 8자리 코드를 입력하세요.",
"please_make_selection": "아래에서 선택하십시오 지갑 만들기 또는 복구.",
"please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.",
"Please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.",
"please_reference_document": "자세한 내용은 아래 문서를 참조하십시오.",
"please_select": "선택 해주세요:",
"please_select_backup_file": "백업 파일을 선택하고 백업 암호를 입력하십시오.",
"please_try_to_connect_to_another_node": "다른 노드에 연결을 시도하십시오",

View file

@ -411,6 +411,7 @@
"outputs": "ထုတ်လုပ်မှု",
"overwrite_amount": "ပမာဏကို ထပ်ရေးပါ။",
"pairingInvalidEvent": "မမှန်ကန်သောဖြစ်ရပ်ကို တွဲချိတ်ခြင်း။",
"passphrase": "စကားှက်PPRase",
"password": "စကားဝှက်",
"paste": "ငါးပိ",
"pause_wallet_creation": "Haven Wallet ဖန်တီးနိုင်မှုကို လောလောဆယ် ခေတ္တရပ်ထားသည်။",

View file

@ -411,6 +411,7 @@
"outputs": "Uitgangen",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Koppelen Ongeldige gebeurtenis",
"passphrase": "Wachtwoordzin",
"password": "Wachtwoord",
"paste": "Plakken",
"pause_wallet_creation": "De mogelijkheid om Haven Wallet te maken is momenteel onderbroken.",

View file

@ -411,6 +411,7 @@
"outputs": "Wyjścia",
"overwrite_amount": "Nadpisz ilość",
"pairingInvalidEvent": "Nieprawidłowe zdarzenie parowania",
"passphrase": "Fraza",
"password": "Hasło",
"paste": "Wklej",
"pause_wallet_creation": "Możliwość utworzenia Portfela Haven jest obecnie wstrzymana.",

View file

@ -413,6 +413,7 @@
"outputs": "Saídas",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Emparelhamento de evento inválido",
"passphrase": "Senha",
"password": "Senha",
"paste": "Colar",
"pause_wallet_creation": "A capacidade de criar a Haven Wallet está atualmente pausada.",

View file

@ -412,6 +412,7 @@
"outputs": "Выходы",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Недействительное событие сопряжения",
"passphrase": "Пасфраза",
"password": "Пароль",
"paste": "Вставить",
"pause_wallet_creation": "Возможность создания Haven Wallet в настоящее время приостановлена.",

View file

@ -411,6 +411,7 @@
"outputs": "เอาต์พุต",
"overwrite_amount": "เขียนทับจำนวน",
"pairingInvalidEvent": "การจับคู่เหตุการณ์ที่ไม่ถูกต้อง",
"passphrase": "วรรณะ",
"password": "รหัสผ่าน",
"paste": "วาง",
"pause_wallet_creation": "ขณะนี้ความสามารถในการสร้าง Haven Wallet ถูกหยุดชั่วคราว",

View file

@ -411,6 +411,7 @@
"outputs": "Mga output",
"overwrite_amount": "Overwrite na halaga",
"pairingInvalidEvent": "Pagpares ng Di-wastong Kaganapan",
"passphrase": "Passphrase",
"password": "Password",
"paste": "I -paste",
"pause_wallet_creation": "Kasalukuyang naka-pause ang kakayahang gumawa ng Haven Wallet.",

View file

@ -411,6 +411,7 @@
"outputs": "çıktılar",
"overwrite_amount": "Miktarın üzerine yaz",
"pairingInvalidEvent": "Geçersiz Etkinliği Eşleştirme",
"passphrase": "Parola",
"password": "Parola",
"paste": "Yapıştır",
"pause_wallet_creation": "Haven Cüzdanı oluşturma yeteneği şu anda duraklatıldı.",

View file

@ -411,6 +411,7 @@
"outputs": "Виходи",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "Недійсна подія сполучення",
"passphrase": "Пропуск",
"password": "Пароль",
"paste": "Вставити",
"pause_wallet_creation": "Можливість створення гаманця Haven зараз призупинено.",

View file

@ -413,6 +413,7 @@
"outputs": "نتائج",
"overwrite_amount": "رقم کو اوور رائٹ کریں۔",
"pairingInvalidEvent": "ﭧﻧﻮﯾﺍ ﻂﻠﻏ ﺎﻧﺎﻨﺑ ﺍﮌﻮﺟ",
"passphrase": "پاسفریز",
"password": "پاس ورڈ",
"paste": "چسپاں کریں۔",
"pause_wallet_creation": "Haven Wallet ۔ﮯﮨ ﻑﻮﻗﻮﻣ ﻝﺎﺤﻟﺍ ﯽﻓ ﺖﯿﻠﮨﺍ ﯽﮐ ﮯﻧﺎﻨﺑ",

View file

@ -412,6 +412,7 @@
"outputs": "Awọn iṣan",
"overwrite_amount": "Pààrọ̀ iye owó",
"pairingInvalidEvent": "Pipọpọ Iṣẹlẹ Ti ko tọ",
"passphrase": "Kukurukọni",
"password": "Ọ̀rọ̀ aṣínà",
"paste": "Fikún ẹ̀dà yín",
"pause_wallet_creation": "Agbara lati ṣẹda Haven Wallet ti wa ni idaduro lọwọlọwọ.",

View file

@ -411,6 +411,7 @@
"outputs": "输出",
"overwrite_amount": "Overwrite amount",
"pairingInvalidEvent": "配对无效事件",
"passphrase": "密码",
"password": "密码",
"paste": "粘贴",
"pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。",

View file

@ -169,7 +169,7 @@ abstract class Bitcoin {
Future<List<DerivationType>> compareDerivationMethods(
{required String mnemonic, required Node node});
Future<List<DerivationInfo>> getDerivationsFromMnemonic(
{required String mnemonic, required Node node});
{required String mnemonic, required Node node, String? passphrase});
Future<void> setAddressType(Object wallet, dynamic option);
ReceivePageOption getSelectedAddressType(Object wallet);
List<ReceivePageOption> getBitcoinReceivePageOptions();