Merge pull request #595 from cake-tech/CW-118-Allow-disabling-of-fiat

CW-118 Allow disabling of fiat
This commit is contained in:
Omar Hatem 2022-12-09 20:20:16 +02:00 committed by GitHub
commit 357ebe5fc8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
38 changed files with 342 additions and 104 deletions

View file

@ -51,6 +51,10 @@ class CWBitcoin extends Bitcoin {
TransactionPriority deserializeBitcoinTransactionPriority(int raw) TransactionPriority deserializeBitcoinTransactionPriority(int raw)
=> BitcoinTransactionPriority.deserialize(raw: raw); => BitcoinTransactionPriority.deserialize(raw: raw);
@override
TransactionPriority deserializeLitecoinTransactionPriority(int raw)
=> LitecoinTransactionPriority.deserialize(raw: raw);
@override @override
int getFeeRate(Object wallet, TransactionPriority priority) { int getFeeRate(Object wallet, TransactionPriority priority) {
final bitcoinWallet = wallet as ElectrumWallet; final bitcoinWallet = wallet as ElectrumWallet;

View file

@ -214,6 +214,7 @@ class BackupService {
final currentBitcoinElectrumSererId = data[PreferencesKey.currentBitcoinElectrumSererIdKey] as int?; final currentBitcoinElectrumSererId = data[PreferencesKey.currentBitcoinElectrumSererIdKey] as int?;
final currentLanguageCode = data[PreferencesKey.currentLanguageCode] as String?; final currentLanguageCode = data[PreferencesKey.currentLanguageCode] as String?;
final displayActionListMode = data[PreferencesKey.displayActionListModeKey] as int?; final displayActionListMode = data[PreferencesKey.displayActionListModeKey] as int?;
final fiatApiMode = data[PreferencesKey.currentFiatApiModeKey] as int?;
final currentPinLength = data[PreferencesKey.currentPinLength] as int?; final currentPinLength = data[PreferencesKey.currentPinLength] as int?;
final currentTheme = data[PreferencesKey.currentTheme] as int?; final currentTheme = data[PreferencesKey.currentTheme] as int?;
final currentDefaultSettingsMigrationVersion = data[PreferencesKey.currentDefaultSettingsMigrationVersion] as int?; final currentDefaultSettingsMigrationVersion = data[PreferencesKey.currentDefaultSettingsMigrationVersion] as int?;
@ -266,6 +267,10 @@ class BackupService {
await _sharedPreferences.setInt(PreferencesKey.displayActionListModeKey, await _sharedPreferences.setInt(PreferencesKey.displayActionListModeKey,
displayActionListMode); displayActionListMode);
if (fiatApiMode != null)
await _sharedPreferences.setInt(PreferencesKey.currentFiatApiModeKey,
fiatApiMode);
if (currentPinLength != null) if (currentPinLength != null)
await _sharedPreferences.setInt(PreferencesKey.currentPinLength, await _sharedPreferences.setInt(PreferencesKey.currentPinLength,
currentPinLength); currentPinLength);
@ -427,6 +432,8 @@ class BackupService {
_sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority), _sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority),
PreferencesKey.moneroTransactionPriority: PreferencesKey.moneroTransactionPriority:
_sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority), _sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority),
PreferencesKey.currentFiatApiModeKey:
_sharedPreferences.getInt(PreferencesKey.currentFiatApiModeKey),
}; };
return json.encode(preferences); return json.encode(preferences);

View file

@ -0,0 +1,39 @@
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cw_core/enumerable_item.dart';
class FiatApiMode extends EnumerableItem<int> with Serializable<int> {
const FiatApiMode({required String title, required int raw}) : super(title: title, raw: raw);
static const all = [FiatApiMode.enabled, FiatApiMode.torOnly, FiatApiMode.disabled];
static const enabled = FiatApiMode(raw: 0, title: 'Enabled');
static const torOnly = FiatApiMode(raw: 1, title: 'Tor only');
static const disabled = FiatApiMode(raw: 2, title: 'Disabled');
static FiatApiMode deserialize({required int raw}) {
switch (raw) {
case 0:
return enabled;
case 1:
return torOnly;
case 2:
return disabled;
default:
throw Exception('Unexpected token: $raw for FiatApiMode deserialize');
}
}
@override
String toString() {
switch (this) {
case FiatApiMode.enabled:
return S.current.enabled;
case FiatApiMode.torOnly:
return S.current.tor_only;
case FiatApiMode.disabled:
return S.current.disabled;
default:
return '';
}
}
}

View file

@ -9,6 +9,7 @@ class PreferencesKey {
static const currentTransactionPriorityKeyLegacy = 'current_fee_priority'; static const currentTransactionPriorityKeyLegacy = 'current_fee_priority';
static const currentBalanceDisplayModeKey = 'current_balance_display_mode'; static const currentBalanceDisplayModeKey = 'current_balance_display_mode';
static const shouldSaveRecipientAddressKey = 'save_recipient_address'; static const shouldSaveRecipientAddressKey = 'save_recipient_address';
static const currentFiatApiModeKey = 'current_fiat_api_mode';
static const allowBiometricalAuthenticationKey = static const allowBiometricalAuthenticationKey =
'allow_biometrical_authentication'; 'allow_biometrical_authentication';
static const disableExchangeKey = 'disable_exchange'; static const disableExchangeKey = 'disable_exchange';
@ -21,6 +22,8 @@ class PreferencesKey {
'current_default_settings_migration_version'; 'current_default_settings_migration_version';
static const moneroTransactionPriority = 'current_fee_priority_monero'; static const moneroTransactionPriority = 'current_fee_priority_monero';
static const bitcoinTransactionPriority = 'current_fee_priority_bitcoin'; static const bitcoinTransactionPriority = 'current_fee_priority_bitcoin';
static const havenTransactionPriority = 'current_fee_priority_haven';
static const litecoinTransactionPriority = 'current_fee_priority_litecoin';
static const shouldShowReceiveWarning = 'should_show_receive_warning'; static const shouldShowReceiveWarning = 'should_show_receive_warning';
static const shouldShowYatPopup = 'should_show_yat_popup'; static const shouldShowYatPopup = 'should_show_yat_popup';
static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1'; static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1';

View file

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:cake_wallet/reactions/fiat_rate_update.dart';
import 'package:cake_wallet/reactions/on_current_node_change.dart'; import 'package:cake_wallet/reactions/on_current_node_change.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -31,4 +32,5 @@ Future<void> bootstrap(GlobalKey<NavigatorState> navigatorKey) async {
appStore, settingsStore, fiatConversionStore); appStore, settingsStore, fiatConversionStore);
startCurrentFiatChangeReaction(appStore, settingsStore, fiatConversionStore); startCurrentFiatChangeReaction(appStore, settingsStore, fiatConversionStore);
startOnCurrentNodeChangeReaction(appStore); startOnCurrentNodeChangeReaction(appStore);
startFiatRateUpdate(appStore, settingsStore, fiatConversionStore);
} }

