dev
dart 115 lines 3.58 KB
Raw
1 import 'dart:async';
2 import 'dart:io';
3
4 import 'package:cake_wallet/bitcoin/bitcoin.dart';
5 import 'package:cake_wallet/entities/hardware_wallet/hardware_wallet_device.dart';
6 import 'package:cake_wallet/evm/evm.dart';
7 import 'package:cake_wallet/view_model/hardware_wallet/hardware_wallet_view_model.dart';
8 import 'package:cake_wallet/wallet_type_utils.dart';
9 import 'package:cw_core/hardware/hardware_wallet_service.dart';
10 import 'package:cw_core/root_dir.dart';
11 import 'package:cw_core/utils/print_verbose.dart';
12 import 'package:cw_core/wallet_base.dart';
13 import 'package:cw_core/wallet_info.dart';
14 import 'package:cw_core/wallet_type.dart';
15 import 'package:bitbox_flutter/bitbox_flutter.dart' as sdk;
16 import 'package:mobx/mobx.dart';
17
18 part 'bitbox_view_model.g.dart';
19
20 class BitboxViewModel = BitboxViewModelBase with _$BitboxViewModel;
21
22 abstract class BitboxViewModelBase extends HardwareWalletViewModel with Store {
23 late final sdk.BitboxManager bitboxManager;
24
25 BitboxViewModelBase() {
26 if (!Platform.isIOS && !isMoneroOnly) {
27 bitboxManager = sdk.BitboxManager();
28 }
29 }
30
31 @override
32 HardwareWalletType get hardwareWalletType => HardwareWalletType.bitbox;
33
34 @override
35 @observable
36 bool isBleEnabled = false;
37
38 @override
39 @observable
40 bool isConnecting = false;
41
42 @override
43 bool get hasBluetooth => Platform.isIOS && false; // TODO: remove when we enable bluetooth
44
45 @override
46 Future<void> updateBleState() async {}
47
48 @override
49 Stream<HardwareWalletDevice> scanForBleDevices() => throw UnimplementedError();
50
51 @override
52 Future<List<HardwareWalletDevice>> getAllUsbDevices() => bitboxManager.devices
53 .then((devices) => devices.map((d) => BitboxHardwareWalletDevice(d)).toList());
54
55 @override
56 Future<void> stopScanning() async {}
57
58 @override
59 @action
60 Future<bool> connectDevice(HardwareWalletDevice device, WalletType type) async {
61 if (!(device is BitboxHardwareWalletDevice)) return false;
62 if (isConnecting) return false;
63 isConnecting = true;
64
65 try {
66 final appDocDir = await getAppDir();
67
68 await bitboxManager.connect(device.device);
69 printV("Got Connection", file: '${appDocDir.path}/error.txt');
70 await bitboxManager.initBitBox();
71 printV("Bitbox initialized!", file: '${appDocDir.path}/error.txt');
72 await bitboxManager.channelHashVerify();
73 printV("Bitbox channel-hash verified!", file: '${appDocDir.path}/error.txt');
74 isConnecting = false;
75 return true;
76 } catch (e) {
77 printV(e);
78 }
79 isConnecting = false;
80 return false;
81 }
82
83 @override
84 bool isConnected(WalletType type) => false;
85
86 @override
87 HardwareWalletService getHardwareWalletService(WalletType type) {
88 switch (type) {
89 case WalletType.bitcoin:
90 return bitcoin!.getBitboxHardwareWalletService(bitboxManager, true);
91 case WalletType.litecoin:
92 return bitcoin!.getBitboxHardwareWalletService(bitboxManager, false);
93 case WalletType.ethereum:
94 case WalletType.polygon:
95 return evm!.getBitboxHardwareWalletService(bitboxManager);
96 default:
97 throw UnimplementedError();
98 }
99 }
100
101 @override
102 Future<void> initWallet(WalletBase wallet) async {
103 switch (wallet.type) {
104 case WalletType.bitcoin:
105 case WalletType.litecoin:
106 return bitcoin!
107 .setHardwareWalletService(wallet, await getHardwareWalletService(wallet.type));
108 case WalletType.ethereum:
109 case WalletType.polygon:
110 return evm!.setHardwareWalletService(wallet, await getHardwareWalletService(wallet.type));
111 default:
112 throw Exception('Unexpected wallet type: ${wallet.type} for bitbox');
113 }
114 }
115 }