diff --git a/lib/core/wallet_creation_service.dart b/lib/core/wallet_creation_service.dart index dcb7983f5..636547308 100644 --- a/lib/core/wallet_creation_service.dart +++ b/lib/core/wallet_creation_service.dart @@ -1,6 +1,8 @@ import 'package:cake_wallet/di.dart'; +import 'package:cw_core/wallet_info.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:hive/hive.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:cake_wallet/core/key_service.dart'; import 'package:cw_core/wallet_base.dart'; @@ -14,7 +16,8 @@ class WalletCreationService { {WalletType initialType, this.secureStorage, this.keyService, - this.sharedPreferences}) + this.sharedPreferences, + this.walletInfoSource}) : type = initialType { if (type != null) { changeWalletType(type: type); @@ -25,6 +28,7 @@ class WalletCreationService { final FlutterSecureStorage secureStorage; final SharedPreferences sharedPreferences; final KeyService keyService; + final Box walletInfoSource; WalletService _service; void changeWalletType({@required WalletType type}) { @@ -32,7 +36,21 @@ class WalletCreationService { _service = getIt.get(param1: type); } + bool exists(String name) { + final walletName = name.toLowerCase(); + return walletInfoSource + .values + .any((walletInfo) => walletInfo.name.toLowerCase() == walletName); + } + + void checkIfExists(String name) { + if (exists(name)) { + throw Exception('Wallet with name ${name} already exists!'); + } + } + Future create(WalletCredentials credentials) async { + checkIfExists(credentials.name); final password = generateWalletPassword(type); credentials.password = password; await keyService.saveWalletPassword( @@ -41,6 +59,7 @@ class WalletCreationService { } Future restoreFromKeys(WalletCredentials credentials) async { + checkIfExists(credentials.name); final password = generateWalletPassword(type); credentials.password = password; await keyService.saveWalletPassword( @@ -49,6 +68,7 @@ class WalletCreationService { } Future restoreFromSeed(WalletCredentials credentials) async { + checkIfExists(credentials.name); final password = generateWalletPassword(type); credentials.password = password; await keyService.saveWalletPassword( diff --git a/lib/di.dart b/lib/di.dart index 7391e59ca..29fed4c56 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -215,7 +215,8 @@ Future setup( initialType: type, keyService: getIt.get(), secureStorage: getIt.get(), - sharedPreferences: getIt.get())); + sharedPreferences: getIt.get(), + walletInfoSource: _walletInfoSource)); getIt.registerFactoryParam((type, _) => WalletNewVM(getIt.get(), diff --git a/lib/view_model/wallet_creation_vm.dart b/lib/view_model/wallet_creation_vm.dart index 8a4c76eb5..50629bb9b 100644 --- a/lib/view_model/wallet_creation_vm.dart +++ b/lib/view_model/wallet_creation_vm.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/core/wallet_creation_service.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; @@ -15,7 +16,7 @@ part 'wallet_creation_vm.g.dart'; class WalletCreationVM = WalletCreationVMBase with _$WalletCreationVM; abstract class WalletCreationVMBase with Store { - WalletCreationVMBase(this._appStore, this._walletInfoSource, + WalletCreationVMBase(this._appStore, this._walletInfoSource, this.walletCreationService, {@required this.type, @required this.isRecovery}) { state = InitialExecutionState(); name = ''; @@ -29,14 +30,12 @@ abstract class WalletCreationVMBase with Store { WalletType type; final bool isRecovery; + final WalletCreationService walletCreationService; final Box _walletInfoSource; final AppStore _appStore; - bool nameExists(String name) { - final walletNameList = _walletInfoSource.values.map((e) => e.name.toLowerCase()).toList(); - - return walletNameList.contains(name.toLowerCase()); - } + bool nameExists(String name) + => walletCreationService.exists(name); Future create({dynamic options}) async { try { @@ -44,6 +43,8 @@ abstract class WalletCreationVMBase with Store { if (name?.isEmpty ?? true) { name = await generateName(); } + + walletCreationService.checkIfExists(name); final dirPath = await pathForWalletDir(name: name, type: type); final path = await pathForWallet(name: name, type: type); final credentials = getCredentials(options); diff --git a/lib/view_model/wallet_new_vm.dart b/lib/view_model/wallet_new_vm.dart index b044ea369..97a2aaee2 100644 --- a/lib/view_model/wallet_new_vm.dart +++ b/lib/view_model/wallet_new_vm.dart @@ -17,19 +17,17 @@ part 'wallet_new_vm.g.dart'; class WalletNewVM = WalletNewVMBase with _$WalletNewVM; abstract class WalletNewVMBase extends WalletCreationVM with Store { - WalletNewVMBase(AppStore appStore, this._walletCreationService, + WalletNewVMBase(AppStore appStore, WalletCreationService walletCreationService, Box walletInfoSource, {@required WalletType type}) : selectedMnemonicLanguage = '', - super(appStore, walletInfoSource, type: type, isRecovery: false); + super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: false); @observable String selectedMnemonicLanguage; bool get hasLanguageSelector => type == WalletType.monero || type == WalletType.haven; - final WalletCreationService _walletCreationService; - @override WalletCredentials getCredentials(dynamic options) { switch (type) { @@ -50,7 +48,7 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store { @override Future process(WalletCredentials credentials) async { - _walletCreationService.changeWalletType(type: type); - return _walletCreationService.create(credentials); + walletCreationService.changeWalletType(type: type); + return walletCreationService.create(credentials); } } diff --git a/lib/view_model/wallet_restoration_from_keys_vm.dart b/lib/view_model/wallet_restoration_from_keys_vm.dart index 060745695..a51d8011c 100644 --- a/lib/view_model/wallet_restoration_from_keys_vm.dart +++ b/lib/view_model/wallet_restoration_from_keys_vm.dart @@ -20,9 +20,9 @@ class WalletRestorationFromKeysVM = WalletRestorationFromKeysVMBase abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM with Store { WalletRestorationFromKeysVMBase(AppStore appStore, - this._walletCreationService, Box walletInfoSource, + WalletCreationService walletCreationService, Box walletInfoSource, {@required WalletType type, @required this.language}) - : super(appStore, walletInfoSource, type: type, isRecovery: true); + : super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true); @observable int height; @@ -42,7 +42,6 @@ abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM bool get hasRestorationHeight => type == WalletType.monero; final String language; - final WalletCreationService _walletCreationService; @override WalletCredentials getCredentials(dynamic options) { @@ -68,5 +67,5 @@ abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM @override Future process(WalletCredentials credentials) async => - _walletCreationService.restoreFromKeys(credentials); + walletCreationService.restoreFromKeys(credentials); } diff --git a/lib/view_model/wallet_restoration_from_seed_vm.dart b/lib/view_model/wallet_restoration_from_seed_vm.dart index 1af730f13..ffd4184e0 100644 --- a/lib/view_model/wallet_restoration_from_seed_vm.dart +++ b/lib/view_model/wallet_restoration_from_seed_vm.dart @@ -20,9 +20,9 @@ class WalletRestorationFromSeedVM = WalletRestorationFromSeedVMBase abstract class WalletRestorationFromSeedVMBase extends WalletCreationVM with Store { WalletRestorationFromSeedVMBase(AppStore appStore, - this._walletCreationService, Box walletInfoSource, + WalletCreationService walletCreationService, Box walletInfoSource, {@required WalletType type, @required this.language, this.seed}) - : super(appStore, walletInfoSource, type: type, isRecovery: true); + : super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true); @observable String seed; @@ -33,7 +33,6 @@ abstract class WalletRestorationFromSeedVMBase extends WalletCreationVM bool get hasRestorationHeight => type == WalletType.monero; final String language; - final WalletCreationService _walletCreationService; @override WalletCredentials getCredentials(dynamic options) { @@ -53,5 +52,5 @@ abstract class WalletRestorationFromSeedVMBase extends WalletCreationVM @override Future process(WalletCredentials credentials) async => - _walletCreationService.restoreFromSeed(credentials); + walletCreationService.restoreFromSeed(credentials); } diff --git a/lib/view_model/wallet_restore_view_model.dart b/lib/view_model/wallet_restore_view_model.dart index 1943f76b9..83dcc57ce 100644 --- a/lib/view_model/wallet_restore_view_model.dart +++ b/lib/view_model/wallet_restore_view_model.dart @@ -22,7 +22,7 @@ class WalletRestoreViewModel = WalletRestoreViewModelBase with _$WalletRestoreViewModel; abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { - WalletRestoreViewModelBase(AppStore appStore, this._walletCreationService, + WalletRestoreViewModelBase(AppStore appStore, WalletCreationService walletCreationService, Box walletInfoSource, {@required WalletType type}) : availableModes = (type == WalletType.monero || type == WalletType.haven) @@ -30,11 +30,11 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { : [WalletRestoreMode.seed], hasSeedLanguageSelector = type == WalletType.monero || type == WalletType.haven, hasBlockchainHeightLanguageSelector = type == WalletType.monero || type == WalletType.haven, - super(appStore, walletInfoSource, type: type, isRecovery: true) { + super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true) { isButtonEnabled = !hasSeedLanguageSelector && !hasBlockchainHeightLanguageSelector; mode = WalletRestoreMode.seed; - _walletCreationService.changeWalletType(type: type); + walletCreationService.changeWalletType(type: type); } static const moneroSeedMnemonicLength = 25; @@ -44,7 +44,6 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { final List availableModes; final bool hasSeedLanguageSelector; final bool hasBlockchainHeightLanguageSelector; - final WalletCreationService _walletCreationService; @observable WalletRestoreMode mode; @@ -123,9 +122,9 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store { @override Future process(WalletCredentials credentials) async { if (mode == WalletRestoreMode.keys) { - return _walletCreationService.restoreFromKeys(credentials); + return walletCreationService.restoreFromKeys(credentials); } - return _walletCreationService.restoreFromSeed(credentials); + return walletCreationService.restoreFromSeed(credentials); } }