dev
dart 146 lines 4.58 KB
Raw
1 import 'dart:io';
2
3 import 'package:collection/collection.dart';
4 import 'package:cw_core/pathForWallet.dart';
5 import 'package:cw_core/utils/print_verbose.dart';
6 import 'package:cw_core/wallet_base.dart';
7 import 'package:cw_core/wallet_credentials.dart';
8 import 'package:cw_core/wallet_info.dart';
9 import 'package:cw_core/wallet_service.dart';
10 import 'package:cw_core/wallet_type.dart';
11 import 'package:cw_zano/zano_wallet.dart';
12 import 'package:cw_zano/zano_wallet_api.dart';
13 import 'package:hive/hive.dart';
14 import 'package:monero/zano.dart' as zano;
15
16 class ZanoNewWalletCredentials extends WalletCredentials {
17 ZanoNewWalletCredentials({required String name, String? password, required String? passphrase})
18 : super(name: name, password: password, passphrase: passphrase);
19 }
20
21 class ZanoRestoreWalletFromSeedCredentials extends WalletCredentials {
22 ZanoRestoreWalletFromSeedCredentials(
23 {required String name,
24 required String password,
25 required String passphrase,
26 required int height,
27 required this.mnemonic})
28 : super(name: name, password: password, passphrase: passphrase, height: height);
29
30 final String mnemonic;
31 }
32
33 class ZanoRestoreWalletFromKeysCredentials extends WalletCredentials {
34 ZanoRestoreWalletFromKeysCredentials(
35 {required String name,
36 required String password,
37 required this.language,
38 required this.address,
39 required this.viewKey,
40 required this.spendKey,
41 required int height})
42 : super(name: name, password: password, height: height);
43
44 final String language;
45 final String address;
46 final String viewKey;
47 final String spendKey;
48 }
49
50 class ZanoWalletService extends WalletService<
51 ZanoNewWalletCredentials,
52 ZanoRestoreWalletFromSeedCredentials,
53 ZanoRestoreWalletFromKeysCredentials,
54 ZanoNewWalletCredentials> {
55 ZanoWalletService();
56
57 static bool walletFilesExist(String path) =>
58 !File(path).existsSync() && !File('$path.keys').existsSync();
59
60 int hWallet = 0;
61
62 @override
63 WalletType getType() => WalletType.zano;
64
65 @override
66 Future<ZanoWallet> create(WalletCredentials credentials, {bool? isTestnet}) async {
67 printV('zanowallet service create isTestnet $isTestnet');
68 return await ZanoWalletBase.create(credentials: credentials);
69 }
70
71 @override
72 Future<bool> isWalletExit(String name) async {
73 final path = await pathForWallet(name: name, type: getType());
74 return zano.PlainWallet_isWalletExist(path);
75 }
76
77 @override
78 Future<ZanoWallet> openWallet(String name, String password) async {
79 final walletInfo = await WalletInfo.get(name, getType());
80 if (walletInfo == null) {
81 throw Exception('Wallet not found');
82 }
83 try {
84 final wallet =
85 await ZanoWalletBase.open(name: name, password: password, walletInfo: walletInfo);
86 saveBackup(name);
87 return wallet;
88 } catch (e) {
89 await restoreWalletFilesFromBackup(name);
90 return await ZanoWalletBase.open(name: name, password: password, walletInfo: walletInfo);
91 }
92 }
93
94 @override
95 Future<void> remove(String wallet) async {
96 final path = await pathForWalletDir(name: wallet, type: getType());
97 final file = Directory(path);
98 final isExist = file.existsSync();
99
100 if (isExist) {
101 await file.delete(recursive: true);
102 }
103
104 final walletInfo = await WalletInfo.get(wallet, getType());
105 if (walletInfo == null) {
106 throw Exception('Wallet not found');
107 }
108 await WalletInfo.delete(walletInfo);
109 }
110
111 @override
112 Future<void> rename(String currentName, String password, String newName) async {
113 final currentWalletInfo = await WalletInfo.get(currentName, getType());
114 if (currentWalletInfo == null) {
115 throw Exception('Wallet not found');
116 }
117 final currentWallet =
118 ZanoWallet(currentWalletInfo, await currentWalletInfo.getDerivationInfo(), password);
119
120 await currentWallet.renameWalletFiles(newName);
121
122 final newWalletInfo = currentWalletInfo;
123 newWalletInfo.id = WalletBase.idFor(newName, getType());
124 newWalletInfo.name = newName;
125
126 await newWalletInfo.save();
127 }
128
129 @override
130 Future<ZanoWallet> restoreFromKeys(ZanoRestoreWalletFromKeysCredentials credentials,
131 {bool? isTestnet}) async {
132 throw UnimplementedError();
133 }
134
135 @override
136 Future<ZanoWallet> restoreFromSeed(ZanoRestoreWalletFromSeedCredentials credentials,
137 {bool? isTestnet}) async {
138 return ZanoWalletBase.restore(credentials: credentials);
139 }
140
141 @override
142 Future<ZanoWallet> restoreFromHardwareWallet(ZanoNewWalletCredentials credentials) {
143 throw UnimplementedError(
144 "Restoring a Zano wallet from a hardware wallet is not yet supported!");
145 }
146 }