dev
dart 108 lines 3.75 KB
Raw
1 import 'package:cake_wallet/bitcoin/bitcoin.dart';
2 import 'package:cake_wallet/core/generate_wallet_password.dart';
3 import 'package:cake_wallet/core/wallet_creation_service.dart';
4 import 'package:cake_wallet/evm/evm.dart';
5 import 'package:cake_wallet/generated/i18n.dart';
6 import 'package:cake_wallet/monero/monero.dart';
7 import 'package:cake_wallet/store/app_store.dart';
8 import 'package:cake_wallet/view_model/hardware_wallet/hardware_wallet_view_model.dart';
9 import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
10 import 'package:cake_wallet/view_model/wallet_creation_vm.dart';
11 import 'package:cw_core/hardware/hardware_account_data.dart';
12 import 'package:cw_core/utils/print_verbose.dart';
13 import 'package:cw_core/wallet_base.dart';
14 import 'package:cw_core/wallet_credentials.dart';
15 import 'package:cw_core/wallet_info.dart';
16 import 'package:cw_core/wallet_type.dart';
17 import 'package:mobx/mobx.dart';
18
19 part 'wallet_hardware_restore_view_model.g.dart';
20
21 class WalletHardwareRestoreViewModel = WalletHardwareRestoreViewModelBase
22 with _$WalletHardwareRestoreViewModel;
23
24 abstract class WalletHardwareRestoreViewModelBase extends WalletCreationVM with Store {
25 final HardwareWalletViewModel hardwareWalletVM;
26
27 int _nextIndex = 0;
28
29 WalletHardwareRestoreViewModelBase(this.hardwareWalletVM, AppStore appStore,
30 WalletCreationService walletCreationService, SeedSettingsViewModel seedSettingsViewModel,
31 {required WalletType type})
32 : super(appStore, walletCreationService, seedSettingsViewModel, type: type, isRecovery: true);
33
34 @observable
35 String name = "";
36
37 @observable
38 HardwareAccountData? selectedAccount = null;
39
40 @observable
41 bool isLoadingMoreAccounts = false;
42
43 @observable
44 String? error = null;
45
46 bool get passphraseAvailable => hardwareWalletVM.hardwareWalletType == HardwareWalletType.trezor;
47
48 // @observable
49 ObservableList<HardwareAccountData> availableAccounts = ObservableList();
50
51 @action
52 Future<void> getNextAvailableAccounts(int limit) async {
53 try {
54 final service = await hardwareWalletVM.getHardwareWalletService(type);
55 final accounts = await service.getAvailableAccounts(index: _nextIndex, limit: limit);
56
57 availableAccounts.addAll(accounts);
58 _nextIndex += limit;
59 } catch (e) {
60 printV(e);
61 error =
62 hardwareWalletVM.interpretErrorCode(e.toString()) ?? S.current.ledger_connection_error;
63 }
64
65 isLoadingMoreAccounts = false;
66 }
67
68 @override
69 WalletCredentials getCredentials(dynamic _options) {
70 WalletCredentials credentials;
71 switch (type) {
72 case WalletType.bitcoin:
73 case WalletType.litecoin:
74 credentials = bitcoin!
75 .createBitcoinHardwareWalletCredentials(name: name, accountData: selectedAccount!);
76 break;
77 case WalletType.ethereum:
78 case WalletType.polygon:
79 credentials = evm!.createEVMHardwareWalletCredentials(
80 name: name,
81 hwAccountData: selectedAccount!,
82 );
83 break;
84 case WalletType.monero:
85 final password = walletPassword ?? generateWalletPassword();
86
87 credentials = monero!.createMoneroRestoreWalletFromHardwareCredentials(
88 name: name,
89 hardwareWalletService: hardwareWalletVM.getHardwareWalletService(type),
90 password: password,
91 height: _options['height'] as int? ?? 0,
92 passphrase: _options['passphrase'] as String?,
93 );
94 default:
95 throw Exception('Unexpected type: ${type.toString()}');
96 }
97
98 credentials.hardwareWalletType = hardwareWalletVM.hardwareWalletType;
99
100 return credentials;
101 }
102
103 @override
104 Future<WalletBase> process(WalletCredentials credentials) async {
105 walletCreationService.changeWalletType(type: type);
106 return walletCreationService.restoreFromHardwareWallet(credentials);
107 }
108 }