- Fix haven and litecoin fee transaction priority issue - Revert removing fiat rate update and use it to update fiat rate periodically if Fiat API is not disabled

- Fix haven and litecoin fee transaction priority issue - Revert removing fiat rate update and use it to update fiat rate periodically if Fiat API is not disabled

OmarHatem committed Dec 8, 2022 at 17:23 UTC ce19be56a05d6cb8861e103f1c8778df6256656f
6 files changed +104 -24
lib/bitcoin/cw_bitcoin.dart
+4
@@ -51,6 +51,10 @@ class CWBitcoin extends Bitcoin {
51 TransactionPriority deserializeBitcoinTransactionPriority(int raw)
52 => BitcoinTransactionPriority.deserialize(raw: raw);
53
54 + @override
55 + TransactionPriority deserializeLitecoinTransactionPriority(int raw)
56 + => LitecoinTransactionPriority.deserialize(raw: raw);
57 +
58 @override
59 int getFeeRate(Object wallet, TransactionPriority priority) {
60 final bitcoinWallet = wallet as ElectrumWallet;
lib/entities/preferences_key.dart
+2
@@ -22,6 +22,8 @@ class PreferencesKey {
22 'current_default_settings_migration_version';
23 static const moneroTransactionPriority = 'current_fee_priority_monero';
24 static const bitcoinTransactionPriority = 'current_fee_priority_bitcoin';
25 + static const havenTransactionPriority = 'current_fee_priority_haven';
26 + static const litecoinTransactionPriority = 'current_fee_priority_litecoin';
27 static const shouldShowReceiveWarning = 'should_show_receive_warning';
28 static const shouldShowYatPopup = 'should_show_yat_popup';
29 static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1';
lib/reactions/bootstrap.dart
+2
@@ -1,4 +1,5 @@
1 import 'dart:async';
2 +import 'package:cake_wallet/reactions/fiat_rate_update.dart';
3 import 'package:cake_wallet/reactions/on_current_node_change.dart';
4 import 'package:flutter/cupertino.dart';
5 import 'package:flutter/widgets.dart';
@@ -31,4 +32,5 @@ Future<void> bootstrap(GlobalKey<NavigatorState> navigatorKey) async {
32 appStore, settingsStore, fiatConversionStore);
33 startCurrentFiatChangeReaction(appStore, settingsStore, fiatConversionStore);
34 startOnCurrentNodeChangeReaction(appStore);
35 + startFiatRateUpdate(appStore, settingsStore, fiatConversionStore);
36 }
lib/reactions/fiat_rate_update.dart new
+40
@@ -0,0 +1,40 @@
1 +import 'dart:async';
2 +import 'package:cake_wallet/core/fiat_conversion_service.dart';
3 +import 'package:cake_wallet/entities/fiat_api_mode.dart';
4 +import 'package:cake_wallet/entities/update_haven_rate.dart';
5 +import 'package:cake_wallet/store/app_store.dart';
6 +import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
7 +import 'package:cake_wallet/store/settings_store.dart';
8 +import 'package:cw_core/wallet_type.dart';
9 +
10 +Timer? _timer;
11 +
12 +Future<void> startFiatRateUpdate(
13 + AppStore appStore, SettingsStore settingsStore, FiatConversionStore fiatConversionStore) async {
14 + if (_timer != null) {
15 + return;
16 + }
17 +
18 + if (appStore.wallet != null && settingsStore.fiatApiMode == FiatApiMode.enabled) {
19 + fiatConversionStore.prices[appStore.wallet!.currency] = await FiatConversionService.fetchPrice(
20 + appStore.wallet!.currency, settingsStore.fiatCurrency);
21 + }
22 +
23 + _timer = Timer.periodic(Duration(seconds: 30), (_) async {
24 + if (settingsStore.fiatApiMode == FiatApiMode.disabled) {
25 + return;
26 + }
27 +
28 + try {
29 + if (appStore.wallet!.type == WalletType.haven) {
30 + await updateHavenRate(fiatConversionStore);
31 + } else {
32 + fiatConversionStore.prices[appStore.wallet!.currency] =
33 + await FiatConversionService.fetchPrice(
34 + appStore.wallet!.currency, settingsStore.fiatCurrency);
35 + }
36 + } catch (e) {
37 + print(e);
38 + }
39 + });
40 +}
lib/store/settings_store.dart
+55 -24
@@ -44,7 +44,9 @@ abstract class SettingsStoreBase with Store {
44 required this.isBitcoinBuyEnabled,
45 required this.actionlistDisplayMode,
46 TransactionPriority? initialBitcoinTransactionPriority,
47 - TransactionPriority? initialMoneroTransactionPriority})
47 + TransactionPriority? initialMoneroTransactionPriority,
48 + TransactionPriority? initialHavenTransactionPriority,
49 + TransactionPriority? initialLitecoinTransactionPriority})
50 : nodes = ObservableMap<WalletType, Node>.of(nodes),
51 _sharedPreferences = sharedPreferences,
52 fiatCurrency = initialFiatCurrency,
@@ -67,6 +69,14 @@ abstract class SettingsStoreBase with Store {
69 priority[WalletType.bitcoin] = initialBitcoinTransactionPriority;
70 }
71
72 + if (initialHavenTransactionPriority != null) {
73 + priority[WalletType.haven] = initialHavenTransactionPriority;
74 + }
75 +
76 + if (initialLitecoinTransactionPriority != null) {
77 + priority[WalletType.litecoin] = initialLitecoinTransactionPriority;
78 + }
79 +
80 reaction(
81 (_) => fiatCurrency,
82 (FiatCurrency fiatCurrency) => sharedPreferences.setString(
@@ -78,11 +88,25 @@ abstract class SettingsStoreBase with Store {
88 .setBool(PreferencesKey.shouldShowYatPopup, shouldShowYatPopup));
89
90 priority.observe((change) {
81 - final key = change.key == WalletType.monero
82 - ? PreferencesKey.moneroTransactionPriority
83 - : PreferencesKey.bitcoinTransactionPriority;
91 + final String? key;
92 + switch (change.key) {
93 + case WalletType.monero:
94 + key = PreferencesKey.moneroTransactionPriority;
95 + break;
96 + case WalletType.bitcoin:
97 + key = PreferencesKey.bitcoinTransactionPriority;
98 + break;
99 + case WalletType.litecoin:
100 + key = PreferencesKey.litecoinTransactionPriority;
101 + break;
102 + case WalletType.haven:
103 + key = PreferencesKey.havenTransactionPriority;
104 + break;
105 + default:
106 + key = null;
107 + }
108
85 - if (change.newValue != null) {
109 + if (change.newValue != null && key != null) {
110 sharedPreferences.setInt(key, change.newValue!.serialize());
111 }
112 });
@@ -202,33 +226,39 @@ abstract class SettingsStoreBase with Store {
226 static Future<SettingsStore> load(
227 {required Box<Node> nodeSource,
228 required bool isBitcoinBuyEnabled,
205 - TransactionPriority? initialMoneroTransactionPriority,
206 - TransactionPriority? initialBitcoinTransactionPriority,
229 FiatCurrency initialFiatCurrency = FiatCurrency.usd,
230 BalanceDisplayMode initialBalanceDisplayMode =
231 BalanceDisplayMode.availableBalance}) async {
210 - if (initialBitcoinTransactionPriority == null) {
211 - initialBitcoinTransactionPriority = bitcoin?.getMediumTransactionPriority();
212 - }
213 -
214 - if (initialMoneroTransactionPriority == null) {
215 - initialMoneroTransactionPriority = monero?.getDefaultTransactionPriority();
216 - }
232
233 final sharedPreferences = await getIt.getAsync<SharedPreferences>();
234 final currentFiatCurrency = FiatCurrency.deserialize(raw:
235 sharedPreferences.getString(PreferencesKey.currentFiatCurrencyKey)!);
221 - final savedMoneroTransactionPriority =
236 +
237 + TransactionPriority? moneroTransactionPriority =
238 monero?.deserializeMoneroTransactionPriority(
239 raw: sharedPreferences
240 .getInt(PreferencesKey.moneroTransactionPriority)!);
225 - final savedBitcoinTransactionPriority =
241 + TransactionPriority? bitcoinTransactionPriority =
242 bitcoin?.deserializeBitcoinTransactionPriority(sharedPreferences
243 .getInt(PreferencesKey.bitcoinTransactionPriority)!);
228 - final moneroTransactionPriority =
229 - savedMoneroTransactionPriority ?? initialMoneroTransactionPriority;
230 - final bitcoinTransactionPriority =
231 - savedBitcoinTransactionPriority ?? initialBitcoinTransactionPriority;
244 +
245 + TransactionPriority? havenTransactionPriority;
246 + TransactionPriority? litecoinTransactionPriority;
247 +
248 + if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
249 + havenTransactionPriority = monero?.deserializeMoneroTransactionPriority(
250 + raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!);
251 + }
252 + if (sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) {
253 + litecoinTransactionPriority = bitcoin?.deserializeLitecoinTransactionPriority(
254 + sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!);
255 + }
256 +
257 + moneroTransactionPriority ??= monero?.getDefaultTransactionPriority();
258 + bitcoinTransactionPriority ??= bitcoin?.getMediumTransactionPriority();
259 + havenTransactionPriority ??= monero?.getDefaultTransactionPriority();
260 + litecoinTransactionPriority ??= bitcoin?.getLitecoinTransactionPriorityMedium();
261 +
262 final currentBalanceDisplayMode = BalanceDisplayMode.deserialize(
263 raw: sharedPreferences
264 .getInt(PreferencesKey.currentBalanceDisplayModeKey)!);
@@ -249,8 +279,7 @@ abstract class SettingsStoreBase with Store {
279 : ThemeType.bright.index;
280 final savedTheme = ThemeList.deserialize(
281 raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ??
252 - legacyTheme ??
253 - 0);
282 + legacyTheme);
283 final actionListDisplayMode = ObservableList<ActionListDisplayMode>();
284 actionListDisplayMode.addAll(deserializeActionlistDisplayModes(
285 sharedPreferences.getInt(PreferencesKey.displayActionListModeKey) ??
@@ -296,7 +325,7 @@ abstract class SettingsStoreBase with Store {
325 if (havenNode != null) {
326 nodes[WalletType.haven] = havenNode;
327 }
299 -
328 +
329 return SettingsStore(
330 sharedPreferences: sharedPreferences,
331 nodes: nodes,
@@ -314,6 +343,8 @@ abstract class SettingsStoreBase with Store {
343 initialLanguageCode: savedLanguageCode,
344 initialMoneroTransactionPriority: moneroTransactionPriority,
345 initialBitcoinTransactionPriority: bitcoinTransactionPriority,
346 + initialHavenTransactionPriority: havenTransactionPriority,
347 + initialLitecoinTransactionPriority: litecoinTransactionPriority,
348 shouldShowYatPopup: shouldShowYatPopup);
349 }
350
@@ -326,7 +357,7 @@ abstract class SettingsStoreBase with Store {
357 // TransactionPriority? initialBitcoinTransactionPriority,
358 // BalanceDisplayMode initialBalanceDisplayMode =
359 // BalanceDisplayMode.availableBalance}) async {
329 -
360 +
361 // if (initialBitcoinTransactionPriority == null) {
362 // initialBitcoinTransactionPriority = bitcoin?.getMediumTransactionPriority();
363 // }
tool/configure.dart
+1
@@ -75,6 +75,7 @@ abstract class Bitcoin {
75 List<TransactionPriority> getTransactionPriorities();
76 List<TransactionPriority> getLitecoinTransactionPriorities();
77 TransactionPriority deserializeBitcoinTransactionPriority(int raw);
78 + TransactionPriority deserializeLitecoinTransactionPriority(int raw);
79 int getFeeRate(Object wallet, TransactionPriority priority);
80 Future<void> generateNewAddress(Object wallet);
81 Object createBitcoinTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate});