dev
dart 153 lines 4.94 KB
Raw
1 import 'package:cake_wallet/di.dart';
2 import 'package:cake_wallet/store/settings_store.dart';
3 import 'package:cw_core/wallet_info.dart';
4 import 'package:cake_wallet/entities/preferences_key.dart';
5 import 'package:shared_preferences/shared_preferences.dart';
6 import 'package:cake_wallet/core/key_service.dart';
7 import 'package:cw_core/wallet_base.dart';
8 import 'package:cake_wallet/core/generate_wallet_password.dart';
9 import 'package:cw_core/wallet_credentials.dart';
10 import 'package:cw_core/wallet_service.dart';
11 import 'package:cw_core/wallet_type.dart';
12
13 class WalletCreationService {
14 WalletCreationService(
15 {required WalletType initialType,
16 required this.keyService,
17 required this.sharedPreferences,
18 required this.settingsStore})
19 : type = initialType {
20 changeWalletType(type: type);
21 }
22
23 WalletType type;
24 final SharedPreferences sharedPreferences;
25 final SettingsStore settingsStore;
26 final KeyService keyService;
27 WalletService? _service;
28
29 static const _isNewMoneroWalletPasswordUpdated = true;
30
31 void changeWalletType({required WalletType type}) {
32 this.type = type;
33 _service = getIt.get<WalletService>(param1: type);
34 }
35
36 Future<bool> exists(String name) async {
37 final walletName = name.toLowerCase();
38 return (await WalletInfo.getAll())
39 .any((walletInfo) => walletInfo.name.toLowerCase() == walletName);
40 }
41
42 Future<bool> typeExists(WalletType type) async {
43 return (await WalletInfo.getAll()).any((walletInfo) => walletInfo.type == type);
44 }
45
46 Future<void> checkIfExists(String name) async {
47 if (await exists(name)) {
48 throw Exception('Wallet with name ${name} already exists!');
49 }
50 }
51
52 Future<WalletBase> create(WalletCredentials credentials, {bool? isTestnet}) async {
53 await checkIfExists(credentials.name);
54
55 if (credentials.password == null) {
56 credentials.password = generateWalletPassword();
57 }
58 await keyService.saveWalletPassword(
59 password: credentials.password!, walletName: credentials.name);
60
61 if (_hasSeedPhraseLengthOption) {
62 credentials.seedPhraseLength = settingsStore.seedPhraseLength.value;
63 }
64 final wallet = await _service!.create(credentials, isTestnet: isTestnet);
65
66 if (wallet.type == WalletType.monero) {
67 await sharedPreferences.setBool(
68 PreferencesKey.moneroWalletUpdateV1Key(wallet.name), _isNewMoneroWalletPasswordUpdated);
69 }
70
71 return wallet;
72 }
73
74 bool get _hasSeedPhraseLengthOption {
75 switch (type) {
76 case WalletType.bitcoin:
77 case WalletType.litecoin:
78 case WalletType.bitcoinCash:
79 case WalletType.ethereum:
80 case WalletType.polygon:
81 case WalletType.base:
82 case WalletType.arbitrum:
83 case WalletType.bsc:
84 case WalletType.solana:
85 case WalletType.tron:
86 case WalletType.dogecoin:
87 case WalletType.nano:
88 case WalletType.zcash:
89 case WalletType.decred:
90 return true;
91 case WalletType.monero:
92 case WalletType.wownero:
93 case WalletType.none:
94 case WalletType.haven:
95 case WalletType.banano:
96 case WalletType.zano:
97 return false;
98 }
99 }
100
101 Future<WalletBase> restoreFromKeys(WalletCredentials credentials, {bool? isTestnet}) async {
102 await checkIfExists(credentials.name);
103
104 if (credentials.password == null) {
105 credentials.password = generateWalletPassword();
106 }
107 await keyService.saveWalletPassword(
108 password: credentials.password!, walletName: credentials.name);
109
110 final wallet = await _service!.restoreFromKeys(credentials, isTestnet: isTestnet);
111
112 if (wallet.type == WalletType.monero) {
113 await sharedPreferences.setBool(
114 PreferencesKey.moneroWalletUpdateV1Key(wallet.name), _isNewMoneroWalletPasswordUpdated);
115 }
116
117 return wallet;
118 }
119
120 Future<WalletBase> restoreFromSeed(WalletCredentials credentials, {bool? isTestnet}) async {
121 await checkIfExists(credentials.name);
122
123 if (credentials.password == null) {
124 credentials.password = generateWalletPassword();
125 }
126 await keyService.saveWalletPassword(
127 password: credentials.password!, walletName: credentials.name);
128
129 final wallet = await _service!.restoreFromSeed(credentials, isTestnet: isTestnet);
130
131 if (wallet.type == WalletType.monero) {
132 await sharedPreferences.setBool(
133 PreferencesKey.moneroWalletUpdateV1Key(wallet.name), _isNewMoneroWalletPasswordUpdated);
134 }
135
136 return wallet;
137 }
138
139 Future<WalletBase> restoreFromHardwareWallet(WalletCredentials credentials) async {
140 await checkIfExists(credentials.name);
141 final password = generateWalletPassword();
142 credentials.password = password;
143 await keyService.saveWalletPassword(password: password, walletName: credentials.name);
144 final wallet = await _service!.restoreFromHardwareWallet(credentials);
145
146 if (wallet.type == WalletType.monero) {
147 await sharedPreferences.setBool(
148 PreferencesKey.moneroWalletUpdateV1Key(wallet.name), _isNewMoneroWalletPasswordUpdated);
149 }
150
151 return wallet;
152 }
153 }