From 04bba2bf2a2905f96e3eda51806a308c7d3f0b51 Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 15:07:08 -0600 Subject: [PATCH 1/7] new wallet mnemonic options for supported coins --- .../name_your_wallet_view.dart | 92 ++-- .../new_wallet_options_view.dart | 409 ++++++++++++++++++ ...w_wallet_recovery_phrase_warning_view.dart | 32 +- lib/route_generator.dart | 16 + lib/services/coins/banano/banano_wallet.dart | 4 +- .../coins/bitcoin/bitcoin_wallet.dart | 25 +- .../coins/bitcoincash/bitcoincash_wallet.dart | 25 +- lib/services/coins/coin_service.dart | 4 +- .../coins/dogecoin/dogecoin_wallet.dart | 22 +- lib/services/coins/ecash/ecash_wallet.dart | 25 +- .../coins/epiccash/epiccash_wallet.dart | 9 +- .../coins/ethereum/ethereum_wallet.dart | 25 +- lib/services/coins/firo/firo_wallet.dart | 22 +- .../coins/litecoin/litecoin_wallet.dart | 22 +- lib/services/coins/manager.dart | 4 +- lib/services/coins/monero/monero_wallet.dart | 4 +- .../coins/namecoin/namecoin_wallet.dart | 22 +- lib/services/coins/nano/nano_wallet.dart | 4 +- .../coins/particl/particl_wallet.dart | 22 +- .../coins/stellar/stellar_wallet.dart | 26 +- .../coins/wownero/wownero_wallet.dart | 5 +- lib/utilities/enums/coin_enum.dart | 29 ++ 22 files changed, 745 insertions(+), 103 deletions(-) create mode 100644 lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart diff --git a/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart b/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart index 4e04fcb80..4f88f99b3 100644 --- a/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart +++ b/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart @@ -14,6 +14,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart'; +import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart'; import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; @@ -336,46 +337,59 @@ class _NameYourWalletViewState extends ConsumerState<NameYourWalletView> { ref.read(walletsServiceChangeNotifierProvider); final name = textEditingController.text; - if (await walletsService.checkForDuplicate(name)) { - unawaited(showFloatingFlushBar( - type: FlushBarType.warning, - message: "Wallet name already in use.", - iconAsset: Assets.svg.circleAlert, - context: context, - )); - } else { - // hide keyboard if has focus - if (FocusScope.of(context).hasFocus) { - FocusScope.of(context).unfocus(); - await Future<void>.delayed( - const Duration(milliseconds: 50)); - } + final hasDuplicateName = + await walletsService.checkForDuplicate(name); - if (mounted) { - switch (widget.addWalletType) { - case AddWalletType.New: - unawaited(Navigator.of(context).pushNamed( - NewWalletRecoveryPhraseWarningView.routeName, - arguments: Tuple2( - name, - coin, - ), - )); - break; - case AddWalletType.Restore: - ref - .read(mnemonicWordCountStateProvider.state) - .state = Constants.possibleLengthsForCoin( - coin) - .first; - unawaited(Navigator.of(context).pushNamed( - RestoreOptionsView.routeName, - arguments: Tuple2( - name, - coin, - ), - )); - break; + if (mounted) { + if (hasDuplicateName) { + unawaited(showFloatingFlushBar( + type: FlushBarType.warning, + message: "Wallet name already in use.", + iconAsset: Assets.svg.circleAlert, + context: context, + )); + } else { + // hide keyboard if has focus + if (FocusScope.of(context).hasFocus) { + FocusScope.of(context).unfocus(); + await Future<void>.delayed( + const Duration(milliseconds: 50)); + } + + if (mounted) { + ref + .read(mnemonicWordCountStateProvider.state) + .state = + Constants.possibleLengthsForCoin(coin).last; + + switch (widget.addWalletType) { + case AddWalletType.New: + unawaited( + Navigator.of(context).pushNamed( + coin.hasMnemonicPassphraseSupport + ? NewWalletOptionsView.routeName + : NewWalletRecoveryPhraseWarningView + .routeName, + arguments: Tuple2( + name, + coin, + ), + ), + ); + break; + + case AddWalletType.Restore: + unawaited( + Navigator.of(context).pushNamed( + RestoreOptionsView.routeName, + arguments: Tuple2( + name, + coin, + ), + ), + ); + break; + } } } } diff --git a/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart b/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart new file mode 100644 index 000000000..4f2dfb180 --- /dev/null +++ b/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart @@ -0,0 +1,409 @@ +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart'; +import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart'; +import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/mobile_mnemonic_length_selector.dart'; +import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart'; +import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; +import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart'; +import 'package:stackwallet/themes/stack_colors.dart'; +import 'package:stackwallet/utilities/assets.dart'; +import 'package:stackwallet/utilities/constants.dart'; +import 'package:stackwallet/utilities/enums/coin_enum.dart'; +import 'package:stackwallet/utilities/text_styles.dart'; +import 'package:stackwallet/utilities/util.dart'; +import 'package:stackwallet/widgets/background.dart'; +import 'package:stackwallet/widgets/conditional_parent.dart'; +import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; +import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; +import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; +import 'package:stackwallet/widgets/desktop/primary_button.dart'; +import 'package:stackwallet/widgets/rounded_white_container.dart'; +import 'package:stackwallet/widgets/stack_text_field.dart'; +import 'package:tuple/tuple.dart'; + +final pNewWalletOptions = + StateProvider<({String mnemonicPassphrase, int mnemonicWordsCount})?>( + (ref) => null); + +enum NewWalletOptions { + Default, + Advanced; +} + +class NewWalletOptionsView extends ConsumerStatefulWidget { + const NewWalletOptionsView({ + Key? key, + required this.walletName, + required this.coin, + }) : super(key: key); + + static const routeName = "/newWalletOptionsView"; + + final String walletName; + final Coin coin; + + @override + ConsumerState<NewWalletOptionsView> createState() => + _NewWalletOptionsViewState(); +} + +class _NewWalletOptionsViewState extends ConsumerState<NewWalletOptionsView> { + late final FocusNode passwordFocusNode; + late final TextEditingController passwordController; + + bool hidePassword = true; + NewWalletOptions _selectedOptions = NewWalletOptions.Default; + + @override + void initState() { + passwordController = TextEditingController(); + passwordFocusNode = FocusNode(); + + super.initState(); + } + + @override + void dispose() { + passwordController.dispose(); + passwordFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final lengths = Constants.possibleLengthsForCoin(widget.coin).toList(); + return ConditionalParent( + condition: Util.isDesktop, + builder: (child) => DesktopScaffold( + background: Theme.of(context).extension<StackColors>()!.background, + appBar: const DesktopAppBar( + isCompactHeight: false, + leading: AppBarBackButton(), + trailing: ExitToMyStackButton(), + ), + body: SizedBox( + width: 480, + child: child, + ), + ), + child: ConditionalParent( + condition: !Util.isDesktop, + builder: (child) => Background( + child: Scaffold( + backgroundColor: + Theme.of(context).extension<StackColors>()!.background, + appBar: AppBar( + leading: const AppBarBackButton(), + title: Text( + "Wallet Options", + style: STextStyles.navBarTitle(context), + ), + ), + body: SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: Padding( + padding: const EdgeInsets.all(16), + child: child, + ), + ), + ), + ); + }, + ), + ), + ), + ), + child: Column( + children: [ + if (Util.isDesktop) + const Spacer( + flex: 10, + ), + if (!Util.isDesktop) + CoinImage( + coin: widget.coin, + height: 100, + width: 100, + ), + SizedBox( + height: Util.isDesktop ? 0 : 16, + ), + Text( + "Wallet options", + textAlign: TextAlign.center, + style: Util.isDesktop + ? STextStyles.desktopH2(context) + : STextStyles.pageTitleH1(context), + ), + SizedBox( + height: Util.isDesktop ? 32 : 16, + ), + DropdownButtonHideUnderline( + child: DropdownButton2<NewWalletOptions>( + value: _selectedOptions, + items: [ + ...NewWalletOptions.values.map( + (e) => DropdownMenuItem( + value: e, + child: Text( + e.name, + style: STextStyles.desktopTextMedium(context), + ), + ), + ), + ], + onChanged: (value) { + if (value is NewWalletOptions) { + setState(() { + _selectedOptions = value; + }); + } + }, + isExpanded: true, + iconStyleData: IconStyleData( + icon: SvgPicture.asset( + Assets.svg.chevronDown, + width: 12, + height: 6, + color: Theme.of(context) + .extension<StackColors>()! + .textFieldActiveSearchIconRight, + ), + ), + dropdownStyleData: DropdownStyleData( + offset: const Offset(0, -10), + elevation: 0, + decoration: BoxDecoration( + color: Theme.of(context) + .extension<StackColors>()! + .textFieldDefaultBG, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + ), + ), + ), + const SizedBox( + height: 24, + ), + if (_selectedOptions == NewWalletOptions.Advanced) + Column( + children: [ + if (Util.isDesktop) + DropdownButtonHideUnderline( + child: DropdownButton2<int>( + value: ref + .watch(mnemonicWordCountStateProvider.state) + .state, + items: [ + ...lengths.map( + (e) => DropdownMenuItem( + value: e, + child: Text( + "$e word seed", + style: STextStyles.desktopTextMedium(context), + ), + ), + ), + ], + onChanged: (value) { + if (value is int) { + ref + .read(mnemonicWordCountStateProvider.state) + .state = value; + } + }, + isExpanded: true, + iconStyleData: IconStyleData( + icon: SvgPicture.asset( + Assets.svg.chevronDown, + width: 12, + height: 6, + color: Theme.of(context) + .extension<StackColors>()! + .textFieldActiveSearchIconRight, + ), + ), + dropdownStyleData: DropdownStyleData( + offset: const Offset(0, -10), + elevation: 0, + decoration: BoxDecoration( + color: Theme.of(context) + .extension<StackColors>()! + .textFieldDefaultBG, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + ), + ), + ), + if (!Util.isDesktop) + MobileMnemonicLengthSelector( + chooseMnemonicLength: () { + showModalBottomSheet<dynamic>( + backgroundColor: Colors.transparent, + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(20), + ), + ), + builder: (_) { + return MnemonicWordCountSelectSheet( + lengthOptions: lengths, + ); + }, + ); + }, + ), + const SizedBox( + height: 24, + ), + RoundedWhiteContainer( + child: Center( + child: Text( + "You may protect the wallet seed with an optional passphrase. " + "If you lose this passphrase you will not be able " + "to restore using just your seed words.", + style: Util.isDesktop + ? STextStyles.desktopTextExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension<StackColors>()! + .textSubtitle1, + ) + : STextStyles.itemSubtitle(context), + ), + ), + ), + const SizedBox( + height: 8, + ), + ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + key: const Key("mnemonicPassphraseFieldKey1"), + focusNode: passwordFocusNode, + controller: passwordController, + style: Util.isDesktop + ? STextStyles.desktopTextMedium(context).copyWith( + height: 2, + ) + : STextStyles.field(context), + obscureText: hidePassword, + enableSuggestions: false, + autocorrect: false, + decoration: standardInputDecoration( + "Recovery phrase password", + passwordFocusNode, + context, + ).copyWith( + suffixIcon: UnconstrainedBox( + child: ConditionalParent( + condition: Util.isDesktop, + builder: (child) => SizedBox( + height: 70, + child: child, + ), + child: Row( + children: [ + SizedBox( + width: Util.isDesktop ? 24 : 16, + ), + GestureDetector( + key: const Key( + "mnemonicPassphraseFieldShowPasswordButtonKey"), + onTap: () async { + setState(() { + hidePassword = !hidePassword; + }); + }, + child: SvgPicture.asset( + hidePassword + ? Assets.svg.eye + : Assets.svg.eyeSlash, + color: Theme.of(context) + .extension<StackColors>()! + .textDark3, + width: Util.isDesktop ? 24 : 16, + height: Util.isDesktop ? 24 : 16, + ), + ), + const SizedBox( + width: 12, + ), + ], + ), + ), + ), + ), + ), + ), + ], + ), + if (!Util.isDesktop) const Spacer(), + SizedBox( + height: Util.isDesktop ? 32 : 16, + ), + PrimaryButton( + label: "Continue", + onPressed: () { + if (_selectedOptions == NewWalletOptions.Advanced) { + ref.read(pNewWalletOptions.notifier).state = ( + mnemonicWordsCount: + ref.read(mnemonicWordCountStateProvider.state).state, + mnemonicPassphrase: passwordController.text, + ); + } else { + ref.read(pNewWalletOptions.notifier).state = null; + } + + Navigator.of(context).pushNamed( + NewWalletRecoveryPhraseWarningView.routeName, + arguments: Tuple2( + widget.walletName, + widget.coin, + ), + ); + }, + ), + if (!Util.isDesktop) + const SizedBox( + height: 16, + ), + if (Util.isDesktop) + const Spacer( + flex: 15, + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index e373e817b..f237fd4ae 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -13,6 +13,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/recovery_phrase_explanation_dialog.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; @@ -38,7 +39,7 @@ import 'package:stackwallet/widgets/rounded_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:tuple/tuple.dart'; -class NewWalletRecoveryPhraseWarningView extends StatefulWidget { +class NewWalletRecoveryPhraseWarningView extends ConsumerStatefulWidget { const NewWalletRecoveryPhraseWarningView({ Key? key, required this.coin, @@ -51,12 +52,12 @@ class NewWalletRecoveryPhraseWarningView extends StatefulWidget { final String walletName; @override - State<NewWalletRecoveryPhraseWarningView> createState() => + ConsumerState<NewWalletRecoveryPhraseWarningView> createState() => _NewWalletRecoveryPhraseWarningViewState(); } class _NewWalletRecoveryPhraseWarningViewState - extends State<NewWalletRecoveryPhraseWarningView> { + extends ConsumerState<NewWalletRecoveryPhraseWarningView> { late final Coin coin; late final String walletName; late final bool isDesktop; @@ -72,6 +73,10 @@ class _NewWalletRecoveryPhraseWarningViewState @override Widget build(BuildContext context) { debugPrint("BUILD: $runtimeType"); + final options = ref.read(pNewWalletOptions.state).state; + + final seedCount = options?.mnemonicWordsCount ?? + Constants.defaultSeedPhraseLengthFor(coin: coin); return MasterScaffold( isDesktop: isDesktop, @@ -172,7 +177,7 @@ class _NewWalletRecoveryPhraseWarningViewState child: isDesktop ? Text( "On the next screen you will see " - "${Constants.defaultSeedPhraseLengthFor(coin: coin)} " + "$seedCount " "words that make up your recovery phrase.\n\nPlease " "write it down. Keep it safe and never share it with " "anyone. Your recovery phrase is the only way you can" @@ -496,7 +501,24 @@ class _NewWalletRecoveryPhraseWarningViewState final manager = Manager(wallet); - await manager.initializeNew(); + if (coin.hasMnemonicPassphraseSupport && + ref + .read(pNewWalletOptions.state) + .state != + null) { + await manager.initializeNew(( + mnemonicPassphrase: ref + .read(pNewWalletOptions.state) + .state! + .mnemonicPassphrase, + wordCount: ref + .read(pNewWalletOptions.state) + .state! + .mnemonicWordsCount, + )); + } else { + await manager.initializeNew(null); + } // pop progress dialog if (mounted) { diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 2b7aa662d..344eb7876 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -27,6 +27,7 @@ import 'package:stackwallet/pages/add_wallet_views/add_token_view/edit_wallet_to import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart'; import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart'; import 'package:stackwallet/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart'; +import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart'; import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart'; @@ -1101,6 +1102,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case NewWalletOptionsView.routeName: + if (args is Tuple2<String, Coin>) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => NewWalletOptionsView( + walletName: args.item1, + coin: args.item2, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case RestoreWalletView.routeName: if (args is Tuple5<String, Coin, int, DateTime, String>) { return getRoute( diff --git a/lib/services/coins/banano/banano_wallet.dart b/lib/services/coins/banano/banano_wallet.dart index e2032aa09..50b4a3f9e 100644 --- a/lib/services/coins/banano/banano_wallet.dart +++ b/lib/services/coins/banano/banano_wallet.dart @@ -600,7 +600,9 @@ class BananoWallet extends CoinServiceAPI with WalletCache, WalletDB { } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { if ((await mnemonicString) != null || (await mnemonicPassphrase) != null) { throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); diff --git a/lib/services/coins/bitcoin/bitcoin_wallet.dart b/lib/services/coins/bitcoin/bitcoin_wallet.dart index f40be0e3c..cb8eadeef 100644 --- a/lib/services/coins/bitcoin/bitcoin_wallet.dart +++ b/lib/services/coins/bitcoin/bitcoin_wallet.dart @@ -1290,7 +1290,9 @@ class BitcoinWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1301,7 +1303,7 @@ class BitcoinWallet extends CoinServiceAPI await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -1499,7 +1501,9 @@ class BitcoinWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -1533,10 +1537,21 @@ class BitcoinWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); - await _secureStore.write(key: '${_walletId}_mnemonicPassphrase', value: ""); + value: bip39.generateMnemonic(strength: strength)); + await _secureStore.write( + key: '${_walletId}_mnemonicPassphrase', + value: data?.mnemonicPassphrase ?? "", + ); // Generate and add addresses to relevant arrays final initialAddresses = await Future.wait([ diff --git a/lib/services/coins/bitcoincash/bitcoincash_wallet.dart b/lib/services/coins/bitcoincash/bitcoincash_wallet.dart index d0b360b0c..1f4057353 100644 --- a/lib/services/coins/bitcoincash/bitcoincash_wallet.dart +++ b/lib/services/coins/bitcoincash/bitcoincash_wallet.dart @@ -1161,7 +1161,9 @@ class BitcoinCashWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1171,7 +1173,7 @@ class BitcoinCashWallet extends CoinServiceAPI } await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -1402,7 +1404,9 @@ class BitcoinCashWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -1436,10 +1440,21 @@ class BitcoinCashWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); - await _secureStore.write(key: '${_walletId}_mnemonicPassphrase', value: ""); + value: bip39.generateMnemonic(strength: strength)); + await _secureStore.write( + key: '${_walletId}_mnemonicPassphrase', + value: data?.mnemonicPassphrase ?? "", + ); // Generate and add addresses to relevant arrays final initialAddresses = await Future.wait([ diff --git a/lib/services/coins/coin_service.dart b/lib/services/coins/coin_service.dart index 5aa6e382d..94fa569e4 100644 --- a/lib/services/coins/coin_service.dart +++ b/lib/services/coins/coin_service.dart @@ -348,7 +348,9 @@ abstract class CoinServiceAPI { required int height, }); - Future<void> initializeNew(); + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ); Future<void> initializeExisting(); Future<void> exit(); diff --git a/lib/services/coins/dogecoin/dogecoin_wallet.dart b/lib/services/coins/dogecoin/dogecoin_wallet.dart index 754834ad1..3d6ae5794 100644 --- a/lib/services/coins/dogecoin/dogecoin_wallet.dart +++ b/lib/services/coins/dogecoin/dogecoin_wallet.dart @@ -1147,7 +1147,9 @@ class DogecoinWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1157,7 +1159,7 @@ class DogecoinWallet extends CoinServiceAPI } await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -1349,7 +1351,9 @@ class DogecoinWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -1383,12 +1387,20 @@ class DogecoinWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); + value: bip39.generateMnemonic(strength: strength)); await _secureStore.write( key: '${_walletId}_mnemonicPassphrase', - value: "", + value: data?.mnemonicPassphrase ?? "", ); // Generate and add addresses diff --git a/lib/services/coins/ecash/ecash_wallet.dart b/lib/services/coins/ecash/ecash_wallet.dart index e891db692..c35f7f4c6 100644 --- a/lib/services/coins/ecash/ecash_wallet.dart +++ b/lib/services/coins/ecash/ecash_wallet.dart @@ -506,7 +506,9 @@ class ECashWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -544,10 +546,21 @@ class ECashWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); - await _secureStore.write(key: '${_walletId}_mnemonicPassphrase', value: ""); + value: bip39.generateMnemonic(strength: strength)); + await _secureStore.write( + key: '${_walletId}_mnemonicPassphrase', + value: data?.mnemonicPassphrase ?? "", + ); const int startingIndex = 0; const int receiveChain = 0; @@ -2778,7 +2791,9 @@ class ECashWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -2789,7 +2804,7 @@ class ECashWallet extends CoinServiceAPI await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); diff --git a/lib/services/coins/epiccash/epiccash_wallet.dart b/lib/services/coins/epiccash/epiccash_wallet.dart index b62129248..9d25a5a47 100644 --- a/lib/services/coins/epiccash/epiccash_wallet.dart +++ b/lib/services/coins/epiccash/epiccash_wallet.dart @@ -766,7 +766,9 @@ class EpicCashWallet extends CoinServiceAPI } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { await _prefs.init(); await updateNode(false); final mnemonic = await _getMnemonicList(); @@ -1738,7 +1740,6 @@ class EpicCashWallet extends CoinServiceAPI final isIncoming = (tx["tx_type"] == "TxReceived" || tx["tx_type"] == "TxReceivedCancelled"); - final txn = isar_models.Transaction( walletId: walletId, txid: commitId ?? tx["id"].toString(), @@ -1763,7 +1764,9 @@ class EpicCashWallet extends CoinServiceAPI otherData: tx['onChainNote'].toString(), inputs: [], outputs: [], - numberOfMessages: ((tx["numberOfMessages"] == null) ? 0 : tx["numberOfMessages"]) as int, + numberOfMessages: ((tx["numberOfMessages"] == null) + ? 0 + : tx["numberOfMessages"]) as int, ); // txn.address = diff --git a/lib/services/coins/ethereum/ethereum_wallet.dart b/lib/services/coins/ethereum/ethereum_wallet.dart index 62f3020e0..b3800a4e4 100644 --- a/lib/services/coins/ethereum/ethereum_wallet.dart +++ b/lib/services/coins/ethereum/ethereum_wallet.dart @@ -310,7 +310,9 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB { } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance.log( "Generating new ${coin.prettyName} wallet.", level: LogLevel.Info, @@ -324,7 +326,7 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB { await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log( "Exception rethrown from initializeNew(): $e\n$s", @@ -338,7 +340,9 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB { ]); } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { // Logging.instance // .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); // if (!integrationTestFlag) { @@ -366,14 +370,23 @@ class EthereumWallet extends CoinServiceAPI with WalletCache, WalletDB { "Attempted to overwrite mnemonic on generate new wallet!"); } - final String mnemonic = bip39.generateMnemonic(strength: 128); + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } + final String mnemonic = bip39.generateMnemonic(strength: strength); + final String passphrase = data?.mnemonicPassphrase ?? ""; await _secureStore.write(key: '${_walletId}_mnemonic', value: mnemonic); await _secureStore.write( key: '${_walletId}_mnemonicPassphrase', - value: "", + value: passphrase, ); - await _generateAndSaveAddress(mnemonic, ""); + await _generateAndSaveAddress(mnemonic, passphrase); Logging.instance.log("_generateNewWalletFinished", level: LogLevel.Info); } diff --git a/lib/services/coins/firo/firo_wallet.dart b/lib/services/coins/firo/firo_wallet.dart index a4cea6393..d58cf4402 100644 --- a/lib/services/coins/firo/firo_wallet.dart +++ b/lib/services/coins/firo/firo_wallet.dart @@ -1875,7 +1875,9 @@ class FiroWallet extends CoinServiceAPI } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1886,7 +1888,7 @@ class FiroWallet extends CoinServiceAPI await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -2124,7 +2126,9 @@ class FiroWallet extends CoinServiceAPI } /// Generates initial wallet values such as mnemonic, chain (receive/change) arrays and indexes. - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -2158,12 +2162,20 @@ class FiroWallet extends CoinServiceAPI longMutex = false; throw Exception("Attempted to overwrite mnemonic on initialize new!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); + value: bip39.generateMnemonic(strength: strength)); await _secureStore.write( key: '${_walletId}_mnemonicPassphrase', - value: "", + value: data?.mnemonicPassphrase ?? "", ); // Generate and add addresses to relevant arrays diff --git a/lib/services/coins/litecoin/litecoin_wallet.dart b/lib/services/coins/litecoin/litecoin_wallet.dart index 703ec5cf6..26718bc4e 100644 --- a/lib/services/coins/litecoin/litecoin_wallet.dart +++ b/lib/services/coins/litecoin/litecoin_wallet.dart @@ -1285,7 +1285,9 @@ class LitecoinWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1296,7 +1298,7 @@ class LitecoinWallet extends CoinServiceAPI await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -1535,7 +1537,9 @@ class LitecoinWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -1570,12 +1574,20 @@ class LitecoinWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); + value: bip39.generateMnemonic(strength: strength)); await _secureStore.write( key: '${_walletId}_mnemonicPassphrase', - value: "", + value: data?.mnemonicPassphrase ?? "", ); // Generate and add addresses to relevant arrays diff --git a/lib/services/coins/manager.dart b/lib/services/coins/manager.dart index 1f5ae55f3..05f27d503 100644 --- a/lib/services/coins/manager.dart +++ b/lib/services/coins/manager.dart @@ -180,7 +180,9 @@ class Manager with ChangeNotifier { Future<bool> testNetworkConnection() => _currentWallet.testNetworkConnection(); - Future<void> initializeNew() => _currentWallet.initializeNew(); + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + _currentWallet.initializeNew(data); Future<void> initializeExisting() => _currentWallet.initializeExisting(); Future<void> recoverFromMnemonic({ required String mnemonic, diff --git a/lib/services/coins/monero/monero_wallet.dart b/lib/services/coins/monero/monero_wallet.dart index 5911e8592..a5284cc60 100644 --- a/lib/services/coins/monero/monero_wallet.dart +++ b/lib/services/coins/monero/monero_wallet.dart @@ -307,7 +307,9 @@ class MoneroWallet extends CoinServiceAPI with WalletCache, WalletDB { } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { await _prefs.init(); // this should never fail diff --git a/lib/services/coins/namecoin/namecoin_wallet.dart b/lib/services/coins/namecoin/namecoin_wallet.dart index d0f30ecac..8b27fe426 100644 --- a/lib/services/coins/namecoin/namecoin_wallet.dart +++ b/lib/services/coins/namecoin/namecoin_wallet.dart @@ -1268,7 +1268,9 @@ class NamecoinWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1279,7 +1281,7 @@ class NamecoinWallet extends CoinServiceAPI await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -1517,7 +1519,9 @@ class NamecoinWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -1544,12 +1548,20 @@ class NamecoinWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); + value: bip39.generateMnemonic(strength: strength)); await _secureStore.write( key: '${_walletId}_mnemonicPassphrase', - value: "", + value: data?.mnemonicPassphrase ?? "", ); // Generate and add addresses to relevant arrays diff --git a/lib/services/coins/nano/nano_wallet.dart b/lib/services/coins/nano/nano_wallet.dart index 391303675..34de1034d 100644 --- a/lib/services/coins/nano/nano_wallet.dart +++ b/lib/services/coins/nano/nano_wallet.dart @@ -607,7 +607,9 @@ class NanoWallet extends CoinServiceAPI with WalletCache, WalletDB { } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { if ((await mnemonicString) != null || (await mnemonicPassphrase) != null) { throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); diff --git a/lib/services/coins/particl/particl_wallet.dart b/lib/services/coins/particl/particl_wallet.dart index 324e8d9e5..33064ef85 100644 --- a/lib/services/coins/particl/particl_wallet.dart +++ b/lib/services/coins/particl/particl_wallet.dart @@ -1195,7 +1195,9 @@ class ParticlWallet extends CoinServiceAPI bool get isConnected => _isConnected; @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("Generating new ${coin.prettyName} wallet.", level: LogLevel.Info); @@ -1206,7 +1208,7 @@ class ParticlWallet extends CoinServiceAPI await _prefs.init(); try { - await _generateNewWallet(); + await _generateNewWallet(data); } catch (e, s) { Logging.instance.log("Exception rethrown from initializeNew(): $e\n$s", level: LogLevel.Fatal); @@ -1432,7 +1434,9 @@ class ParticlWallet extends CoinServiceAPI } } - Future<void> _generateNewWallet() async { + Future<void> _generateNewWallet( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { Logging.instance .log("IS_INTEGRATION_TEST: $integrationTestFlag", level: LogLevel.Info); if (!integrationTestFlag) { @@ -1459,12 +1463,20 @@ class ParticlWallet extends CoinServiceAPI throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); } + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } await _secureStore.write( key: '${_walletId}_mnemonic', - value: bip39.generateMnemonic(strength: 128)); + value: bip39.generateMnemonic(strength: strength)); await _secureStore.write( key: '${_walletId}_mnemonicPassphrase', - value: "", + value: data?.mnemonicPassphrase ?? "", ); // Generate and add addresses to relevant arrays diff --git a/lib/services/coins/stellar/stellar_wallet.dart b/lib/services/coins/stellar/stellar_wallet.dart index c4c92373f..2b06d3eef 100644 --- a/lib/services/coins/stellar/stellar_wallet.dart +++ b/lib/services/coins/stellar/stellar_wallet.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:bip39/bip39.dart' as bip39; import 'package:http/http.dart' as http; import 'package:isar/isar.dart'; import 'package:stackwallet/db/isar/main_db.dart'; @@ -326,7 +327,9 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB { } @override - Future<void> initializeNew() async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) async { if ((await mnemonicString) != null || (await mnemonicPassphrase) != null) { throw Exception( "Attempted to overwrite mnemonic on generate new wallet!"); @@ -334,11 +337,26 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB { await _prefs.init(); - String mnemonic = await Wallet.generate24WordsMnemonic(); + final int strength; + if (data == null || data.wordCount == 12) { + strength = 128; + } else if (data.wordCount == 24) { + strength = 256; + } else { + throw Exception("Invalid word count"); + } + final String mnemonic = bip39.generateMnemonic(strength: strength); + final String passphrase = data?.mnemonicPassphrase ?? ""; await _secureStore.write(key: '${_walletId}_mnemonic', value: mnemonic); - await _secureStore.write(key: '${_walletId}_mnemonicPassphrase', value: ""); + await _secureStore.write( + key: '${_walletId}_mnemonicPassphrase', + value: passphrase, + ); - Wallet wallet = await Wallet.from(mnemonic); + Wallet wallet = await Wallet.from( + mnemonic, + passphrase: passphrase, + ); KeyPair keyPair = await wallet.getKeyPair(index: 0); String address = keyPair.accountId; String secretSeed = diff --git a/lib/services/coins/wownero/wownero_wallet.dart b/lib/services/coins/wownero/wownero_wallet.dart index 6f0863334..7b3691846 100644 --- a/lib/services/coins/wownero/wownero_wallet.dart +++ b/lib/services/coins/wownero/wownero_wallet.dart @@ -333,7 +333,10 @@ class WowneroWallet extends CoinServiceAPI with WalletCache, WalletDB { } @override - Future<void> initializeNew({int seedWordsLength = 14}) async { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, { + int seedWordsLength = 14, + }) async { await _prefs.init(); // this should never fail diff --git a/lib/utilities/enums/coin_enum.dart b/lib/utilities/enums/coin_enum.dart index 677d474e7..6fe2ffa87 100644 --- a/lib/utilities/enums/coin_enum.dart +++ b/lib/utilities/enums/coin_enum.dart @@ -236,6 +236,35 @@ extension CoinExt on Coin { } } + bool get hasMnemonicPassphraseSupport { + switch (this) { + case Coin.bitcoin: + case Coin.bitcoinTestNet: + case Coin.litecoin: + case Coin.litecoinTestNet: + case Coin.bitcoincash: + case Coin.bitcoincashTestnet: + case Coin.dogecoin: + case Coin.dogecoinTestNet: + case Coin.firo: + case Coin.firoTestNet: + case Coin.namecoin: + case Coin.particl: + case Coin.ethereum: + case Coin.eCash: + case Coin.stellar: + case Coin.stellarTestnet: + return true; + + case Coin.epicCash: + case Coin.monero: + case Coin.wownero: + case Coin.nano: + case Coin.banano: + return false; + } + } + bool get hasBuySupport { switch (this) { case Coin.bitcoin: From 02baf4a1985fc906f78aef8c0f106afbe45b125f Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 15:10:51 -0600 Subject: [PATCH 2/7] ensure new wallet mnemonic options is reset --- .../name_your_wallet_view/name_your_wallet_view.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart b/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart index 4f88f99b3..f07941e36 100644 --- a/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart +++ b/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart @@ -361,6 +361,7 @@ class _NameYourWalletViewState extends ConsumerState<NameYourWalletView> { .read(mnemonicWordCountStateProvider.state) .state = Constants.possibleLengthsForCoin(coin).last; + ref.read(pNewWalletOptions.notifier).state = null; switch (widget.addWalletType) { case AddWalletType.New: From abbf557b411be18f9c9cad052d9651ae7fed3415 Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 15:40:12 -0600 Subject: [PATCH 3/7] style tweak --- .../new_wallet_options_view.dart | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart b/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart index 4f2dfb180..bf7f088d1 100644 --- a/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart @@ -112,7 +112,7 @@ class _NewWalletOptionsViewState extends ConsumerState<NewWalletOptionsView> { ), child: IntrinsicHeight( child: Padding( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.symmetric(horizontal: 16), child: child, ), ), @@ -129,22 +129,24 @@ class _NewWalletOptionsViewState extends ConsumerState<NewWalletOptionsView> { const Spacer( flex: 10, ), + if (!Util.isDesktop) + const SizedBox( + height: 16, + ), if (!Util.isDesktop) CoinImage( coin: widget.coin, height: 100, width: 100, ), - SizedBox( - height: Util.isDesktop ? 0 : 16, - ), - Text( - "Wallet options", - textAlign: TextAlign.center, - style: Util.isDesktop - ? STextStyles.desktopH2(context) - : STextStyles.pageTitleH1(context), - ), + if (Util.isDesktop) + Text( + "Wallet options", + textAlign: TextAlign.center, + style: Util.isDesktop + ? STextStyles.desktopH2(context) + : STextStyles.pageTitleH1(context), + ), SizedBox( height: Util.isDesktop ? 32 : 16, ), From e20ce631e6e232968fdff8e20d0ca43fb413c3da Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 15:40:19 -0600 Subject: [PATCH 4/7] count fix --- .../new_wallet_recovery_phrase_warning_view.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index f237fd4ae..d843f6ec8 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -221,9 +221,7 @@ class _NewWalletRecoveryPhraseWarningViewState ), ), TextSpan( - text: - "${Constants.defaultSeedPhraseLengthFor(coin: coin)}" - " words", + text: "$seedCount words", style: STextStyles.desktopH3(context).copyWith( color: Theme.of(context) .extension<StackColors>()! From 244a1914b370098151c8751b48ba2a1203349181 Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 17:06:30 -0600 Subject: [PATCH 5/7] verify mnemonic passphrase dialog --- .../verify_mnemonic_passphrase_dialog.dart | 218 ++++++++++++++++++ .../verify_recovery_phrase_view.dart | 19 ++ lib/widgets/stack_dialog.dart | 9 +- 3 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart new file mode 100644 index 000000000..3326622ad --- /dev/null +++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart @@ -0,0 +1,218 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:stackwallet/notifications/show_flush_bar.dart'; +import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart'; +import 'package:stackwallet/themes/stack_colors.dart'; +import 'package:stackwallet/utilities/assets.dart'; +import 'package:stackwallet/utilities/constants.dart'; +import 'package:stackwallet/utilities/text_styles.dart'; +import 'package:stackwallet/utilities/util.dart'; +import 'package:stackwallet/widgets/conditional_parent.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart'; +import 'package:stackwallet/widgets/desktop/primary_button.dart'; +import 'package:stackwallet/widgets/desktop/secondary_button.dart'; +import 'package:stackwallet/widgets/stack_dialog.dart'; +import 'package:stackwallet/widgets/stack_text_field.dart'; + +class VerifyMnemonicPassphraseDialog extends ConsumerStatefulWidget { + const VerifyMnemonicPassphraseDialog({super.key}); + + @override + ConsumerState<VerifyMnemonicPassphraseDialog> createState() => + _VerifyMnemonicPassphraseDialogState(); +} + +class _VerifyMnemonicPassphraseDialogState + extends ConsumerState<VerifyMnemonicPassphraseDialog> { + late final FocusNode passwordFocusNode; + late final TextEditingController passwordController; + + bool hidePassword = true; + + bool _verifyLock = false; + + void _verify() { + if (_verifyLock) { + return; + } + _verifyLock = true; + + if (passwordController.text == + ref.read(pNewWalletOptions.state).state!.mnemonicPassphrase) { + Navigator.of(context, rootNavigator: Util.isDesktop).pop("verified"); + } else { + showFloatingFlushBar( + type: FlushBarType.warning, + message: "Passphrase does not match", + context: context, + ); + } + + _verifyLock = false; + } + + @override + void initState() { + passwordController = TextEditingController(); + passwordFocusNode = FocusNode(); + + super.initState(); + } + + @override + void dispose() { + passwordController.dispose(); + passwordFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ConditionalParent( + condition: Util.isDesktop, + builder: (child) => DesktopDialog( + maxHeight: double.infinity, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Verify mnemonic passphrase", + style: STextStyles.desktopH3(context), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + ), + child: child, + ), + ], + ), + ), + child: ConditionalParent( + condition: !Util.isDesktop, + builder: (child) => StackDialogBase( + keyboardPaddingAmount: MediaQuery.of(context).viewInsets.bottom, + child: child, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!Util.isDesktop) + Text( + "Verify mnemonic passphrase", + style: STextStyles.pageTitleH2(context), + ), + const SizedBox( + height: 24, + ), + ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + key: const Key("mnemonicPassphraseFieldKey1"), + focusNode: passwordFocusNode, + controller: passwordController, + style: Util.isDesktop + ? STextStyles.desktopTextMedium(context).copyWith( + height: 2, + ) + : STextStyles.field(context), + obscureText: hidePassword, + enableSuggestions: false, + autocorrect: false, + decoration: standardInputDecoration( + "Recovery phrase password", + passwordFocusNode, + context, + ).copyWith( + suffixIcon: UnconstrainedBox( + child: ConditionalParent( + condition: Util.isDesktop, + builder: (child) => SizedBox( + height: 70, + child: child, + ), + child: Row( + children: [ + SizedBox( + width: Util.isDesktop ? 24 : 16, + ), + GestureDetector( + key: const Key( + "mnemonicPassphraseFieldShowPasswordButtonKey"), + onTap: () async { + setState(() { + hidePassword = !hidePassword; + }); + }, + child: SvgPicture.asset( + hidePassword + ? Assets.svg.eye + : Assets.svg.eyeSlash, + color: Theme.of(context) + .extension<StackColors>()! + .textDark3, + width: Util.isDesktop ? 24 : 16, + height: Util.isDesktop ? 24 : 16, + ), + ), + const SizedBox( + width: 12, + ), + ], + ), + ), + ), + ), + ), + ), + SizedBox( + height: Util.isDesktop ? 48 : 24, + ), + ConditionalParent( + condition: !Util.isDesktop, + builder: (child) => Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Cancel", + onPressed: Navigator.of( + context, + rootNavigator: Util.isDesktop, + ).pop, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: child, + ), + ], + ), + child: PrimaryButton( + label: "Verify", + onPressed: _verify, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart index fda4419d9..0d0083cc6 100644 --- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart +++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart @@ -16,9 +16,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/pages/add_wallet_views/add_token_view/edit_wallet_tokens_view.dart'; +import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'package:stackwallet/pages/add_wallet_views/select_wallet_for_token_view.dart'; import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table.dart'; +import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart'; import 'package:stackwallet/pages/home_view/home_view.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; @@ -98,8 +100,25 @@ class _VerifyRecoveryPhraseViewState // } // } + Future<bool> _verifyMnemonicPassphrase() async { + final result = await showDialog<String?>( + context: context, + builder: (_) => const VerifyMnemonicPassphraseDialog(), + ); + + return result == "verified"; + } + Future<void> _continue(bool isMatch) async { if (isMatch) { + if (ref.read(pNewWalletOptions.state).state != null) { + final passphraseVerified = await _verifyMnemonicPassphrase(); + + if (!passphraseVerified) { + return; + } + } + await ref.read(walletsServiceChangeNotifierProvider).setMnemonicVerified( walletId: _manager.walletId, ); diff --git a/lib/widgets/stack_dialog.dart b/lib/widgets/stack_dialog.dart index fead6a00a..be7f22ed9 100644 --- a/lib/widgets/stack_dialog.dart +++ b/lib/widgets/stack_dialog.dart @@ -18,15 +18,22 @@ class StackDialogBase extends StatelessWidget { Key? key, this.child, this.padding = const EdgeInsets.all(24), + this.keyboardPaddingAmount = 0, }) : super(key: key); final EdgeInsets padding; final Widget? child; + final double keyboardPaddingAmount; @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.all(16), + padding: EdgeInsets.only( + top: 16, + left: 16, + right: 16, + bottom: 16 + keyboardPaddingAmount, + ), child: Column( mainAxisAlignment: !Util.isDesktop ? MainAxisAlignment.end : MainAxisAlignment.center, From 4f7f7d57976d304d40fe88721f76192e07ba6ba6 Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 17:24:22 -0600 Subject: [PATCH 6/7] update mocks --- .../pages/send_view/send_view_test.mocks.dart | 18 ++++++--- ...d_address_book_view_screen_test.mocks.dart | 6 ++- ..._entry_details_view_screen_test.mocks.dart | 6 ++- ...ess_book_entry_view_screen_test.mocks.dart | 6 ++- .../lockscreen_view_screen_test.mocks.dart | 6 ++- .../main_view_screen_testA_test.mocks.dart | 6 ++- .../main_view_screen_testB_test.mocks.dart | 6 ++- .../main_view_screen_testC_test.mocks.dart | 6 ++- .../backup_key_view_screen_test.mocks.dart | 6 ++- ...up_key_warning_view_screen_test.mocks.dart | 6 ++- .../create_pin_view_screen_test.mocks.dart | 6 ++- ...restore_wallet_view_screen_test.mocks.dart | 6 ++- ...ify_backup_key_view_screen_test.mocks.dart | 6 ++- .../currency_view_screen_test.mocks.dart | 6 ++- ...dd_custom_node_view_screen_test.mocks.dart | 6 ++- .../node_details_view_screen_test.mocks.dart | 6 ++- .../wallet_backup_view_screen_test.mocks.dart | 6 ++- ...rescan_warning_view_screen_test.mocks.dart | 6 ++- ...elete_mnemonic_view_screen_test.mocks.dart | 6 ++- ...allet_settings_view_screen_test.mocks.dart | 16 +++----- .../settings_view_screen_test.mocks.dart | 6 ++- ...search_results_view_screen_test.mocks.dart | 6 ++- .../confirm_send_view_screen_test.mocks.dart | 6 ++- .../receive_view_screen_test.mocks.dart | 6 ++- .../send_view_screen_test.mocks.dart | 6 ++- .../wallet_view_screen_test.mocks.dart | 6 ++- .../bitcoin/bitcoin_wallet_test.mocks.dart | 10 +---- .../bitcoincash/bitcoincash_wallet_test.dart | 3 +- .../bitcoincash_wallet_test.mocks.dart | 10 +---- .../coins/dogecoin/dogecoin_wallet_test.dart | 3 +- .../dogecoin/dogecoin_wallet_test.mocks.dart | 10 +---- .../services/coins/fake_coin_service_api.dart | 4 +- .../coins/firo/firo_wallet_test.mocks.dart | 10 +---- test/services/coins/manager_test.mocks.dart | 27 ++++++++++++- .../namecoin/namecoin_wallet_test.mocks.dart | 10 +---- .../particl/particl_wallet_test.mocks.dart | 10 +---- .../managed_favorite_test.mocks.dart | 18 ++++++--- .../table_view/table_view_row_test.mocks.dart | 18 ++++++--- .../transaction_card_test.mocks.dart | 39 ++++++++++++++++--- test/widget_tests/wallet_card_test.mocks.dart | 6 ++- ...et_info_row_balance_future_test.mocks.dart | 18 ++++++--- .../wallet_info_row_test.mocks.dart | 18 ++++++--- 42 files changed, 245 insertions(+), 147 deletions(-) diff --git a/test/pages/send_view/send_view_test.mocks.dart b/test/pages/send_view/send_view_test.mocks.dart index c9414583d..52bc87fee 100644 --- a/test/pages/send_view/send_view_test.mocks.dart +++ b/test/pages/send_view/send_view_test.mocks.dart @@ -1283,10 +1283,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i27.BitcoinWallet { returnValueForMissingStub: null, ); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -3062,10 +3064,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i23.Future<bool>.value(false), ) as _i23.Future<bool>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -3415,10 +3419,12 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI { returnValueForMissingStub: _i23.Future<void>.value(), ) as _i23.Future<void>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), diff --git a/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart index 5edc4c538..29318d2c5 100644 --- a/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart +++ b/test/screen_tests/address_book_view/subviews/add_address_book_view_screen_test.mocks.dart @@ -492,10 +492,12 @@ class MockManager extends _i1.Mock implements _i12.Manager { returnValue: _i9.Future<bool>.value(false), ) as _i9.Future<bool>); @override - _i9.Future<void> initializeNew() => (super.noSuchMethod( + _i9.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i9.Future<void>.value(), returnValueForMissingStub: _i9.Future<void>.value(), diff --git a/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart index a84bb6a51..cd9108d2a 100644 --- a/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart +++ b/test/screen_tests/address_book_view/subviews/address_book_entry_details_view_screen_test.mocks.dart @@ -453,10 +453,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart b/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart index f44df83ca..65ab3b1f2 100644 --- a/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart +++ b/test/screen_tests/address_book_view/subviews/edit_address_book_entry_view_screen_test.mocks.dart @@ -451,10 +451,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/lockscreen_view_screen_test.mocks.dart b/test/screen_tests/lockscreen_view_screen_test.mocks.dart index 35a1a5f20..dd8f32b04 100644 --- a/test/screen_tests/lockscreen_view_screen_test.mocks.dart +++ b/test/screen_tests/lockscreen_view_screen_test.mocks.dart @@ -771,10 +771,12 @@ class MockManager extends _i1.Mock implements _i13.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart index 8526c77f3..87686d271 100644 --- a/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart +++ b/test/screen_tests/main_view_tests/main_view_screen_testA_test.mocks.dart @@ -558,10 +558,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i7.Future<bool>.value(false), ) as _i7.Future<bool>); @override - _i7.Future<void> initializeNew() => (super.noSuchMethod( + _i7.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i7.Future<void>.value(), returnValueForMissingStub: _i7.Future<void>.value(), diff --git a/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart index ba9350c78..221cbb329 100644 --- a/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart +++ b/test/screen_tests/main_view_tests/main_view_screen_testB_test.mocks.dart @@ -558,10 +558,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i7.Future<bool>.value(false), ) as _i7.Future<bool>); @override - _i7.Future<void> initializeNew() => (super.noSuchMethod( + _i7.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i7.Future<void>.value(), returnValueForMissingStub: _i7.Future<void>.value(), diff --git a/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart b/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart index 5f8055c5a..abb608127 100644 --- a/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart +++ b/test/screen_tests/main_view_tests/main_view_screen_testC_test.mocks.dart @@ -558,10 +558,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i7.Future<bool>.value(false), ) as _i7.Future<bool>); @override - _i7.Future<void> initializeNew() => (super.noSuchMethod( + _i7.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i7.Future<void>.value(), returnValueForMissingStub: _i7.Future<void>.value(), diff --git a/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart b/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart index d621a4ae0..b60b30832 100644 --- a/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/backup_key_view_screen_test.mocks.dart @@ -325,10 +325,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart b/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart index 6802650ab..90907cd14 100644 --- a/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/backup_key_warning_view_screen_test.mocks.dart @@ -556,10 +556,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i7.Future<bool>.value(false), ) as _i7.Future<bool>); @override - _i7.Future<void> initializeNew() => (super.noSuchMethod( + _i7.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i7.Future<void>.value(), returnValueForMissingStub: _i7.Future<void>.value(), diff --git a/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart b/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart index a9b4549a0..460a35f50 100644 --- a/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/create_pin_view_screen_test.mocks.dart @@ -771,10 +771,12 @@ class MockManager extends _i1.Mock implements _i13.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart b/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart index a33b13e7a..b4a8329da 100644 --- a/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/restore_wallet_view_screen_test.mocks.dart @@ -612,10 +612,12 @@ class MockManager extends _i1.Mock implements _i13.Manager { returnValue: _i9.Future<bool>.value(false), ) as _i9.Future<bool>); @override - _i9.Future<void> initializeNew() => (super.noSuchMethod( + _i9.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i9.Future<void>.value(), returnValueForMissingStub: _i9.Future<void>.value(), diff --git a/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart b/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart index e372e3781..25241ab80 100644 --- a/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart +++ b/test/screen_tests/onboarding/verify_backup_key_view_screen_test.mocks.dart @@ -325,10 +325,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart index ece50ef76..d77078d9c 100644 --- a/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/currency_view_screen_test.mocks.dart @@ -325,10 +325,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart index b56c08998..0b8976a88 100644 --- a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/add_custom_node_view_screen_test.mocks.dart @@ -540,10 +540,12 @@ class MockManager extends _i1.Mock implements _i12.Manager { returnValue: _i9.Future<bool>.value(false), ) as _i9.Future<bool>); @override - _i9.Future<void> initializeNew() => (super.noSuchMethod( + _i9.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i9.Future<void>.value(), returnValueForMissingStub: _i9.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart index 5e62fd6d4..803ef81c6 100644 --- a/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/network_settings_subviews/node_details_view_screen_test.mocks.dart @@ -540,10 +540,12 @@ class MockManager extends _i1.Mock implements _i12.Manager { returnValue: _i9.Future<bool>.value(false), ) as _i9.Future<bool>); @override - _i9.Future<void> initializeNew() => (super.noSuchMethod( + _i9.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i9.Future<void>.value(), returnValueForMissingStub: _i9.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart index 671af0d4b..4e59b2a40 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_backup_view_screen_test.mocks.dart @@ -325,10 +325,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart index e3a475bdd..151ecd1ab 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/rescan_warning_view_screen_test.mocks.dart @@ -325,10 +325,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart index 439dd35ca..d9e9603d3 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_subviews/wallet_delete_mnemonic_view_screen_test.mocks.dart @@ -556,10 +556,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i7.Future<bool>.value(false), ) as _i7.Future<bool>); @override - _i7.Future<void> initializeNew() => (super.noSuchMethod( + _i7.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i7.Future<void>.value(), returnValueForMissingStub: _i7.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart index cc20dce98..268529741 100644 --- a/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_subviews/wallet_settings_view_screen_test.mocks.dart @@ -154,18 +154,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i7.CachedElectrumX { _i8.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i8.Future<Map<String, dynamic>>); @override - _i8.Future<List<String>> getUsedCoinSerials({ - required _i9.Coin? coin, - int? startNumber = 0, - }) => + _i8.Future<List<String>> getUsedCoinSerials({required _i9.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i8.Future<List<String>>.value(<String>[]), ) as _i8.Future<List<String>>); @@ -792,10 +786,12 @@ class MockManager extends _i1.Mock implements _i15.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart b/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart index 4cfabb7bc..97837b511 100644 --- a/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart +++ b/test/screen_tests/settings_view/settings_view_screen_test.mocks.dart @@ -556,10 +556,12 @@ class MockManager extends _i1.Mock implements _i10.Manager { returnValue: _i7.Future<bool>.value(false), ) as _i7.Future<bool>); @override - _i7.Future<void> initializeNew() => (super.noSuchMethod( + _i7.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i7.Future<void>.value(), returnValueForMissingStub: _i7.Future<void>.value(), diff --git a/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart b/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart index b48b433a9..97563c8ad 100644 --- a/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart +++ b/test/screen_tests/transaction_subviews/transaction_search_results_view_screen_test.mocks.dart @@ -327,10 +327,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart index df0e2d613..bab69e5d2 100644 --- a/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/confirm_send_view_screen_test.mocks.dart @@ -326,10 +326,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart index e00ef1039..75c6d795e 100644 --- a/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/receive_view_screen_test.mocks.dart @@ -325,10 +325,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart index e5e86bf6e..eb261af73 100644 --- a/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/send_view_screen_test.mocks.dart @@ -367,10 +367,12 @@ class MockManager extends _i1.Mock implements _i9.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart b/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart index 674ad6549..d43cb5430 100644 --- a/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart +++ b/test/screen_tests/wallet_view/wallet_view_screen_test.mocks.dart @@ -327,10 +327,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i8.Future<bool>.value(false), ) as _i8.Future<bool>); @override - _i8.Future<void> initializeNew() => (super.noSuchMethod( + _i8.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i8.Future<void>.value(), returnValueForMissingStub: _i8.Future<void>.value(), diff --git a/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart b/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart index 32719f306..80b582256 100644 --- a/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart +++ b/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart @@ -485,18 +485,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX { _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i4.Future<Map<String, dynamic>>); @override - _i4.Future<List<String>> getUsedCoinSerials({ - required _i6.Coin? coin, - int? startNumber = 0, - }) => + _i4.Future<List<String>> getUsedCoinSerials({required _i6.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i4.Future<List<String>>.value(<String>[]), ) as _i4.Future<List<String>>); diff --git a/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart b/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart index 661c9a1b7..f3598dfa1 100644 --- a/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart +++ b/test/services/coins/bitcoincash/bitcoincash_wallet_test.dart @@ -626,7 +626,8 @@ void main() async { await Hive.openBox<dynamic>(testWalletId); await Hive.openBox<dynamic>(DB.boxNamePrefs); - await expectLater(() => bch?.initializeNew(), throwsA(isA<Exception>())) + await expectLater( + () => bch?.initializeNew(null), throwsA(isA<Exception>())) .then((_) { expect(secureStore.interactions, 2); verifyNever(client?.ping()).called(0); diff --git a/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart b/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart index 5599f3a29..52ae05ecd 100644 --- a/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart +++ b/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart @@ -485,18 +485,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX { _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i4.Future<Map<String, dynamic>>); @override - _i4.Future<List<String>> getUsedCoinSerials({ - required _i6.Coin? coin, - int? startNumber = 0, - }) => + _i4.Future<List<String>> getUsedCoinSerials({required _i6.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i4.Future<List<String>>.value(<String>[]), ) as _i4.Future<List<String>>); diff --git a/test/services/coins/dogecoin/dogecoin_wallet_test.dart b/test/services/coins/dogecoin/dogecoin_wallet_test.dart index 712000aae..32872dd04 100644 --- a/test/services/coins/dogecoin/dogecoin_wallet_test.dart +++ b/test/services/coins/dogecoin/dogecoin_wallet_test.dart @@ -483,7 +483,8 @@ void main() { await Hive.openBox<dynamic>(testWalletId); await Hive.openBox<dynamic>(DB.boxNamePrefs); - await expectLater(() => doge?.initializeNew(), throwsA(isA<Exception>())) + await expectLater( + () => doge?.initializeNew(null), throwsA(isA<Exception>())) .then((_) { expect(secureStore.interactions, 2); verifyNever(client?.ping()).called(0); diff --git a/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart b/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart index b084875f5..1027d0592 100644 --- a/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart +++ b/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart @@ -485,18 +485,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX { _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i4.Future<Map<String, dynamic>>); @override - _i4.Future<List<String>> getUsedCoinSerials({ - required _i6.Coin? coin, - int? startNumber = 0, - }) => + _i4.Future<List<String>> getUsedCoinSerials({required _i6.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i4.Future<List<String>>.value(<String>[]), ) as _i4.Future<List<String>>); diff --git a/test/services/coins/fake_coin_service_api.dart b/test/services/coins/fake_coin_service_api.dart index ea70545d1..413c493ab 100644 --- a/test/services/coins/fake_coin_service_api.dart +++ b/test/services/coins/fake_coin_service_api.dart @@ -88,7 +88,9 @@ class FakeCoinServiceAPI extends CoinServiceAPI { } @override - Future<void> initializeNew() { + Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data, + ) { // TODO: implement initializeNew throw UnimplementedError(); } diff --git a/test/services/coins/firo/firo_wallet_test.mocks.dart b/test/services/coins/firo/firo_wallet_test.mocks.dart index 0f7a0b0a3..de0ee0bcb 100644 --- a/test/services/coins/firo/firo_wallet_test.mocks.dart +++ b/test/services/coins/firo/firo_wallet_test.mocks.dart @@ -512,18 +512,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i6.CachedElectrumX { _i5.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i5.Future<Map<String, dynamic>>); @override - _i5.Future<List<String>> getUsedCoinSerials({ - required _i7.Coin? coin, - int? startNumber = 0, - }) => + _i5.Future<List<String>> getUsedCoinSerials({required _i7.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i5.Future<List<String>>.value(<String>[]), ) as _i5.Future<List<String>>); diff --git a/test/services/coins/manager_test.mocks.dart b/test/services/coins/manager_test.mocks.dart index ba4c8eb37..17d9efd5f 100644 --- a/test/services/coins/manager_test.mocks.dart +++ b/test/services/coins/manager_test.mocks.dart @@ -304,6 +304,11 @@ class MockFiroWallet extends _i1.Mock implements _i10.FiroWallet { ), ) as _i5.CachedElectrumX); @override + bool get lelantusCoinIsarRescanRequired => (super.noSuchMethod( + Invocation.getter(#lelantusCoinIsarRescanRequired), + returnValue: false, + ) as bool); + @override bool get isRefreshing => (super.noSuchMethod( Invocation.getter(#isRefreshing), returnValue: false, @@ -552,15 +557,35 @@ class MockFiroWallet extends _i1.Mock implements _i10.FiroWallet { returnValueForMissingStub: _i11.Future<void>.value(), ) as _i11.Future<void>); @override - _i11.Future<void> initializeNew() => (super.noSuchMethod( + _i11.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, + [data], + ), + returnValue: _i11.Future<void>.value(), + returnValueForMissingStub: _i11.Future<void>.value(), + ) as _i11.Future<void>); + @override + _i11.Future<void> setLelantusCoinIsarRescanRequiredDone() => + (super.noSuchMethod( + Invocation.method( + #setLelantusCoinIsarRescanRequiredDone, [], ), returnValue: _i11.Future<void>.value(), returnValueForMissingStub: _i11.Future<void>.value(), ) as _i11.Future<void>); @override + _i11.Future<bool> firoRescanRecovery() => (super.noSuchMethod( + Invocation.method( + #firoRescanRecovery, + [], + ), + returnValue: _i11.Future<bool>.value(false), + ) as _i11.Future<bool>); + @override _i11.Future<void> initializeExisting() => (super.noSuchMethod( Invocation.method( #initializeExisting, diff --git a/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart b/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart index ea48f7e85..403199041 100644 --- a/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart +++ b/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart @@ -485,18 +485,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX { _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i4.Future<Map<String, dynamic>>); @override - _i4.Future<List<String>> getUsedCoinSerials({ - required _i6.Coin? coin, - int? startNumber = 0, - }) => + _i4.Future<List<String>> getUsedCoinSerials({required _i6.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i4.Future<List<String>>.value(<String>[]), ) as _i4.Future<List<String>>); diff --git a/test/services/coins/particl/particl_wallet_test.mocks.dart b/test/services/coins/particl/particl_wallet_test.mocks.dart index 862c352d2..a93cde382 100644 --- a/test/services/coins/particl/particl_wallet_test.mocks.dart +++ b/test/services/coins/particl/particl_wallet_test.mocks.dart @@ -485,18 +485,12 @@ class MockCachedElectrumX extends _i1.Mock implements _i5.CachedElectrumX { _i4.Future<Map<String, dynamic>>.value(<String, dynamic>{}), ) as _i4.Future<Map<String, dynamic>>); @override - _i4.Future<List<String>> getUsedCoinSerials({ - required _i6.Coin? coin, - int? startNumber = 0, - }) => + _i4.Future<List<String>> getUsedCoinSerials({required _i6.Coin? coin}) => (super.noSuchMethod( Invocation.method( #getUsedCoinSerials, [], - { - #coin: coin, - #startNumber: startNumber, - }, + {#coin: coin}, ), returnValue: _i4.Future<List<String>>.value(<String>[]), ) as _i4.Future<List<String>>); diff --git a/test/widget_tests/managed_favorite_test.mocks.dart b/test/widget_tests/managed_favorite_test.mocks.dart index f81f66ebd..e980b67ee 100644 --- a/test/widget_tests/managed_favorite_test.mocks.dart +++ b/test/widget_tests/managed_favorite_test.mocks.dart @@ -1078,10 +1078,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet { returnValueForMissingStub: null, ); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -3056,10 +3058,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i23.Future<bool>.value(false), ) as _i23.Future<bool>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -3409,10 +3413,12 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI { returnValueForMissingStub: _i23.Future<void>.value(), ) as _i23.Future<void>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), diff --git a/test/widget_tests/table_view/table_view_row_test.mocks.dart b/test/widget_tests/table_view/table_view_row_test.mocks.dart index 2079f64b0..982bd16b1 100644 --- a/test/widget_tests/table_view/table_view_row_test.mocks.dart +++ b/test/widget_tests/table_view/table_view_row_test.mocks.dart @@ -1162,10 +1162,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i28.BitcoinWallet { returnValueForMissingStub: null, ); @override - _i22.Future<void> initializeNew() => (super.noSuchMethod( + _i22.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i22.Future<void>.value(), returnValueForMissingStub: _i22.Future<void>.value(), @@ -2302,10 +2304,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i22.Future<bool>.value(false), ) as _i22.Future<bool>); @override - _i22.Future<void> initializeNew() => (super.noSuchMethod( + _i22.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i22.Future<void>.value(), returnValueForMissingStub: _i22.Future<void>.value(), @@ -2655,10 +2659,12 @@ class MockCoinServiceAPI extends _i1.Mock implements _i19.CoinServiceAPI { returnValueForMissingStub: _i22.Future<void>.value(), ) as _i22.Future<void>); @override - _i22.Future<void> initializeNew() => (super.noSuchMethod( + _i22.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i22.Future<void>.value(), returnValueForMissingStub: _i22.Future<void>.value(), diff --git a/test/widget_tests/transaction_card_test.mocks.dart b/test/widget_tests/transaction_card_test.mocks.dart index 66bd37cf0..90afc98be 100644 --- a/test/widget_tests/transaction_card_test.mocks.dart +++ b/test/widget_tests/transaction_card_test.mocks.dart @@ -689,10 +689,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i19.Future<bool>.value(false), ) as _i19.Future<bool>); @override - _i19.Future<void> initializeNew() => (super.noSuchMethod( + _i19.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i19.Future<void>.value(), returnValueForMissingStub: _i19.Future<void>.value(), @@ -1046,10 +1048,12 @@ class MockCoinServiceAPI extends _i1.Mock implements _i7.CoinServiceAPI { returnValueForMissingStub: _i19.Future<void>.value(), ) as _i19.Future<void>); @override - _i19.Future<void> initializeNew() => (super.noSuchMethod( + _i19.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i19.Future<void>.value(), returnValueForMissingStub: _i19.Future<void>.value(), @@ -1313,6 +1317,11 @@ class MockFiroWallet extends _i1.Mock implements _i23.FiroWallet { ), ) as _i13.CachedElectrumX); @override + bool get lelantusCoinIsarRescanRequired => (super.noSuchMethod( + Invocation.getter(#lelantusCoinIsarRescanRequired), + returnValue: false, + ) as bool); + @override bool get isRefreshing => (super.noSuchMethod( Invocation.getter(#isRefreshing), returnValue: false, @@ -1561,15 +1570,35 @@ class MockFiroWallet extends _i1.Mock implements _i23.FiroWallet { returnValueForMissingStub: _i19.Future<void>.value(), ) as _i19.Future<void>); @override - _i19.Future<void> initializeNew() => (super.noSuchMethod( + _i19.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, + [data], + ), + returnValue: _i19.Future<void>.value(), + returnValueForMissingStub: _i19.Future<void>.value(), + ) as _i19.Future<void>); + @override + _i19.Future<void> setLelantusCoinIsarRescanRequiredDone() => + (super.noSuchMethod( + Invocation.method( + #setLelantusCoinIsarRescanRequiredDone, [], ), returnValue: _i19.Future<void>.value(), returnValueForMissingStub: _i19.Future<void>.value(), ) as _i19.Future<void>); @override + _i19.Future<bool> firoRescanRecovery() => (super.noSuchMethod( + Invocation.method( + #firoRescanRecovery, + [], + ), + returnValue: _i19.Future<bool>.value(false), + ) as _i19.Future<bool>); + @override _i19.Future<void> initializeExisting() => (super.noSuchMethod( Invocation.method( #initializeExisting, diff --git a/test/widget_tests/wallet_card_test.mocks.dart b/test/widget_tests/wallet_card_test.mocks.dart index f2d6e83b1..14744fc3f 100644 --- a/test/widget_tests/wallet_card_test.mocks.dart +++ b/test/widget_tests/wallet_card_test.mocks.dart @@ -817,10 +817,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i24.BitcoinWallet { returnValueForMissingStub: null, ); @override - _i21.Future<void> initializeNew() => (super.noSuchMethod( + _i21.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i21.Future<void>.value(), returnValueForMissingStub: _i21.Future<void>.value(), diff --git a/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart b/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart index 36d369769..ef519d4c9 100644 --- a/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart +++ b/test/widget_tests/wallet_info_row/sub_widgets/wallet_info_row_balance_future_test.mocks.dart @@ -1072,10 +1072,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i26.BitcoinWallet { returnValueForMissingStub: null, ); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -2411,10 +2413,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i23.Future<bool>.value(false), ) as _i23.Future<bool>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -2764,10 +2768,12 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI { returnValueForMissingStub: _i23.Future<void>.value(), ) as _i23.Future<void>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), diff --git a/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart b/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart index 357672d7a..16b4aa49e 100644 --- a/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart +++ b/test/widget_tests/wallet_info_row/wallet_info_row_test.mocks.dart @@ -1174,10 +1174,12 @@ class MockBitcoinWallet extends _i1.Mock implements _i29.BitcoinWallet { returnValueForMissingStub: null, ); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -2514,10 +2516,12 @@ class MockManager extends _i1.Mock implements _i6.Manager { returnValue: _i23.Future<bool>.value(false), ) as _i23.Future<bool>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), @@ -2867,10 +2871,12 @@ class MockCoinServiceAPI extends _i1.Mock implements _i20.CoinServiceAPI { returnValueForMissingStub: _i23.Future<void>.value(), ) as _i23.Future<void>); @override - _i23.Future<void> initializeNew() => (super.noSuchMethod( + _i23.Future<void> initializeNew( + ({String mnemonicPassphrase, int wordCount})? data) => + (super.noSuchMethod( Invocation.method( #initializeNew, - [], + [data], ), returnValue: _i23.Future<void>.value(), returnValueForMissingStub: _i23.Future<void>.value(), From 412fb73066c5801f14881fba59c3d65b95df8907 Mon Sep 17 00:00:00 2001 From: julian <julian@cypherstack.com> Date: Tue, 22 Aug 2023 18:22:46 -0600 Subject: [PATCH 7/7] bip39 passphrase wording changes to be more specific --- .../new_wallet_options/new_wallet_options_view.dart | 7 +++---- .../restore_options_view/restore_options_view.dart | 6 ++++-- .../verify_mnemonic_passphrase_dialog.dart | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart b/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart index bf7f088d1..3b50f8035 100644 --- a/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart @@ -288,9 +288,8 @@ class _NewWalletOptionsViewState extends ConsumerState<NewWalletOptionsView> { RoundedWhiteContainer( child: Center( child: Text( - "You may protect the wallet seed with an optional passphrase. " - "If you lose this passphrase you will not be able " - "to restore using just your seed words.", + "You may add a BIP39 passphrase. This is optional. " + "You will need BOTH you seed and your passphrase to recover the wallet.", style: Util.isDesktop ? STextStyles.desktopTextExtraSmall(context) .copyWith( @@ -322,7 +321,7 @@ class _NewWalletOptionsViewState extends ConsumerState<NewWalletOptionsView> { enableSuggestions: false, autocorrect: false, decoration: standardInputDecoration( - "Recovery phrase password", + "BIP39 passphrase", passwordFocusNode, context, ).copyWith( diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart index 59d1c0a8f..44ac51aac 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart @@ -535,7 +535,7 @@ class _RestoreOptionsViewState extends ConsumerState<RestoreOptionsView> { enableSuggestions: false, autocorrect: false, decoration: standardInputDecoration( - "Recovery phrase password", + "BIP39 passphrase", passwordFocusNode, context, ).copyWith( @@ -586,7 +586,9 @@ class _RestoreOptionsViewState extends ConsumerState<RestoreOptionsView> { RoundedWhiteContainer( child: Center( child: Text( - "If the recovery phrase you are about to restore was created with an optional passphrase you can enter it here.", + "If the recovery phrase you are about to restore " + "was created with an optional BIP39 passphrase " + "you can enter it here.", style: isDesktop ? STextStyles.desktopTextExtraSmall(context) .copyWith( diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart index 3326622ad..bae25a7e1 100644 --- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart +++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_mnemonic_passphrase_dialog.dart @@ -113,7 +113,7 @@ class _VerifyMnemonicPassphraseDialogState children: [ if (!Util.isDesktop) Text( - "Verify mnemonic passphrase", + "Verify BIP39 passphrase", style: STextStyles.pageTitleH2(context), ), const SizedBox( @@ -136,7 +136,7 @@ class _VerifyMnemonicPassphraseDialogState enableSuggestions: false, autocorrect: false, decoration: standardInputDecoration( - "Recovery phrase password", + "Enter your BIP39 passphrase", passwordFocusNode, context, ).copyWith(