View file

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:cake_wallet/core/fiat_conversion_service.dart'; import 'package:cake_wallet/core/fiat_conversion_service.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/entities/update_haven_rate.dart'; import 'package:cake_wallet/entities/update_haven_rate.dart';
import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
@ -8,26 +9,23 @@ import 'package:cw_core/wallet_type.dart';
Timer? _timer; Timer? _timer;
Future<void> startFiatRateUpdate(AppStore appStore, SettingsStore settingsStore, Future<void> startFiatRateUpdate(
FiatConversionStore fiatConversionStore) async { AppStore appStore, SettingsStore settingsStore, FiatConversionStore fiatConversionStore) async {
if (_timer != null) { if (_timer != null) {
return; return;
} }
if (appStore.wallet != null) { _timer = Timer.periodic(Duration(seconds: 30), (_) async {
fiatConversionStore.prices[appStore.wallet!.currency] = try {
await FiatConversionService.fetchPrice( if (appStore.wallet == null || settingsStore.fiatApiMode == FiatApiMode.disabled) {
appStore.wallet!.currency, settingsStore.fiatCurrency); return;
} }
_timer = Timer.periodic(
Duration(seconds: 30),
(_) async {
try {
if (appStore.wallet!.type == WalletType.haven) { if (appStore.wallet!.type == WalletType.haven) {
await updateHavenRate(fiatConversionStore); await updateHavenRate(fiatConversionStore);
} else { } else {
fiatConversionStore.prices[appStore.wallet!.currency] = await FiatConversionService.fetchPrice( fiatConversionStore.prices[appStore.wallet!.currency] =
await FiatConversionService.fetchPrice(
appStore.wallet!.currency, settingsStore.fiatCurrency); appStore.wallet!.currency, settingsStore.fiatCurrency);
} }
} catch (e) { } catch (e) {

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:cake_wallet/core/fiat_conversion_service.dart'; import 'package:cake_wallet/core/fiat_conversion_service.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
@ -12,7 +13,7 @@ void startCurrentFiatChangeReaction(AppStore appStore,
_onCurrentFiatCurrencyChangeDisposer?.reaction.dispose(); _onCurrentFiatCurrencyChangeDisposer?.reaction.dispose();
_onCurrentFiatCurrencyChangeDisposer = reaction( _onCurrentFiatCurrencyChangeDisposer = reaction(
(_) => settingsStore.fiatCurrency, (FiatCurrency fiatCurrency) async { (_) => settingsStore.fiatCurrency, (FiatCurrency fiatCurrency) async {
if (appStore.wallet == null) { if (appStore.wallet == null || settingsStore.fiatApiMode == FiatApiMode.disabled) {
return; return;
} }

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/entities/fiat_currency.dart'; import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cake_wallet/entities/update_haven_rate.dart'; import 'package:cake_wallet/entities/update_haven_rate.dart';
import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/transaction_history.dart';
@ -87,7 +88,7 @@ void startCurrentWalletChangeReaction(AppStore appStore,
TransactionHistoryBase<TransactionInfo>, TransactionInfo>? TransactionHistoryBase<TransactionInfo>, TransactionInfo>?
wallet) async { wallet) async {
try { try {
if (wallet == null) { if (wallet == null || settingsStore.fiatApiMode == FiatApiMode.disabled) {
return; return;
} }

View file

@ -57,7 +57,9 @@ class TransactionsPage extends StatelessWidget {
formattedDate: DateFormat('HH:mm') formattedDate: DateFormat('HH:mm')
.format(transaction.date), .format(transaction.date),
formattedAmount: item.formattedCryptoAmount, formattedAmount: item.formattedCryptoAmount,
formattedFiatAmount: item.formattedFiatAmount, formattedFiatAmount:
dashboardViewModel.balanceViewModel.isFiatDisabled
? '' : item.formattedFiatAmount,
isPending: transaction.isPending)); isPending: transaction.isPending));
} }

View file

@ -378,12 +378,10 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
}); });
}, },
actionLeftButton: () => Navigator.of(context).pop(), actionLeftButton: () => Navigator.of(context).pop(),
feeFiatAmount: widget.exchangeTradeViewModel.sendViewModel.pendingTransactionFeeFiatAmount feeFiatAmount: widget.exchangeTradeViewModel
+ ' ' + widget.exchangeTradeViewModel.sendViewModel.fiat.title, .pendingTransactionFeeFiatAmountFormatted,
fiatAmountValue: widget.exchangeTradeViewModel.sendViewModel fiatAmountValue: widget.exchangeTradeViewModel
.pendingTransactionFiatAmount + .pendingTransactionFiatAmountValueFormatted,
' ' +
widget.exchangeTradeViewModel.sendViewModel.fiat.title,
outputs: widget.exchangeTradeViewModel.sendViewModel outputs: widget.exchangeTradeViewModel.sendViewModel
.outputs); .outputs);
}); });

View file

