dev
dart 402 lines 12.9 KB
Raw
1 part of 'wownero.dart';
2
3 class CWWowneroAccountList extends WowneroAccountList {
4 CWWowneroAccountList(this._wallet);
5
6 final Object _wallet;
7
8 @override
9 @computed
10 ObservableList<Account> get accounts {
11 final wowneroWallet = _wallet as WowneroWallet;
12 final accounts = wowneroWallet.walletAddresses.accountList.accounts
13 .map((acc) => Account(id: acc.id, label: acc.label, balance: acc.balance))
14 .toList();
15 return ObservableList<Account>.of(accounts);
16 }
17
18 @override
19 void update(Object wallet) {
20 final wowneroWallet = wallet as WowneroWallet;
21 wowneroWallet.walletAddresses.accountList.update();
22 }
23
24 @override
25 void refresh(Object wallet) {
26 final wowneroWallet = wallet as WowneroWallet;
27 wowneroWallet.walletAddresses.accountList.refresh();
28 }
29
30 @override
31 List<Account> getAll(Object wallet) {
32 final wowneroWallet = wallet as WowneroWallet;
33 return wowneroWallet.walletAddresses.accountList
34 .getAll()
35 .map((acc) => Account(id: acc.id, label: acc.label, balance: acc.balance))
36 .toList();
37 }
38
39 @override
40 Future<void> addAccount(Object wallet, {required String label}) async {
41 final wowneroWallet = wallet as WowneroWallet;
42 await wowneroWallet.walletAddresses.accountList.addAccount(label: label);
43 }
44
45 @override
46 Future<void> setLabelAccount(Object wallet,
47 {required int accountIndex, required String label}) async {
48 final wowneroWallet = wallet as WowneroWallet;
49 await wowneroWallet.walletAddresses.accountList
50 .setLabelAccount(accountIndex: accountIndex, label: label);
51 if (accountIndex == wowneroWallet.walletAddresses.account?.id) {
52 wowneroWallet.walletAddresses.account = wownero_account.Account(
53 id: accountIndex, label: label, balance: wowneroWallet.walletAddresses.account!.balance);
54 }
55 }
56 }
57
58 class CWWowneroSubaddressList extends WowneroSubaddressList {
59 CWWowneroSubaddressList(this._wallet);
60
61 final Object _wallet;
62
63 @override
64 @computed
65 ObservableList<Subaddress> get subaddresses {
66 final wowneroWallet = _wallet as WowneroWallet;
67 final subAddresses = wowneroWallet.walletAddresses.subaddressList.subaddresses
68 .map((sub) => Subaddress(id: sub.id, address: sub.address, label: sub.label))
69 .toList();
70 return ObservableList<Subaddress>.of(subAddresses);
71 }
72
73 @override
74 void update(Object wallet, {required int accountIndex}) {
75 final wowneroWallet = wallet as WowneroWallet;
76 wowneroWallet.walletAddresses.subaddressList.update(accountIndex: accountIndex);
77 }
78
79 @override
80 void refresh(Object wallet, {required int accountIndex}) {
81 final wowneroWallet = wallet as WowneroWallet;
82 wowneroWallet.walletAddresses.subaddressList.refresh(accountIndex: accountIndex);
83 }
84
85 @override
86 List<Subaddress> getAll(Object wallet) {
87 final wowneroWallet = wallet as WowneroWallet;
88 return wowneroWallet.walletAddresses.subaddressList
89 .getAll()
90 .map((sub) => Subaddress(id: sub.id, label: sub.label, address: sub.address))
91 .toList();
92 }
93
94 @override
95 Future<void> addSubaddress(Object wallet,
96 {required int accountIndex, required String label}) async {
97 final wowneroWallet = wallet as WowneroWallet;
98 await wowneroWallet.walletAddresses.subaddressList
99 .addSubaddress(accountIndex: accountIndex, label: label);
100 }
101
102 @override
103 Future<void> setLabelSubaddress(Object wallet,
104 {required int accountIndex, required int addressIndex, required String label}) async {
105 final wowneroWallet = wallet as WowneroWallet;
106 await wowneroWallet.walletAddresses.subaddressList
107 .setLabelSubaddress(accountIndex: accountIndex, addressIndex: addressIndex, label: label);
108 }
109 }
110
111 class CWWowneroWalletDetails extends WowneroWalletDetails {
112 CWWowneroWalletDetails(this._wallet);
113
114 final Object _wallet;
115
116 @computed
117 @override
118 Account get account {
119 final wowneroWallet = _wallet as WowneroWallet;
120 final acc = wowneroWallet.walletAddresses.account;
121 return Account(id: acc!.id, label: acc.label, balance: acc.balance);
122 }
123
124 @computed
125 @override
126 WowneroBalance get balance {
127 throw Exception('Unimplemented');
128 // return WowneroBalance();
129 //return WowneroBalance(
130 // fullBalance: balance.fullBalance,
131 // unlockedBalance: balance.unlockedBalance);
132 }
133 }
134
135 class CWWownero extends Wownero {
136 @override
137 WowneroAccountList getAccountList(Object wallet) => CWWowneroAccountList(wallet);
138
139 @override
140 WowneroSubaddressList getSubaddressList(Object wallet) => CWWowneroSubaddressList(wallet);
141
142 @override
143 TransactionHistoryBase getTransactionHistory(Object wallet) {
144 final wowneroWallet = wallet as WowneroWallet;
145 return wowneroWallet.transactionHistory;
146 }
147
148 @override
149 WowneroWalletDetails getWowneroWalletDetails(Object wallet) => CWWowneroWalletDetails(wallet);
150
151 @override
152 int getHeightByDate({required DateTime date}) => getWowneroHeightByDate(date: date);
153
154 @override
155 TransactionPriority getDefaultTransactionPriority() => MoneroTransactionPriority.automatic;
156
157 @override
158 TransactionPriority getWowneroTransactionPrioritySlow() => MoneroTransactionPriority.slow;
159
160 @override
161 TransactionPriority getWowneroTransactionPriorityAutomatic() =>
162 MoneroTransactionPriority.automatic;
163
164 @override
165 TransactionPriority deserializeWowneroTransactionPriority({required int raw}) =>
166 MoneroTransactionPriority.deserialize(raw: raw);
167
168 @override
169 List<TransactionPriority> getTransactionPriorities() => MoneroTransactionPriority.all;
170
171 @override
172 List<String> getWowneroWordList(String language) {
173 if (language.startsWith("POLYSEED_")) {
174 final lang = language.replaceAll("POLYSEED_", "");
175 return PolyseedLang.getByEnglishName(lang).words;
176 }
177 if (language.startsWith("WOWSEED_")) {
178 final lang = language.replaceAll("WOWSEED_", "");
179 return PolyseedLang.getByEnglishName(lang).words;
180 }
181 switch (language.toLowerCase()) {
182 case 'english':
183 return EnglishMnemonics.words;
184 case 'chinese (simplified)':
185 return ChineseSimplifiedMnemonics.words;
186 case 'dutch':
187 return DutchMnemonics.words;
188 case 'german':
189 return GermanMnemonics.words;
190 case 'japanese':
191 return JapaneseMnemonics.words;
192 case 'portuguese':
193 return PortugueseMnemonics.words;
194 case 'russian':
195 return RussianMnemonics.words;
196 case 'spanish':
197 return SpanishMnemonics.words;
198 case 'french':
199 return FrenchMnemonics.words;
200 case 'italian':
201 return ItalianMnemonics.words;
202 default:
203 return EnglishMnemonics.words;
204 }
205 }
206
207 @override
208 WalletCredentials createWowneroRestoreWalletFromKeysCredentials(
209 {required String name,
210 required String spendKey,
211 required String viewKey,
212 required String address,
213 required String password,
214 required String language,
215 required int height}) =>
216 WowneroRestoreWalletFromKeysCredentials(
217 name: name,
218 spendKey: spendKey,
219 viewKey: viewKey,
220 address: address,
221 password: password,
222 language: language,
223 height: height);
224
225 @override
226 WalletCredentials createWowneroRestoreWalletFromSeedCredentials(
227 {required String name,
228 required String password,
229 required String passphrase,
230 required int height,
231 required String mnemonic}) =>
232 WowneroRestoreWalletFromSeedCredentials(
233 name: name,
234 password: password,
235 passphrase: passphrase,
236 height: height,
237 mnemonic: mnemonic);
238
239 @override
240 WalletCredentials createWowneroNewWalletCredentials(
241 {required String name,
242 required String language,
243 required bool isPolyseed,
244 String? password,
245 String? passphrase}) =>
246 WowneroNewWalletCredentials(
247 name: name,
248 password: password,
249 language: language,
250 isPolyseed: isPolyseed,
251 passphrase: passphrase);
252
253 @override
254 Map<String, String> getKeys(Object wallet) {
255 final wowneroWallet = wallet as WowneroWallet;
256 final keys = wowneroWallet.keys;
257 return <String, String>{
258 'privateSpendKey': keys.privateSpendKey,
259 'privateViewKey': keys.privateViewKey,
260 'publicSpendKey': keys.publicSpendKey,
261 'publicViewKey': keys.publicViewKey,
262 'passphrase': keys.passphrase
263 };
264 }
265
266 @override
267 int? getRestoreHeight(Object wallet) {
268 final wowneroWallet = wallet as WowneroWallet;
269 return wowneroWallet.restoreHeight;
270 }
271
272 @override
273 Object createWowneroTransactionCreationCredentials(
274 {required List<Output> outputs, required TransactionPriority priority}) =>
275 WowneroTransactionCreationCredentials(
276 outputs: outputs
277 .map((out) => OutputInfo(
278 fiatAmount: out.fiatAmount,
279 cryptoAmount: out.cryptoAmountMoney,
280 address: out.address,
281 note: out.note,
282 sendAll: out.sendAll,
283 extractedAddress: out.extractedAddress,
284 isParsedAddress: out.isParsedAddress,
285 ))
286 .toList(),
287 priority: priority as MoneroTransactionPriority);
288
289 @override
290 Object createWowneroTransactionCreationCredentialsRaw(
291 {required List<OutputInfo> outputs, required TransactionPriority priority}) =>
292 WowneroTransactionCreationCredentials(
293 outputs: outputs, priority: priority as MoneroTransactionPriority);
294
295 @override
296 String formatterWowneroAmountToString({required int amount}) =>
297 wowneroAmountToString(amount: amount);
298
299 @override
300 double formatterWowneroAmountToDouble({required int amount}) =>
301 wowneroAmountToDouble(amount: amount);
302
303 @override
304 int formatterWowneroParseAmount({required String amount}) => wowneroParseAmount(amount: amount);
305
306 @override
307 Account getCurrentAccount(Object wallet) {
308 final wowneroWallet = wallet as WowneroWallet;
309 final acc = wowneroWallet.walletAddresses.account;
310 return Account(id: acc!.id, label: acc.label, balance: acc.balance);
311 }
312
313 @override
314 void setCurrentAccount(Object wallet, int id, String label, String? balance) {
315 final wowneroWallet = wallet as WowneroWallet;
316 wowneroWallet.walletAddresses.account =
317 wownero_account.Account(id: id, label: label, balance: balance);
318 }
319
320 @override
321 void onStartup() => wownero_wallet_api.onStartup();
322
323 @override
324 int getTransactionInfoAccountId(TransactionInfo tx) {
325 final wowneroTransactionInfo = tx as WowneroTransactionInfo;
326 return wowneroTransactionInfo.accountIndex;
327 }
328
329 @override
330 WalletService createWowneroWalletService(Box<UnspentCoinsInfo> unspentCoinSource) =>
331 WowneroWalletService(unspentCoinSource);
332
333 @override
334 String getTransactionAddress(Object wallet, int accountIndex, int addressIndex) {
335 final wowneroWallet = wallet as WowneroWallet;
336 return wowneroWallet.getTransactionAddress(accountIndex, addressIndex);
337 }
338
339 @override
340 String getSubaddressLabel(Object wallet, int accountIndex, int addressIndex) {
341 final wowneroWallet = wallet as WowneroWallet;
342 return wowneroWallet.getSubaddressLabel(accountIndex, addressIndex);
343 }
344
345 @override
346 Map<String, String> pendingTransactionInfo(Object transaction) {
347 final ptx = transaction as PendingWowneroTransaction;
348 return {'id': ptx.id, 'hex': ptx.hex, 'key': ptx.txKey};
349 }
350
351 @override
352 List<Unspent> getUnspents(Object wallet) {
353 final wowneroWallet = wallet as WowneroWallet;
354 return wowneroWallet.unspentCoins;
355 }
356
357 @override
358 Future<void> updateUnspents(Object wallet) async {
359 final wowneroWallet = wallet as WowneroWallet;
360 await wowneroWallet.updateUnspent();
361 }
362
363 @override
364 Future<int> getCurrentHeight() async {
365 return wownero_wallet_api.getCurrentHeight();
366 }
367
368 String getLegacySeed(Object wallet, String langName) =>
369 (wallet as WowneroWalletBase).seedLegacy(langName);
370
371 @override
372 void wownerocCheck() {
373 checkIfMoneroCIsFine();
374 }
375
376 @override
377 Map<String, List<int>> debugCallLength() {
378 return wownero_wallet_api.debugCallLength();
379 }
380
381 @override
382 Future<void> backupSeeds(Box<HavenSeedStore> havenSeedStore) async {
383 final wallets = await WalletInfo.selectList('type = ?', [WalletType.wownero.index]);
384 final unspentCoinsInfo = await CakeHive.openBox<UnspentCoinsInfo>(UnspentCoinsInfo.boxName);
385 for (final w in wallets) {
386 final walletService = WowneroWalletService(unspentCoinsInfo);
387 final flutterSecureStorage = secureStorageShared;
388 final keyService = KeyService(flutterSecureStorage);
389 final password = await keyService.getWalletPassword(walletName: w.name);
390 String seed = "unknown";
391 try {
392 final wallet = await walletService.openWallet(w.name, password);
393 seed = wallet.seed;
394 wallet.close();
395 } catch (e) {
396 seed += "\n$e";
397 }
398 await havenSeedStore.add(HavenSeedStore(id: w.id, seed: seed));
399 }
400 await havenSeedStore.flush();
401 }
402 }