@ -78,7 +78,14 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
children: [ children: [
LoadingPrimaryButton( LoadingPrimaryButton(
onPressed: () { onPressed: () {
if (widget.privacySettingsViewModel.addCustomNode) {
if (_formKey.currentState != null && !_formKey.currentState!.validate()) {
return;
}
widget.nodeViewModel.save(saveAsCurrent: true); widget.nodeViewModel.save(saveAsCurrent: true);
}
Navigator.pop(context); Navigator.pop(context);
}, },
text: S.of(context).continue_text, text: S.of(context).continue_text,

View file

@ -381,16 +381,10 @@ class SendPage extends BasePage {
amount: S.of(context).send_amount, amount: S.of(context).send_amount,
amountValue: amountValue:
sendViewModel.pendingTransaction!.amountFormatted, sendViewModel.pendingTransaction!.amountFormatted,
fiatAmountValue: fiatAmountValue: sendViewModel.pendingTransactionFiatAmountFormatted,
sendViewModel.pendingTransactionFiatAmount +
' ' +
sendViewModel.fiat.title,
fee: S.of(context).send_fee, fee: S.of(context).send_fee,
feeValue: sendViewModel.pendingTransaction!.feeFormatted, feeValue: sendViewModel.pendingTransaction!.feeFormatted,
feeFiatAmount: feeFiatAmount: sendViewModel.pendingTransactionFeeFiatAmountFormatted,
sendViewModel.pendingTransactionFeeFiatAmount +
' ' +
sendViewModel.fiat.title,
outputs: sendViewModel.outputs, outputs: sendViewModel.outputs,
rightButtonText: S.of(context).ok, rightButtonText: S.of(context).ok,
leftButtonText: S.of(context).cancel, leftButtonText: S.of(context).cancel,

View file

@ -332,6 +332,7 @@ class SendCardState extends State<SendCard>
], ],
), ),
)), )),
if (!sendViewModel.isFiatDisabled)
Padding( Padding(
padding: const EdgeInsets.only(top: 20), padding: const EdgeInsets.only(top: 20),
child: BaseTextFormField( child: BaseTextFormField(
@ -438,8 +439,9 @@ class SendCardState extends State<SendCard>
Padding( Padding(
padding: padding:
EdgeInsets.only(top: 5), EdgeInsets.only(top: 5),
child: Text( child: sendViewModel.isFiatDisabled
output ? const SizedBox(height: 14)
: Text(output
.estimatedFeeFiatAmount .estimatedFeeFiatAmount
+ ' ' + + ' ' +
sendViewModel sendViewModel

View file

@ -34,7 +34,8 @@ class DisplaySettingsPage extends BasePage {
onValueChange: (_, bool value) { onValueChange: (_, bool value) {
_displaySettingsViewModel.setShouldDisplayBalance(value); _displaySettingsViewModel.setShouldDisplayBalance(value);
}), }),
if (!isHaven) //if (!isHaven) it does not work correctly
if(!_displaySettingsViewModel.disabledFiatApiMode)
SettingsPickerCell<FiatCurrency>( SettingsPickerCell<FiatCurrency>(
title: S.current.settings_currency, title: S.current.settings_currency,
searchHintText: S.current.search_currency, searchHintText: S.current.search_currency,

View file

@ -18,10 +18,15 @@ class PrivacyPage extends BasePage {
return Container( return Container(
padding: EdgeInsets.only(top: 10), padding: EdgeInsets.only(top: 10),
child: Observer(builder: (_) { child: Observer(builder: (_) {
return Observer(builder: (_) {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
SettingsSwitcherCell(
title: S.current.disable_fiat,
value: _privacySettingsViewModel.isFiatDisabled,
onValueChange: (BuildContext context, bool value) {
_privacySettingsViewModel.setFiatMode(value);
}),
SettingsSwitcherCell( SettingsSwitcherCell(
title: S.current.disable_exchange, title: S.current.disable_exchange,
value: _privacySettingsViewModel.disableExchange, value: _privacySettingsViewModel.disableExchange,
@ -36,7 +41,6 @@ class PrivacyPage extends BasePage {
}) })
], ],
); );
});
}), }),
); );
} }

View file

@ -17,8 +17,10 @@ import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cw_core/node.dart'; import 'package:cw_core/node.dart';
import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/entities/action_list_display_mode.dart'; import 'package:cake_wallet/entities/action_list_display_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/.secrets.g.dart' as secrets; import 'package:cake_wallet/.secrets.g.dart' as secrets;
part 'settings_store.g.dart'; part 'settings_store.g.dart';
class SettingsStore = SettingsStoreBase with _$SettingsStore; class SettingsStore = SettingsStoreBase with _$SettingsStore;
@ -29,6 +31,7 @@ abstract class SettingsStoreBase with Store {
required FiatCurrency initialFiatCurrency, required FiatCurrency initialFiatCurrency,
required BalanceDisplayMode initialBalanceDisplayMode, required BalanceDisplayMode initialBalanceDisplayMode,
required bool initialSaveRecipientAddress, required bool initialSaveRecipientAddress,
required FiatApiMode initialFiatMode,
required bool initialAllowBiometricalAuthentication, required bool initialAllowBiometricalAuthentication,
required bool initialExchangeEnabled, required bool initialExchangeEnabled,
required ThemeBase initialTheme, required ThemeBase initialTheme,
@ -41,12 +44,15 @@ abstract class SettingsStoreBase with Store {
required this.isBitcoinBuyEnabled, required this.isBitcoinBuyEnabled,
required this.actionlistDisplayMode, required this.actionlistDisplayMode,
TransactionPriority? initialBitcoinTransactionPriority, TransactionPriority? initialBitcoinTransactionPriority,
TransactionPriority? initialMoneroTransactionPriority}) TransactionPriority? initialMoneroTransactionPriority,
TransactionPriority? initialHavenTransactionPriority,
TransactionPriority? initialLitecoinTransactionPriority})
: nodes = ObservableMap<WalletType, Node>.of(nodes), : nodes = ObservableMap<WalletType, Node>.of(nodes),
_sharedPreferences = sharedPreferences, _sharedPreferences = sharedPreferences,
fiatCurrency = initialFiatCurrency, fiatCurrency = initialFiatCurrency,
balanceDisplayMode = initialBalanceDisplayMode, balanceDisplayMode = initialBalanceDisplayMode,
shouldSaveRecipientAddress = initialSaveRecipientAddress, shouldSaveRecipientAddress = initialSaveRecipientAddress,
fiatApiMode = initialFiatMode,
allowBiometricalAuthentication = initialAllowBiometricalAuthentication, allowBiometricalAuthentication = initialAllowBiometricalAuthentication,
disableExchange = initialExchangeEnabled, disableExchange = initialExchangeEnabled,
currentTheme = initialTheme, currentTheme = initialTheme,
@ -63,6 +69,14 @@ abstract class SettingsStoreBase with Store {
priority[WalletType.bitcoin] = initialBitcoinTransactionPriority; priority[WalletType.bitcoin] = initialBitcoinTransactionPriority;
} }
if (initialHavenTransactionPriority != null) {
priority[WalletType.haven] = initialHavenTransactionPriority;
}
if (initialLitecoinTransactionPriority != null) {
priority[WalletType.litecoin] = initialLitecoinTransactionPriority;
}
reaction( reaction(
(_) => fiatCurrency, (_) => fiatCurrency,
(FiatCurrency fiatCurrency) => sharedPreferences.setString( (FiatCurrency fiatCurrency) => sharedPreferences.setString(
@ -74,11 +88,25 @@ abstract class SettingsStoreBase with Store {
.setBool(PreferencesKey.shouldShowYatPopup, shouldShowYatPopup)); .setBool(PreferencesKey.shouldShowYatPopup, shouldShowYatPopup));
priority.observe((change) { priority.observe((change) {
final key = change.key == WalletType.monero final String? key;
? PreferencesKey.moneroTransactionPriority switch (change.key) {
: PreferencesKey.bitcoinTransactionPriority; case WalletType.monero:
key = PreferencesKey.moneroTransactionPriority;
break;
case WalletType.bitcoin:
key = PreferencesKey.bitcoinTransactionPriority;
break;
case WalletType.litecoin:
key = PreferencesKey.litecoinTransactionPriority;
break;
case WalletType.haven:
key = PreferencesKey.havenTransactionPriority;
break;
default:
key = null;
}
if (change.newValue != null) { if (change.newValue != null && key != null) {
sharedPreferences.setInt(key, change.newValue!.serialize()); sharedPreferences.setInt(key, change.newValue!.serialize());
} }
}); });
@ -89,6 +117,11 @@ abstract class SettingsStoreBase with Store {
PreferencesKey.shouldSaveRecipientAddressKey, PreferencesKey.shouldSaveRecipientAddressKey,
shouldSaveRecipientAddress)); shouldSaveRecipientAddress));
reaction(
(_) => fiatApiMode,
(FiatApiMode mode) => sharedPreferences.setInt(
PreferencesKey.currentFiatApiModeKey, mode.serialize()));
reaction( reaction(
(_) => currentTheme, (_) => currentTheme,
(ThemeBase theme) => (ThemeBase theme) =>
@ -144,6 +177,9 @@ abstract class SettingsStoreBase with Store {
@observable @observable
BalanceDisplayMode balanceDisplayMode; BalanceDisplayMode balanceDisplayMode;
@observable
FiatApiMode fiatApiMode;
@observable @observable
bool shouldSaveRecipientAddress; bool shouldSaveRecipientAddress;
@ -195,39 +231,48 @@ abstract class SettingsStoreBase with Store {
static Future<SettingsStore> load( static Future<SettingsStore> load(
{required Box<Node> nodeSource, {required Box<Node> nodeSource,
required bool isBitcoinBuyEnabled, required bool isBitcoinBuyEnabled,
TransactionPriority? initialMoneroTransactionPriority,
TransactionPriority? initialBitcoinTransactionPriority,
FiatCurrency initialFiatCurrency = FiatCurrency.usd, FiatCurrency initialFiatCurrency = FiatCurrency.usd,
BalanceDisplayMode initialBalanceDisplayMode = BalanceDisplayMode initialBalanceDisplayMode =
BalanceDisplayMode.availableBalance}) async { BalanceDisplayMode.availableBalance}) async {
if (initialBitcoinTransactionPriority == null) {
initialBitcoinTransactionPriority = bitcoin?.getMediumTransactionPriority();
}
if (initialMoneroTransactionPriority == null) {
initialMoneroTransactionPriority = monero?.getDefaultTransactionPriority();
}
final sharedPreferences = await getIt.getAsync<SharedPreferences>(); final sharedPreferences = await getIt.getAsync<SharedPreferences>();
final currentFiatCurrency = FiatCurrency.deserialize(raw: final currentFiatCurrency = FiatCurrency.deserialize(raw:
sharedPreferences.getString(PreferencesKey.currentFiatCurrencyKey)!); sharedPreferences.getString(PreferencesKey.currentFiatCurrencyKey)!);
final savedMoneroTransactionPriority =
TransactionPriority? moneroTransactionPriority =
monero?.deserializeMoneroTransactionPriority( monero?.deserializeMoneroTransactionPriority(
raw: sharedPreferences raw: sharedPreferences
.getInt(PreferencesKey.moneroTransactionPriority)!); .getInt(PreferencesKey.moneroTransactionPriority)!);
final savedBitcoinTransactionPriority = TransactionPriority? bitcoinTransactionPriority =
bitcoin?.deserializeBitcoinTransactionPriority(sharedPreferences bitcoin?.deserializeBitcoinTransactionPriority(sharedPreferences
.getInt(PreferencesKey.bitcoinTransactionPriority)!); .getInt(PreferencesKey.bitcoinTransactionPriority)!);
final moneroTransactionPriority =
savedMoneroTransactionPriority ?? initialMoneroTransactionPriority; TransactionPriority? havenTransactionPriority;
final bitcoinTransactionPriority = TransactionPriority? litecoinTransactionPriority;
savedBitcoinTransactionPriority ?? initialBitcoinTransactionPriority;
if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
havenTransactionPriority = monero?.deserializeMoneroTransactionPriority(
raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!);
}
if (sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) {
litecoinTransactionPriority = bitcoin?.deserializeLitecoinTransactionPriority(
sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!);
}
moneroTransactionPriority ??= monero?.getDefaultTransactionPriority();
bitcoinTransactionPriority ??= bitcoin?.getMediumTransactionPriority();
havenTransactionPriority ??= monero?.getDefaultTransactionPriority();
litecoinTransactionPriority ??= bitcoin?.getLitecoinTransactionPriorityMedium();
final currentBalanceDisplayMode = BalanceDisplayMode.deserialize( final currentBalanceDisplayMode = BalanceDisplayMode.deserialize(
raw: sharedPreferences raw: sharedPreferences
.getInt(PreferencesKey.currentBalanceDisplayModeKey)!); .getInt(PreferencesKey.currentBalanceDisplayModeKey)!);
// FIX-ME: Check for which default value we should have here // FIX-ME: Check for which default value we should have here
final shouldSaveRecipientAddress = final shouldSaveRecipientAddress =
sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? false; sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? false;
final currentFiatApiMode = FiatApiMode.deserialize(
raw: sharedPreferences
.getInt(PreferencesKey.currentFiatApiModeKey) ?? FiatApiMode.enabled.raw);
final allowBiometricalAuthentication = sharedPreferences final allowBiometricalAuthentication = sharedPreferences
.getBool(PreferencesKey.allowBiometricalAuthenticationKey) ?? .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ??
false; false;
@ -239,8 +284,7 @@ abstract class SettingsStoreBase with Store {
: ThemeType.bright.index; : ThemeType.bright.index;
final savedTheme = ThemeList.deserialize( final savedTheme = ThemeList.deserialize(
raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ?? raw: sharedPreferences.getInt(PreferencesKey.currentTheme) ??
legacyTheme ?? legacyTheme);
0);
final actionListDisplayMode = ObservableList<ActionListDisplayMode>(); final actionListDisplayMode = ObservableList<ActionListDisplayMode>();
actionListDisplayMode.addAll(deserializeActionlistDisplayModes( actionListDisplayMode.addAll(deserializeActionlistDisplayModes(
sharedPreferences.getInt(PreferencesKey.displayActionListModeKey) ?? sharedPreferences.getInt(PreferencesKey.displayActionListModeKey) ??
@ -295,6 +339,7 @@ abstract class SettingsStoreBase with Store {
initialFiatCurrency: currentFiatCurrency, initialFiatCurrency: currentFiatCurrency,
initialBalanceDisplayMode: currentBalanceDisplayMode, initialBalanceDisplayMode: currentBalanceDisplayMode,
initialSaveRecipientAddress: shouldSaveRecipientAddress, initialSaveRecipientAddress: shouldSaveRecipientAddress,
initialFiatMode: currentFiatApiMode,
initialAllowBiometricalAuthentication: allowBiometricalAuthentication, initialAllowBiometricalAuthentication: allowBiometricalAuthentication,
initialExchangeEnabled: disableExchange, initialExchangeEnabled: disableExchange,
initialTheme: savedTheme, initialTheme: savedTheme,
@ -303,6 +348,8 @@ abstract class SettingsStoreBase with Store {
initialLanguageCode: savedLanguageCode, initialLanguageCode: savedLanguageCode,
initialMoneroTransactionPriority: moneroTransactionPriority, initialMoneroTransactionPriority: moneroTransactionPriority,
initialBitcoinTransactionPriority: bitcoinTransactionPriority, initialBitcoinTransactionPriority: bitcoinTransactionPriority,
initialHavenTransactionPriority: havenTransactionPriority,
initialLitecoinTransactionPriority: litecoinTransactionPriority,
shouldShowYatPopup: shouldShowYatPopup); shouldShowYatPopup: shouldShowYatPopup);
} }

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/view_model/settings/switcher_list_item.dart'; import 'package:cake_wallet/view_model/settings/switcher_list_item.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
@ -11,15 +12,13 @@ class AdvancedPrivacySettingsViewModel = AdvancedPrivacySettingsViewModelBase
abstract class AdvancedPrivacySettingsViewModelBase with Store { abstract class AdvancedPrivacySettingsViewModelBase with Store {
AdvancedPrivacySettingsViewModelBase(this.type, this._settingsStore) AdvancedPrivacySettingsViewModelBase(this.type, this._settingsStore)
: _disableFiat = false, : _addCustomNode = false {
_addCustomNode = false {
settings = [ settings = [
// TODO: uncomment when Disable Fiat PR is merged SwitcherListItem(
// SwitcherListItem( title: S.current.disable_fiat,
// title: S.current.disable_fiat, value: () => _settingsStore.fiatApiMode == FiatApiMode.disabled,
// value: () => _disableFiat, onValueChange: (_, bool value) => setFiatMode(value),
// onValueChange: (_, bool value) => _disableFiat = value, ),
// ),
SwitcherListItem( SwitcherListItem(
title: S.current.disable_exchange, title: S.current.disable_exchange,
value: () => _settingsStore.disableExchange, value: () => _settingsStore.disableExchange,
@ -37,9 +36,6 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
late List<SwitcherListItem> settings; late List<SwitcherListItem> settings;
@observable
bool _disableFiat = false;
@observable @observable
bool _addCustomNode = false; bool _addCustomNode = false;
@ -48,4 +44,13 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
@computed @computed
bool get addCustomNode => _addCustomNode; bool get addCustomNode => _addCustomNode;
@action
void setFiatMode(bool value) {
if (value) {
_settingsStore.fiatApiMode = FiatApiMode.disabled;
return;
}
_settingsStore.fiatApiMode = FiatApiMode.enabled;
}
} }

View file

@ -1,3 +1,4 @@
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/transaction_history.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
import 'package:cw_core/balance.dart'; import 'package:cw_core/balance.dart';
@ -10,7 +11,6 @@ import 'package:cake_wallet/entities/calculate_fiat_amount.dart';
import 'package:cake_wallet/store/app_store.dart'; import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
import 'package:flutter/cupertino.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
part 'balance_view_model.g.dart'; part 'balance_view_model.g.dart';
@ -71,6 +71,9 @@ abstract class BalanceViewModelBase with Store {
@computed @computed
BalanceDisplayMode get savedDisplayMode => settingsStore.balanceDisplayMode; BalanceDisplayMode get savedDisplayMode => settingsStore.balanceDisplayMode;
@computed
bool get isFiatDisabled => settingsStore.fiatApiMode == FiatApiMode.disabled;
@computed @computed
String get asset { String get asset {
final typeFormatted = walletTypeToString(appStore.wallet!.type); final typeFormatted = walletTypeToString(appStore.wallet!.type);
@ -180,8 +183,8 @@ abstract class BalanceViewModelBase with Store {
return MapEntry(key, BalanceRecord( return MapEntry(key, BalanceRecord(
availableBalance: '---', availableBalance: '---',
additionalBalance: '---', additionalBalance: '---',
fiatAdditionalBalance: '---', fiatAdditionalBalance: isFiatDisabled ? '' : '---',
fiatAvailableBalance: '---', fiatAvailableBalance: isFiatDisabled ? '' : '---',
asset: key, asset: key,
formattedAssetTitle: _formatterAsset(key))); formattedAssetTitle: _formatterAsset(key)));
} }
@ -192,17 +195,17 @@ abstract class BalanceViewModelBase with Store {
// throw Exception('Price is null for: $key'); // throw Exception('Price is null for: $key');
// } // }
final additionalFiatBalance = fiatCurrency.toString() final additionalFiatBalance = isFiatDisabled ? '' : (fiatCurrency.toString()
+ ' ' + ' '
+ _getFiatBalance( + _getFiatBalance(
price: price, price: price,
cryptoAmount: value.formattedAdditionalBalance); cryptoAmount: value.formattedAdditionalBalance));
final availableFiatBalance = fiatCurrency.toString() final availableFiatBalance = isFiatDisabled ? '' : (fiatCurrency.toString()
+ ' ' + ' '
+ _getFiatBalance( + _getFiatBalance(
price: price, price: price,
cryptoAmount: value.formattedAvailableBalance); cryptoAmount: value.formattedAvailableBalance));
return MapEntry(key, BalanceRecord( return MapEntry(key, BalanceRecord(
availableBalance: value.formattedAvailableBalance, availableBalance: value.formattedAvailableBalance,

View file

@ -72,6 +72,18 @@ abstract class ExchangeTradeViewModelBase with Store {
? '\n\n' + S.current.xrp_extra_info ? '\n\n' + S.current.xrp_extra_info
: ''; : '';
@computed
String get pendingTransactionFiatAmountValueFormatted =>
sendViewModel.isFiatDisabled
? '' : sendViewModel.pendingTransactionFiatAmount
+ ' ' + sendViewModel.fiat.title;
@computed
String get pendingTransactionFeeFiatAmountFormatted =>
sendViewModel.isFiatDisabled
? '' : sendViewModel.pendingTransactionFeeFiatAmount
+ ' ' + sendViewModel.fiat.title;
@observable @observable
ObservableList<ExchangeTradeItem> items; ObservableList<ExchangeTradeItem> items;

View file

@ -142,6 +142,19 @@ abstract class SendViewModelBase with Store {
@computed @computed
String get balance => balanceViewModel.availableBalance; String get balance => balanceViewModel.availableBalance;
@computed
bool get isFiatDisabled => balanceViewModel.isFiatDisabled;
@computed
String get pendingTransactionFiatAmountFormatted =>
isFiatDisabled ? '' : pendingTransactionFiatAmount +
' ' + fiat.title;
@computed
String get pendingTransactionFeeFiatAmountFormatted =>
isFiatDisabled ? '' : pendingTransactionFeeFiatAmount +
' ' + fiat.title;
@computed @computed
bool get isReadyForSend => _wallet.syncStatus is SyncedSyncStatus; bool get isReadyForSend => _wallet.syncStatus is SyncedSyncStatus;

View file

@ -3,6 +3,7 @@ import 'package:cake_wallet/entities/fiat_currency.dart';
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_base.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
part 'display_settings_view_model.g.dart'; part 'display_settings_view_model.g.dart';
@ -30,6 +31,9 @@ abstract class DisplaySettingsViewModelBase with Store {
@computed @computed
ThemeBase get theme => _settingsStore.currentTheme; ThemeBase get theme => _settingsStore.currentTheme;
@computed
bool get disabledFiatApiMode => _settingsStore.fiatApiMode == FiatApiMode.disabled;
@action @action
void setBalanceDisplayMode(BalanceDisplayMode value) => _settingsStore.balanceDisplayMode = value; void setBalanceDisplayMode(BalanceDisplayMode value) => _settingsStore.balanceDisplayMode = value;

View file

@ -1,5 +1,6 @@
import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/store/settings_store.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
part 'privacy_settings_view_model.g.dart'; part 'privacy_settings_view_model.g.dart';
@ -16,9 +17,22 @@ abstract class PrivacySettingsViewModelBase with Store {
@computed @computed
bool get shouldSaveRecipientAddress => _settingsStore.shouldSaveRecipientAddress; bool get shouldSaveRecipientAddress => _settingsStore.shouldSaveRecipientAddress;
@computed
bool get isFiatDisabled => _settingsStore.fiatApiMode == FiatApiMode.disabled;
@action @action
void setShouldSaveRecipientAddress(bool value) => _settingsStore.shouldSaveRecipientAddress = value; void setShouldSaveRecipientAddress(bool value) => _settingsStore.shouldSaveRecipientAddress = value;
@action @action
void setEnableExchange(bool value) => _settingsStore.disableExchange = value; void setEnableExchange(bool value) => _settingsStore.disableExchange = value;
@action
void setFiatMode(bool value) {
if (value) {
_settingsStore.fiatApiMode = FiatApiMode.disabled;
return;
}
_settingsStore.fiatApiMode = FiatApiMode.enabled;
}
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Exchange deaktivieren", "disable_exchange": "Exchange deaktivieren",
"advanced_privacy_settings": "Erweiterte Datenschutzeinstellungen", "advanced_privacy_settings": "Erweiterte Datenschutzeinstellungen",
"settings_can_be_changed_later": "Diese Einstellungen können später in den App-Einstellungen geändert werden", "settings_can_be_changed_later": "Diese Einstellungen können später in den App-Einstellungen geändert werden",
"add_custom_node": "Neuen benutzerdefinierten Knoten hinzufügen" "add_custom_node": "Neuen benutzerdefinierten Knoten hinzufügen",
"disable_fiat": "Fiat deaktivieren",
"fiat_api": "Fiat API",
"disabled": "Deaktiviert",
"enabled": "Ermöglicht",
"tor_only": "Nur Tor"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Disable exchange", "disable_exchange": "Disable exchange",
"advanced_privacy_settings": "Advanced Privacy Settings", "advanced_privacy_settings": "Advanced Privacy Settings",
"settings_can_be_changed_later": "These settings can be changed later in the app settings", "settings_can_be_changed_later": "These settings can be changed later in the app settings",
"add_custom_node": "Add New Custom Node" "add_custom_node": "Add New Custom Node",
"disable_fiat": "Disable fiat",
"fiat_api": "Fiat API",
"disabled": "Disabled",
"enabled": "Enabled",
"tor_only": "Tor only"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Deshabilitar intercambio", "disable_exchange": "Deshabilitar intercambio",
"advanced_privacy_settings": "Configuración avanzada de privacidad", "advanced_privacy_settings": "Configuración avanzada de privacidad",
"settings_can_be_changed_later": "Estas configuraciones se pueden cambiar más tarde en la configuración de la aplicación", "settings_can_be_changed_later": "Estas configuraciones se pueden cambiar más tarde en la configuración de la aplicación",
"add_custom_node": "Agregar nuevo nodo personalizado" "add_custom_node": "Agregar nuevo nodo personalizado",
"disable_fiat": "Deshabilitar fiat",
"fiat_api": "Fiat API",
"disabled": "Desactivado",
"enabled": "Activado",
"tor_only": "solo Tor"
} }

View file

@ -662,5 +662,10 @@
"disable_exchange": "Désactiver l'échange", "disable_exchange": "Désactiver l'échange",
"advanced_privacy_settings": "Paramètres de confidentialité avancés", "advanced_privacy_settings": "Paramètres de confidentialité avancés",
"settings_can_be_changed_later": "Ces paramètres peuvent être modifiés ultérieurement dans les paramètres de l'application", "settings_can_be_changed_later": "Ces paramètres peuvent être modifiés ultérieurement dans les paramètres de l'application",
"add_custom_node": "Ajouter un nouveau nœud personnalisé" "add_custom_node": "Ajouter un nouveau nœud personnalisé",
"disable_fiat": "Désactiver fiat",
"fiat_api": "Fiat API",
"disabled": "Handicapé",
"enabled": "Activé",
"tor_only": "Tor uniquement"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "एक्सचेंज अक्षम करें", "disable_exchange": "एक्सचेंज अक्षम करें",
"advanced_privacy_settings": "उन्नत गोपनीयता सेटिंग्स", "advanced_privacy_settings": "उन्नत गोपनीयता सेटिंग्स",
"settings_can_be_changed_later": "इन सेटिंग्स को बाद में ऐप सेटिंग में बदला जा सकता है", "settings_can_be_changed_later": "इन सेटिंग्स को बाद में ऐप सेटिंग में बदला जा सकता है",
"add_custom_node": "नया कस्टम नोड जोड़ें" "add_custom_node": "नया कस्टम नोड जोड़ें",
"disable_exchange": "एक्सचेंज अक्षम करें",
"fiat_api": "फिएट पैसे API",
"disabled": "अक्षम",
"enabled": "सक्रिय",
"tor_only": "Tor केवल"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Onemogući exchange", "disable_exchange": "Onemogući exchange",
"advanced_privacy_settings": "Napredne postavke privatnosti", "advanced_privacy_settings": "Napredne postavke privatnosti",
"settings_can_be_changed_later": "Te se postavke mogu promijeniti kasnije u postavkama aplikacije", "settings_can_be_changed_later": "Te se postavke mogu promijeniti kasnije u postavkama aplikacije",
"add_custom_node": "Dodaj novi prilagođeni čvor" "add_custom_node": "Dodaj novi prilagođeni čvor",
"disable_fiat": "Isključi, fiat",
"fiat_api": "Fiat API",
"disabled": "Onemogućeno",
"enabled": "Omogućeno",
"tor_only": "Samo Tor"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Disabilita scambio", "disable_exchange": "Disabilita scambio",
"advanced_privacy_settings": "Impostazioni avanzate sulla privacy", "advanced_privacy_settings": "Impostazioni avanzate sulla privacy",
"settings_can_be_changed_later": "Queste impostazioni possono essere modificate in seguito nelle impostazioni dell'app", "settings_can_be_changed_later": "Queste impostazioni possono essere modificate in seguito nelle impostazioni dell'app",
"add_custom_node": "Aggiungi nuovo nodo personalizzato" "add_custom_node": "Aggiungi nuovo nodo personalizzato",
"disable_fiat": "Disabilita fiat",
"fiat_api": "Fiat API",
"disabled": "Disabilitato",
"enabled": "Abilitato",
"tor_only": "Solo Tor"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "交換を無効にする", "disable_exchange": "交換を無効にする",
"advanced_privacy_settings": "高度なプライバシー設定", "advanced_privacy_settings": "高度なプライバシー設定",
"settings_can_be_changed_later": "これらの設定は、後でアプリの設定で変更できます", "settings_can_be_changed_later": "これらの設定は、後でアプリの設定で変更できます",
"add_custom_node": "新しいカスタム ノードを追加" "add_custom_node": "新しいカスタム ノードを追加",
"disable_fiat": "フィアットを無効にする",
"fiat_api": "不換紙幣 API",
"disabled": "無効",
"enabled": "有効",
"tor_only": "Torのみ"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "교환 비활성화", "disable_exchange": "교환 비활성화",
"advanced_privacy_settings": "고급 개인 정보 설정", "advanced_privacy_settings": "고급 개인 정보 설정",
"settings_can_be_changed_later": "이 설정은 나중에 앱 설정에서 변경할 수 있습니다.", "settings_can_be_changed_later": "이 설정은 나중에 앱 설정에서 변경할 수 있습니다.",
"add_custom_node": "새 사용자 정의 노드 추가" "add_custom_node": "새 사용자 정의 노드 추가",
"disable_fiat": "법정화폐 비활성화",
"fiat_api": "명목 화폐 API",
"disabled": "장애가 있는",
"enabled": "사용",
"tor_only": "Tor 뿐"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Uitwisseling uitschakelen", "disable_exchange": "Uitwisseling uitschakelen",
"advanced_privacy_settings": "Geavanceerde privacy-instellingen", "advanced_privacy_settings": "Geavanceerde privacy-instellingen",
"settings_can_be_changed_later": "Deze instellingen kunnen later worden gewijzigd in de app-instellingen", "settings_can_be_changed_later": "Deze instellingen kunnen later worden gewijzigd in de app-instellingen",
"add_custom_node": "Voeg een nieuw aangepast knooppunt toe" "add_custom_node": "Voeg een nieuw aangepast knooppunt toe",
"disable_fiat": "Schakel Fiat uit",
"fiat_api": "Fiat API",
"disabled": "Gehandicapt",
"enabled": "Ingeschakeld",
"tor_only": "Alleen Tor"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Wyłącz wymianę", "disable_exchange": "Wyłącz wymianę",
"advanced_privacy_settings": "Zaawansowane ustawienia prywatności", "advanced_privacy_settings": "Zaawansowane ustawienia prywatności",
"settings_can_be_changed_later": "Te ustawienia można później zmienić w ustawieniach aplikacji", "settings_can_be_changed_later": "Te ustawienia można później zmienić w ustawieniach aplikacji",
"add_custom_node": "Dodaj nowy węzeł niestandardowy" "add_custom_node": "Dodaj nowy węzeł niestandardowy",
"disable_fiat": "Wyłącz fiat",
"fiat_api": "API Fiata",
"disabled": "Wyłączone",
"enabled": "Włączony",
"tor_only": "Tylko Tor"
} }

View file

@ -663,5 +663,10 @@
"disable_exchange": "Desativar troca", "disable_exchange": "Desativar troca",
"advanced_privacy_settings": "Configurações de privacidade avançadas", "advanced_privacy_settings": "Configurações de privacidade avançadas",
"settings_can_be_changed_later": "Essas configurações podem ser alteradas posteriormente nas configurações do aplicativo", "settings_can_be_changed_later": "Essas configurações podem ser alteradas posteriormente nas configurações do aplicativo",
"add_custom_node": "Adicionar novo nó personalizado" "add_custom_node": "Adicionar novo nó personalizado",
"disable_fiat": "Desativar fiat",
"fiat_api": "API da Fiat",
"disabled": "Desabilitado",
"enabled": "Habilitado",
"tor_only": "Tor apenas"
} }

View file

@ -664,5 +664,10 @@
"disable_exchange": "Отключить обмен", "disable_exchange": "Отключить обмен",
"advanced_privacy_settings": "Расширенные настройки конфиденциальности", "advanced_privacy_settings": "Расширенные настройки конфиденциальности",
"settings_can_be_changed_later": "Эти настройки можно изменить позже в настройках приложения.", "settings_can_be_changed_later": "Эти настройки можно изменить позже в настройках приложения.",
"add_custom_node": "Добавить новый пользовательский узел" "add_custom_node": "Добавить новый пользовательский узел",
"disable_fiat": "Отключить фиат",
"fiat_api": "Фиат API",
"disabled": "Отключено",
"enabled": "Включено",
"tor_only": "Только Tor"
} }

View file

@ -663,5 +663,11 @@
"disable_exchange": "Вимкнути exchange", "disable_exchange": "Вимкнути exchange",
"advanced_privacy_settings": "Розширені налаштування конфіденційності", "advanced_privacy_settings": "Розширені налаштування конфіденційності",
"settings_can_be_changed_later": "Ці параметри можна змінити пізніше в налаштуваннях програми", "settings_can_be_changed_later": "Ці параметри можна змінити пізніше в налаштуваннях програми",
"add_custom_node": "Додати новий спеціальний вузол" "add_custom_node": "Додати новий спеціальний вузол",
"disable_fiat": "Вимкнути фиат",
"fiat_api": "Фіат API",
"disabled": "Вимкнено",
"enabled": "Увімкнено",
"tor_only": "Тільки Tor"
} }

View file

@ -662,5 +662,10 @@
"disable_exchange": "禁用交换", "disable_exchange": "禁用交换",
"advanced_privacy_settings": "高级隐私设置", "advanced_privacy_settings": "高级隐私设置",
"settings_can_be_changed_later": "稍后可以在应用设置中更改这些设置", "settings_can_be_changed_later": "稍后可以在应用设置中更改这些设置",
"add_custom_node": "添加新的自定义节点" "add_custom_node": "添加新的自定义节点",
"disable_fiat": "禁用法令",
"fiat_api": "法币API",
"disabled": "禁用",
"enabled": "启用",
"tor_only": "仅限 Tor"
} }

View file

@ -75,6 +75,7 @@ abstract class Bitcoin {
List<TransactionPriority> getTransactionPriorities(); List<TransactionPriority> getTransactionPriorities();
List<TransactionPriority> getLitecoinTransactionPriorities(); List<TransactionPriority> getLitecoinTransactionPriorities();
TransactionPriority deserializeBitcoinTransactionPriority(int raw); TransactionPriority deserializeBitcoinTransactionPriority(int raw);
TransactionPriority deserializeLitecoinTransactionPriority(int raw);
int getFeeRate(Object wallet, TransactionPriority priority); int getFeeRate(Object wallet, TransactionPriority priority);
Future<void> generateNewAddress(Object wallet); Future<void> generateNewAddress(Object wallet);
Object createBitcoinTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate}); Object createBitcoinTransactionCredentials(List<Output> outputs, {required TransactionPriority priority, int? feeRate});