From e72ed496ffb495f985caa05a260d63941011ade7 Mon Sep 17 00:00:00 2001 From: Rafael Saes Date: Fri, 10 May 2024 19:23:05 -0300 Subject: [PATCH] feat: sync fixes, sp settings --- cw_bitcoin/lib/bitcoin_wallet.dart | 37 +++--- cw_bitcoin/lib/bitcoin_wallet_service.dart | 42 +++--- cw_bitcoin/lib/electrum_wallet.dart | 72 ++++++---- cw_bitcoin/lib/electrum_wallet_addresses.dart | 2 +- cw_core/lib/sync_status.dart | 6 + lib/bitcoin/cw_bitcoin.dart | 4 +- lib/core/sync_status_title.dart | 4 + lib/di.dart | 25 +++- lib/entities/preferences_key.dart | 2 + lib/router.dart | 5 + lib/routes.dart | 1 + .../screens/dashboard/pages/balance_page.dart | 123 +++++++++--------- .../dashboard/widgets/menu_widget.dart | 6 + .../settings/silent_payments_settings.dart | 50 +++++++ lib/src/widgets/setting_actions.dart | 10 ++ lib/store/settings_store.dart | 29 ++++- .../dashboard/dashboard_view_model.dart | 3 + .../silent_payments_settings_view_model.dart | 33 +++++ res/values/strings_ar.arb | 6 +- res/values/strings_bg.arb | 6 +- res/values/strings_cs.arb | 6 +- res/values/strings_de.arb | 6 +- res/values/strings_en.arb | 6 +- res/values/strings_es.arb | 6 +- res/values/strings_fr.arb | 6 +- res/values/strings_ha.arb | 6 +- res/values/strings_hi.arb | 6 +- res/values/strings_hr.arb | 6 +- res/values/strings_id.arb | 6 +- res/values/strings_it.arb | 6 +- res/values/strings_ja.arb | 6 +- res/values/strings_ko.arb | 6 +- res/values/strings_my.arb | 8 +- res/values/strings_nl.arb | 6 +- res/values/strings_pl.arb | 6 +- res/values/strings_pt.arb | 4 + res/values/strings_ru.arb | 6 +- res/values/strings_th.arb | 6 +- res/values/strings_tl.arb | 6 +- res/values/strings_tr.arb | 6 +- res/values/strings_uk.arb | 6 +- res/values/strings_ur.arb | 6 +- res/values/strings_yo.arb | 6 +- res/values/strings_zh.arb | 6 +- tool/configure.dart | 3 +- 45 files changed, 460 insertions(+), 153 deletions(-) create mode 100644 lib/src/screens/settings/silent_payments_settings.dart create mode 100644 lib/view_model/settings/silent_payments_settings_view_model.dart diff --git a/cw_bitcoin/lib/bitcoin_wallet.dart b/cw_bitcoin/lib/bitcoin_wallet.dart index 02a9125e1..6d1ff3342 100644 --- a/cw_bitcoin/lib/bitcoin_wallet.dart +++ b/cw_bitcoin/lib/bitcoin_wallet.dart @@ -40,23 +40,26 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { String? passphrase, List? initialSilentAddresses, int initialSilentAddressIndex = 0, + bool? alwaysScan, }) : super( - mnemonic: mnemonic, - passphrase: passphrase, - xpub: xpub, - password: password, - walletInfo: walletInfo, - unspentCoinsInfo: unspentCoinsInfo, - networkType: networkParam == null - ? bitcoin.bitcoin - : networkParam == BitcoinNetwork.mainnet - ? bitcoin.bitcoin - : bitcoin.testnet, - initialAddresses: initialAddresses, - initialBalance: initialBalance, - seedBytes: seedBytes, - currency: - networkParam == BitcoinNetwork.testnet ? CryptoCurrency.tbtc : CryptoCurrency.btc) { + mnemonic: mnemonic, + passphrase: passphrase, + xpub: xpub, + password: password, + walletInfo: walletInfo, + unspentCoinsInfo: unspentCoinsInfo, + networkType: networkParam == null + ? bitcoin.bitcoin + : networkParam == BitcoinNetwork.mainnet + ? bitcoin.bitcoin + : bitcoin.testnet, + initialAddresses: initialAddresses, + initialBalance: initialBalance, + seedBytes: seedBytes, + currency: + networkParam == BitcoinNetwork.testnet ? CryptoCurrency.tbtc : CryptoCurrency.btc, + alwaysScan: alwaysScan, + ) { // in a standard BIP44 wallet, mainHd derivation path = m/84'/0'/0'/0 (account 0, index unspecified here) // the sideHd derivation path = m/84'/0'/0'/1 (account 1, index unspecified here) // String derivationPath = walletInfo.derivationInfo!.derivationPath!; @@ -133,6 +136,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { required WalletInfo walletInfo, required Box unspentCoinsInfo, required String password, + required bool alwaysScan, }) async { final network = walletInfo.network != null ? BasedUtxoNetwork.fromName(walletInfo.network!) @@ -181,6 +185,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store { initialChangeAddressIndex: snp.changeAddressIndex, addressPageType: snp.addressPageType, networkParam: network, + alwaysScan: alwaysScan, ); } diff --git a/cw_bitcoin/lib/bitcoin_wallet_service.dart b/cw_bitcoin/lib/bitcoin_wallet_service.dart index cf99324da..a9a6d96db 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_service.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_service.dart @@ -19,10 +19,11 @@ class BitcoinWalletService extends WalletService< BitcoinRestoreWalletFromSeedCredentials, BitcoinRestoreWalletFromWIFCredentials, BitcoinRestoreWalletFromHardware> { - BitcoinWalletService(this.walletInfoSource, this.unspentCoinsInfoSource); + BitcoinWalletService(this.walletInfoSource, this.unspentCoinsInfoSource, this.alwaysScan); final Box walletInfoSource; final Box unspentCoinsInfoSource; + final bool alwaysScan; @override WalletType getType() => WalletType.bitcoin; @@ -55,20 +56,24 @@ class BitcoinWalletService extends WalletService< .firstWhereOrNull((info) => info.id == WalletBase.idFor(name, getType()))!; try { final wallet = await BitcoinWalletBase.open( - password: password, - name: name, - walletInfo: walletInfo, - unspentCoinsInfo: unspentCoinsInfoSource); + password: password, + name: name, + walletInfo: walletInfo, + unspentCoinsInfo: unspentCoinsInfoSource, + alwaysScan: alwaysScan, + ); await wallet.init(); saveBackup(name); return wallet; } catch (_) { await restoreWalletFilesFromBackup(name); final wallet = await BitcoinWalletBase.open( - password: password, - name: name, - walletInfo: walletInfo, - unspentCoinsInfo: unspentCoinsInfoSource); + password: password, + name: name, + walletInfo: walletInfo, + unspentCoinsInfo: unspentCoinsInfoSource, + alwaysScan: alwaysScan, + ); await wallet.init(); return wallet; } @@ -87,10 +92,12 @@ class BitcoinWalletService extends WalletService< final currentWalletInfo = walletInfoSource.values .firstWhereOrNull((info) => info.id == WalletBase.idFor(currentName, getType()))!; final currentWallet = await BitcoinWalletBase.open( - password: password, - name: currentName, - walletInfo: currentWalletInfo, - unspentCoinsInfo: unspentCoinsInfoSource); + password: password, + name: currentName, + walletInfo: currentWalletInfo, + unspentCoinsInfo: unspentCoinsInfoSource, + alwaysScan: alwaysScan, + ); await currentWallet.renameWalletFiles(newName); await saveBackup(newName); @@ -105,12 +112,13 @@ class BitcoinWalletService extends WalletService< @override Future restoreFromHardwareWallet(BitcoinRestoreWalletFromHardware credentials, {bool? isTestnet}) async { - final network = isTestnet == true ? BitcoinNetwork.testnet : BitcoinNetwork.mainnet; credentials.walletInfo?.network = network.value; - credentials.walletInfo?.derivationInfo?.derivationPath = credentials.hwAccountData.derivationPath; + credentials.walletInfo?.derivationInfo?.derivationPath = + credentials.hwAccountData.derivationPath; - final wallet = await BitcoinWallet(password: credentials.password!, + final wallet = await BitcoinWallet( + password: credentials.password!, xpub: credentials.hwAccountData.xpub, walletInfo: credentials.walletInfo!, unspentCoinsInfo: unspentCoinsInfoSource, @@ -123,7 +131,7 @@ class BitcoinWalletService extends WalletService< @override Future restoreFromKeys(BitcoinRestoreWalletFromWIFCredentials credentials, - {bool? isTestnet}) async => + {bool? isTestnet}) async => throw UnimplementedError(); @override diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 8f924eacc..0539de1a0 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -54,20 +54,21 @@ const int TWEAKS_COUNT = 25; abstract class ElectrumWalletBase extends WalletBase with Store { - ElectrumWalletBase( - {required String password, - required WalletInfo walletInfo, - required Box unspentCoinsInfo, - required this.networkType, - String? xpub, - String? mnemonic, - Uint8List? seedBytes, - this.passphrase, - List? initialAddresses, - ElectrumClient? electrumClient, - ElectrumBalance? initialBalance, - CryptoCurrency? currency}) - : accountHD = + ElectrumWalletBase({ + required String password, + required WalletInfo walletInfo, + required Box unspentCoinsInfo, + required this.networkType, + String? xpub, + String? mnemonic, + Uint8List? seedBytes, + this.passphrase, + List? initialAddresses, + ElectrumClient? electrumClient, + ElectrumBalance? initialBalance, + CryptoCurrency? currency, + this.alwaysScan, + }) : accountHD = getAccountHDWallet(currency, networkType, seedBytes, xpub, walletInfo.derivationInfo), syncStatus = NotConnectedSyncStatus(), _password = password, @@ -96,13 +97,20 @@ abstract class ElectrumWalletBase transactionHistory = ElectrumTransactionHistory(walletInfo: walletInfo, password: password); reaction((_) => syncStatus, (SyncStatus syncStatus) { - if (syncStatus is! AttemptingSyncStatus) + if (syncStatus is! AttemptingSyncStatus && syncStatus is! SyncedTipSyncStatus) silentPaymentsScanningActive = syncStatus is SyncingSyncStatus; if (syncStatus is NotConnectedSyncStatus) { // Needs to re-subscribe to all scripthashes when reconnected _scripthashesUpdateSubject = {}; } + + // Message is shown on the UI for 3 seconds, revert to synced + if (syncStatus is SyncedTipSyncStatus) { + Timer(Duration(seconds: 3), () { + if (this.syncStatus is SyncedTipSyncStatus) this.syncStatus = SyncedSyncStatus(); + }); + } }); } @@ -133,6 +141,8 @@ abstract class ElectrumWalletBase static int estimatedTransactionSize(int inputsCount, int outputsCounts) => inputsCount * 68 + outputsCounts * 34 + 10; + bool? alwaysScan; + final bitcoin.HDWallet accountHD; final String? _mnemonic; @@ -192,7 +202,13 @@ abstract class ElectrumWalletBase silentPaymentsScanningActive = active; if (active) { - if ((await getCurrentChainTip()) > walletInfo.restoreHeight) { + final tip = await getCurrentChainTip(); + + if (tip == walletInfo.restoreHeight) { + syncStatus = SyncedTipSyncStatus(tip); + } + + if (tip > walletInfo.restoreHeight) { _setListeners(walletInfo.restoreHeight, chainTipParam: _currentChainTip); } } else { @@ -245,6 +261,12 @@ abstract class ElectrumWalletBase @action Future _setListeners(int height, {int? chainTipParam, bool? doSingleScan}) async { final chainTip = chainTipParam ?? await getCurrentChainTip(); + + if (chainTip == height) { + syncStatus = NotConnectedSyncStatus(); + return; + } + syncStatus = AttemptingSyncStatus(); if (_isolate != null) { @@ -416,10 +438,9 @@ abstract class ElectrumWalletBase try { syncStatus = ConnectingSyncStatus(); - electrumClient.onConnectionStatusChange = null; await electrumClient.close(); - await Timer(Duration(seconds: differentNode ? 0 : 10), () async { + await Timer(Duration(seconds: differentNode ? 0 : 15), () async { electrumClient.onConnectionStatusChange = (bool isConnected) async { if (syncStatus is SyncingSyncStatus) return; @@ -716,7 +737,6 @@ abstract class ElectrumWalletBase // Still has inputs to spend before failing if (!spendingAllCoins) { - outputs.removeLast(); return estimateTxForAmount( credentialsAmount, outputs, @@ -760,10 +780,7 @@ abstract class ElectrumWalletBase if (spendingAllCoins) { throw BitcoinTransactionWrongBalanceException(); } else { - if (amountLeftForChangeAndFee > fee) { - outputs.removeLast(); - } - + outputs.removeLast(); return estimateTxForAmount( credentialsAmount, outputs, @@ -1740,6 +1757,10 @@ abstract class ElectrumWalletBase if (_currentChainTip != null && _currentChainTip! > 0 && walletInfo.restoreHeight == 0) { await walletInfo.updateRestoreHeight(_currentChainTip!); } + + if (alwaysScan == true) { + _setListeners(walletInfo.restoreHeight); + } }); } @@ -1962,7 +1983,10 @@ Future startRefresh(ScanData scanData) async { ); if (tweakHeight >= scanData.chainTip || scanData.isSingleScan) { - scanData.sendPort.send(SyncResponse(syncHeight, SyncedSyncStatus())); + scanData.sendPort.send(SyncResponse( + syncHeight, + SyncedTipSyncStatus(scanData.chainTip), + )); await tweaksSubscription!.close(); } }); diff --git a/cw_bitcoin/lib/electrum_wallet_addresses.dart b/cw_bitcoin/lib/electrum_wallet_addresses.dart index 160c4ed48..eb804fc21 100644 --- a/cw_bitcoin/lib/electrum_wallet_addresses.dart +++ b/cw_bitcoin/lib/electrum_wallet_addresses.dart @@ -375,7 +375,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store { } silentAddresses.forEach((addressRecord) { - if (addressRecord.type != SilentPaymentsAddresType.p2sp) { + if (addressRecord.type != SilentPaymentsAddresType.p2sp || addressRecord.isHidden) { return; } diff --git a/cw_core/lib/sync_status.dart b/cw_core/lib/sync_status.dart index 40c2109d1..55c31877f 100644 --- a/cw_core/lib/sync_status.dart +++ b/cw_core/lib/sync_status.dart @@ -31,6 +31,12 @@ class SyncedSyncStatus extends SyncStatus { double progress() => 1.0; } +class SyncedTipSyncStatus extends SyncedSyncStatus { + SyncedTipSyncStatus(this.tip); + + final int tip; +} + class SyncronizingSyncStatus extends SyncStatus { @override double progress() => 0.0; diff --git a/lib/bitcoin/cw_bitcoin.dart b/lib/bitcoin/cw_bitcoin.dart index cadb735a3..d42e5c34f 100644 --- a/lib/bitcoin/cw_bitcoin.dart +++ b/lib/bitcoin/cw_bitcoin.dart @@ -211,8 +211,8 @@ class CWBitcoin extends Bitcoin { } WalletService createBitcoinWalletService( - Box walletInfoSource, Box unspentCoinSource) { - return BitcoinWalletService(walletInfoSource, unspentCoinSource); + Box walletInfoSource, Box unspentCoinSource, bool alwaysScan) { + return BitcoinWalletService(walletInfoSource, unspentCoinSource, alwaysScan); } WalletService createLitecoinWalletService( diff --git a/lib/core/sync_status_title.dart b/lib/core/sync_status_title.dart index c43196337..c4cc3929f 100644 --- a/lib/core/sync_status_title.dart +++ b/lib/core/sync_status_title.dart @@ -8,6 +8,10 @@ String syncStatusTitle(SyncStatus syncStatus) { : S.current.Blocks_remaining('${syncStatus.blocksLeft}'); } + if (syncStatus is SyncedTipSyncStatus) { + return S.current.silent_payments_scanned_tip(syncStatus.tip.toString()); + } + if (syncStatus is SyncedSyncStatus) { return S.current.sync_status_syncronized; } diff --git a/lib/di.dart b/lib/di.dart index 569d12af5..b31ed075e 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -26,9 +26,11 @@ import 'package:cake_wallet/entities/contact.dart'; import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/parse_address_from_domain.dart'; +import 'package:cake_wallet/src/screens/settings/silent_payments_settings.dart'; import 'package:cake_wallet/view_model/link_view_model.dart'; import 'package:cake_wallet/tron/tron.dart'; import 'package:cake_wallet/src/screens/transaction_details/rbf_details_page.dart'; +import 'package:cake_wallet/view_model/settings/silent_payments_settings_view_model.dart'; import 'package:cw_core/receive_page_option.dart'; import 'package:cake_wallet/entities/qr_view_data.dart'; import 'package:cake_wallet/entities/template.dart'; @@ -331,8 +333,7 @@ Future setup({ getIt.registerSingleton( ExchangeTemplateStore(templateSource: _exchangeTemplates)); getIt.registerSingleton( - YatStore(appStore: getIt.get(), secureStorage: getIt.get()) - ..init()); + YatStore(appStore: getIt.get(), secureStorage: getIt.get())..init()); getIt.registerSingleton( AnonpayTransactionsStore(anonpayInvoiceInfoSource: _anonpayInvoiceInfoSource)); @@ -745,6 +746,9 @@ Future setup({ return DisplaySettingsViewModel(getIt.get()); }); + getIt.registerFactory(() => + SilentPaymentsSettingsViewModel(getIt.get(), getIt.get().wallet!)); + getIt.registerFactory(() { return PrivacySettingsViewModel(getIt.get(), getIt.get().wallet!); }); @@ -806,6 +810,9 @@ Future setup({ getIt.registerFactory(() => DisplaySettingsPage(getIt.get())); + getIt.registerFactory( + () => SilentPaymentsSettingsPage(getIt.get())); + getIt.registerFactory(() => OtherSettingsPage(getIt.get())); getIt.registerFactory(() => NanoChangeRepPage( @@ -889,7 +896,11 @@ Future setup({ case WalletType.monero: return monero!.createMoneroWalletService(_walletInfoSource, _unspentCoinsInfoSource); case WalletType.bitcoin: - return bitcoin!.createBitcoinWalletService(_walletInfoSource, _unspentCoinsInfoSource); + return bitcoin!.createBitcoinWalletService( + _walletInfoSource, + _unspentCoinsInfoSource, + getIt.get().silentPaymentsAlwaysScan, + ); case WalletType.litecoin: return bitcoin!.createLitecoinWalletService(_walletInfoSource, _unspentCoinsInfoSource); case WalletType.ethereum: @@ -987,8 +998,8 @@ Future setup({ getIt.registerFactory(() => BackupPage(getIt.get())); - getIt.registerFactory(() => - EditBackupPasswordViewModel(getIt.get(), getIt.get())); + getIt.registerFactory( + () => EditBackupPasswordViewModel(getIt.get(), getIt.get())); getIt.registerFactory(() => EditBackupPasswordPage(getIt.get())); @@ -1036,8 +1047,8 @@ Future setup({ getIt.registerFactory(() => SupportPage(getIt.get())); - getIt.registerFactory(() => SupportChatPage(getIt.get(), - secureStorage: getIt.get())); + getIt.registerFactory(() => + SupportChatPage(getIt.get(), secureStorage: getIt.get())); getIt.registerFactory(() => SupportOtherLinksPage(getIt.get())); diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 79177178c..5e1a1286d 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -44,6 +44,8 @@ class PreferencesKey { static const polygonTransactionPriority = 'current_fee_priority_polygon'; static const bitcoinCashTransactionPriority = 'current_fee_priority_bitcoin_cash'; static const customBitcoinFeeRate = 'custom_electrum_fee_rate'; + static const silentPaymentsCardDisplay = 'silentPaymentsCardDisplay'; + static const silentPaymentsAlwaysScan = 'silentPaymentsAlwaysScan'; static const shouldShowReceiveWarning = 'should_show_receive_warning'; static const shouldShowYatPopup = 'should_show_yat_popup'; static const shouldShowRepWarning = 'should_show_rep_warning'; diff --git a/lib/router.dart b/lib/router.dart index 741597731..e113e42f9 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -76,6 +76,7 @@ import 'package:cake_wallet/src/screens/settings/manage_nodes_page.dart'; import 'package:cake_wallet/src/screens/settings/other_settings_page.dart'; import 'package:cake_wallet/src/screens/settings/privacy_page.dart'; import 'package:cake_wallet/src/screens/settings/security_backup_page.dart'; +import 'package:cake_wallet/src/screens/settings/silent_payments_settings.dart'; import 'package:cake_wallet/src/screens/settings/tor_page.dart'; import 'package:cake_wallet/src/screens/settings/trocador_providers_page.dart'; import 'package:cake_wallet/src/screens/setup_2fa/modify_2fa_page.dart'; @@ -366,6 +367,10 @@ Route createRoute(RouteSettings settings) { param1: settings.arguments as OnAuthenticationFinished, param2: false), onWillPop: () async => false)); + case Routes.silentPaymentsSettings: + return CupertinoPageRoute( + fullscreenDialog: true, builder: (_) => getIt.get()); + case Routes.connectionSync: return CupertinoPageRoute( fullscreenDialog: true, builder: (_) => getIt.get()); diff --git a/lib/routes.dart b/lib/routes.dart index 1b518d328..b5208416f 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -81,6 +81,7 @@ class Routes { static const ioniaMoreOptionsPage = '/ionia_more_options_page'; static const ioniaCustomRedeemPage = '/ionia_custom_redeem_page'; static const webViewPage = '/web_view_page'; + static const silentPaymentsSettings = '/silent_payments_settings'; static const connectionSync = '/connection_sync_page'; static const securityBackupPage = '/security_and_backup_page'; static const privacyPage = '/privacy_page'; diff --git a/lib/src/screens/dashboard/pages/balance_page.dart b/lib/src/screens/dashboard/pages/balance_page.dart index 5e96effab..dbcafa6b2 100644 --- a/lib/src/screens/dashboard/pages/balance_page.dart +++ b/lib/src/screens/dashboard/pages/balance_page.dart @@ -247,71 +247,78 @@ class CryptoBalanceWidget extends StatelessWidget { ); }, ), - if (dashboardViewModel.hasSilentPayments) ...[ - SizedBox(height: 10), - Padding( - padding: const EdgeInsets.fromLTRB(16, 0, 16, 8), - child: DashBoardRoundedCardWidget( - customBorder: 30, - title: S.of(context).silent_payments, - subTitle: S.of(context).enable_silent_payments_scanning, - hint: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () => launchUrl( - // TODO: Update URL - Uri.https("guides.cakewallet.com"), - mode: LaunchMode.externalApplication, - ), - child: Row( + Observer(builder: (context) { + return Column( + children: [ + if (dashboardViewModel.showSilentPaymentsCard) ...[ + SizedBox(height: 10), + Padding( + padding: const EdgeInsets.fromLTRB(16, 0, 16, 8), + child: DashBoardRoundedCardWidget( + customBorder: 30, + title: S.of(context).silent_payments, + subTitle: S.of(context).enable_silent_payments_scanning, + hint: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - S.of(context).what_is_silent_payments, - style: TextStyle( - fontSize: 12, - fontFamily: 'Lato', - fontWeight: FontWeight.w400, - color: Theme.of(context) - .extension()! - .labelTextColor, - height: 1, + GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => launchUrl( + // TODO: Update URL + Uri.https("guides.cakewallet.com"), + mode: LaunchMode.externalApplication, + ), + child: Row( + children: [ + Text( + S.of(context).what_is_silent_payments, + style: TextStyle( + fontSize: 12, + fontFamily: 'Lato', + fontWeight: FontWeight.w400, + color: Theme.of(context) + .extension()! + .labelTextColor, + height: 1, + ), + softWrap: true, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Icon(Icons.help_outline, + size: 16, + color: Theme.of(context) + .extension()! + .labelTextColor), + ) + ], ), - softWrap: true, ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4), - child: Icon(Icons.help_outline, - size: 16, - color: Theme.of(context) - .extension()! - .labelTextColor), + Observer( + builder: (_) => StandardSwitch( + value: dashboardViewModel.silentPaymentsScanningActive, + onTaped: () => _toggleSilentPaymentsScanning(context), + ), ) ], ), - ), - Observer( - builder: (_) => StandardSwitch( - value: dashboardViewModel.silentPaymentsScanningActive, - onTaped: () => _toggleSilentPaymentsScanning(context), - ), - ) - ], + ], + ), + onTap: () => _toggleSilentPaymentsScanning(context), + icon: Icon( + Icons.lock, + color: + Theme.of(context).extension()!.pageTitleTextColor, + size: 50, + ), ), - ], - ), - onTap: () => _toggleSilentPaymentsScanning(context), - icon: Icon( - Icons.lock, - color: Theme.of(context).extension()!.pageTitleTextColor, - size: 50, - ), - ), - ), - ] + ), + ] + ], + ); + }), ], ), ), diff --git a/lib/src/screens/dashboard/widgets/menu_widget.dart b/lib/src/screens/dashboard/widgets/menu_widget.dart index d9e03dbf9..d6a6ffd49 100644 --- a/lib/src/screens/dashboard/widgets/menu_widget.dart +++ b/lib/src/screens/dashboard/widgets/menu_widget.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/setting_action_button.dart'; import 'package:cake_wallet/src/widgets/setting_actions.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart'; @@ -180,6 +181,11 @@ class MenuWidgetState extends State { final item = SettingActions.all[index]; + if (!widget.dashboardViewModel.hasSilentPayments && + item.name == S.of(context).silent_payments_settings) { + return Container(); + } + final isLastTile = index == itemCount - 1; return SettingActionButton( diff --git a/lib/src/screens/settings/silent_payments_settings.dart b/lib/src/screens/settings/silent_payments_settings.dart new file mode 100644 index 000000000..bc0ecece1 --- /dev/null +++ b/lib/src/screens/settings/silent_payments_settings.dart @@ -0,0 +1,50 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; +import 'package:cake_wallet/view_model/settings/silent_payments_settings_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; + +class SilentPaymentsSettingsPage extends BasePage { + SilentPaymentsSettingsPage(this._silentPaymentsSettingsViewModel); + + @override + String get title => S.current.silent_payments_settings; + + final SilentPaymentsSettingsViewModel _silentPaymentsSettingsViewModel; + + @override + Widget body(BuildContext context) { + return SingleChildScrollView( + child: Observer(builder: (_) { + return Container( + padding: EdgeInsets.only(top: 10), + child: Column( + children: [ + SettingsSwitcherCell( + title: S.current.silent_payments_display_card, + value: _silentPaymentsSettingsViewModel.silentPaymentsCardDisplay, + onValueChange: (_, bool value) { + _silentPaymentsSettingsViewModel.setSilentPaymentsCardDisplay(value); + }, + ), + SettingsSwitcherCell( + title: S.current.silent_payments_always_scan, + value: _silentPaymentsSettingsViewModel.silentPaymentsAlwaysScan, + onValueChange: (_, bool value) { + _silentPaymentsSettingsViewModel.setSilentPaymentsAlwaysScan(value); + }, + ), + SettingsCellWithArrow( + title: S.current.silent_payments_scanning, + handler: (BuildContext context) => Navigator.of(context).pushNamed(Routes.rescan), + ), + ], + ), + ); + }), + ); + } +} diff --git a/lib/src/widgets/setting_actions.dart b/lib/src/widgets/setting_actions.dart index e12397ed0..895fcd97d 100644 --- a/lib/src/widgets/setting_actions.dart +++ b/lib/src/widgets/setting_actions.dart @@ -14,6 +14,7 @@ class SettingActions { }); static List all = [ + silentPaymentsSettingAction, connectionSettingAction, walletSettingAction, addressBookSettingAction, @@ -35,6 +36,15 @@ class SettingActions { supportSettingAction, ]; + static SettingActions silentPaymentsSettingAction = SettingActions._( + name: (context) => S.of(context).silent_payments_settings, + image: 'assets/images/bitcoin_menu.png', + onTap: (BuildContext context) { + Navigator.pop(context); + Navigator.of(context).pushNamed(Routes.silentPaymentsSettings); + }, + ); + static SettingActions connectionSettingAction = SettingActions._( name: (context) => S.of(context).connection_sync, image: 'assets/images/nodes_menu.png', diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index ec9820944..05af3f3b1 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -1,5 +1,4 @@ import 'dart:io'; - import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart'; import 'package:cake_wallet/core/secure_storage.dart'; @@ -108,6 +107,8 @@ abstract class SettingsStoreBase with Store { required this.lookupsOpenAlias, required this.lookupsENS, required this.customBitcoinFeeRate, + required this.silentPaymentsCardDisplay, + required this.silentPaymentsAlwaysScan, TransactionPriority? initialBitcoinTransactionPriority, TransactionPriority? initialMoneroTransactionPriority, TransactionPriority? initialHavenTransactionPriority, @@ -518,6 +519,16 @@ abstract class SettingsStoreBase with Store { (int customBitcoinFeeRate) => _sharedPreferences.setInt(PreferencesKey.customBitcoinFeeRate, customBitcoinFeeRate)); + reaction((_) => silentPaymentsCardDisplay, (bool silentPaymentsCardDisplay) { + _sharedPreferences.setBool( + PreferencesKey.silentPaymentsCardDisplay, silentPaymentsCardDisplay); + }); + + reaction( + (_) => silentPaymentsAlwaysScan, + (bool silentPaymentsAlwaysScan) => _sharedPreferences.setBool( + PreferencesKey.silentPaymentsAlwaysScan, silentPaymentsAlwaysScan)); + this.nodes.observe((change) { if (change.newValue != null && change.key != null) { _saveCurrentNode(change.newValue!, change.key!); @@ -713,6 +724,12 @@ abstract class SettingsStoreBase with Store { @observable int customBitcoinFeeRate; + @observable + bool silentPaymentsCardDisplay; + + @observable + bool silentPaymentsAlwaysScan; + final SecureStorage _secureStorage; final SharedPreferences _sharedPreferences; final BackgroundTasks _backgroundTasks; @@ -859,6 +876,10 @@ abstract class SettingsStoreBase with Store { final lookupsOpenAlias = sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias) ?? true; final lookupsENS = sharedPreferences.getBool(PreferencesKey.lookupsENS) ?? true; final customBitcoinFeeRate = sharedPreferences.getInt(PreferencesKey.customBitcoinFeeRate) ?? 1; + final silentPaymentsCardDisplay = + sharedPreferences.getBool(PreferencesKey.silentPaymentsCardDisplay) ?? true; + final silentPaymentsAlwaysScan = + sharedPreferences.getBool(PreferencesKey.silentPaymentsAlwaysScan) ?? false; // If no value if (pinLength == null || pinLength == 0) { @@ -1103,6 +1124,8 @@ abstract class SettingsStoreBase with Store { lookupsOpenAlias: lookupsOpenAlias, lookupsENS: lookupsENS, customBitcoinFeeRate: customBitcoinFeeRate, + silentPaymentsCardDisplay: silentPaymentsCardDisplay, + silentPaymentsAlwaysScan: silentPaymentsAlwaysScan, initialMoneroTransactionPriority: moneroTransactionPriority, initialBitcoinTransactionPriority: bitcoinTransactionPriority, initialHavenTransactionPriority: havenTransactionPriority, @@ -1242,6 +1265,10 @@ abstract class SettingsStoreBase with Store { lookupsOpenAlias = sharedPreferences.getBool(PreferencesKey.lookupsOpenAlias) ?? true; lookupsENS = sharedPreferences.getBool(PreferencesKey.lookupsENS) ?? true; customBitcoinFeeRate = sharedPreferences.getInt(PreferencesKey.customBitcoinFeeRate) ?? 1; + silentPaymentsCardDisplay = + sharedPreferences.getBool(PreferencesKey.silentPaymentsCardDisplay) ?? true; + silentPaymentsAlwaysScan = + sharedPreferences.getBool(PreferencesKey.silentPaymentsAlwaysScan) ?? false; final nodeId = sharedPreferences.getInt(PreferencesKey.currentNodeIdKey); final bitcoinElectrumServerId = sharedPreferences.getInt(PreferencesKey.currentBitcoinElectrumSererIdKey); diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 5d329073c..a50147c70 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -308,6 +308,9 @@ abstract class DashboardViewModelBase with Store { @computed bool get hasSilentPayments => hasRescan && wallet.type == WalletType.bitcoin; + @computed + bool get showSilentPaymentsCard => hasSilentPayments && settingsStore.silentPaymentsCardDisplay; + final KeyService keyService; final SharedPreferences sharedPreferences; diff --git a/lib/view_model/settings/silent_payments_settings_view_model.dart b/lib/view_model/settings/silent_payments_settings_view_model.dart new file mode 100644 index 000000000..5d20230d2 --- /dev/null +++ b/lib/view_model/settings/silent_payments_settings_view_model.dart @@ -0,0 +1,33 @@ +import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/store/settings_store.dart'; +import 'package:cw_core/wallet_base.dart'; +import 'package:mobx/mobx.dart'; + +part 'silent_payments_settings_view_model.g.dart'; + +class SilentPaymentsSettingsViewModel = SilentPaymentsSettingsViewModelBase + with _$SilentPaymentsSettingsViewModel; + +abstract class SilentPaymentsSettingsViewModelBase with Store { + SilentPaymentsSettingsViewModelBase(this._settingsStore, this._wallet); + + final SettingsStore _settingsStore; + final WalletBase _wallet; + + @computed + bool get silentPaymentsCardDisplay => _settingsStore.silentPaymentsCardDisplay; + + @computed + bool get silentPaymentsAlwaysScan => _settingsStore.silentPaymentsAlwaysScan; + + @action + void setSilentPaymentsCardDisplay(bool value) { + _settingsStore.silentPaymentsCardDisplay = value; + } + + @action + void setSilentPaymentsAlwaysScan(bool value) { + _settingsStore.silentPaymentsAlwaysScan = value; + if (value) bitcoin!.setScanningActive(_wallet, true); + } +} diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 4c5671338..b37345ca3 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -648,11 +648,15 @@ "signTransaction": " ﺔﻠﻣﺎﻌﻤﻟﺍ ﻊﻴﻗﻮﺗ", "signup_for_card_accept_terms": "قم بالتسجيل للحصول على البطاقة وقبول الشروط.", "silent_payments": "مدفوعات صامتة", + "silent_payments_always_scan": "حدد المدفوعات الصامتة دائمًا المسح الضوئي", "silent_payments_disclaimer": "العناوين الجديدة ليست هويات جديدة. إنها إعادة استخدام هوية موجودة مع ملصق مختلف.", + "silent_payments_display_card": "عرض بطاقة المدفوعات الصامتة", "silent_payments_scan_from_date": "فحص من التاريخ", "silent_payments_scan_from_date_or_blockheight": "يرجى إدخال ارتفاع الكتلة الذي تريد بدء المسح الضوئي للمدفوعات الصامتة الواردة ، أو استخدام التاريخ بدلاً من ذلك. يمكنك اختيار ما إذا كانت المحفظة تواصل مسح كل كتلة ، أو تتحقق فقط من الارتفاع المحدد.", "silent_payments_scan_from_height": "فحص من ارتفاع الكتلة", + "silent_payments_scanned_tip": "ممسوح ليفحص! (${tip})", "silent_payments_scanning": "المدفوعات الصامتة المسح الضوئي", + "silent_payments_settings": "إعدادات المدفوعات الصامتة", "slidable": "قابل للانزلاق", "sort_by": "ترتيب حسب", "spend_key_private": "مفتاح الإنفاق (خاص)", @@ -857,4 +861,4 @@ "you_will_get": "حول الى", "you_will_send": "تحويل من", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index b9a6d00da..4b145d8fa 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -648,11 +648,15 @@ "signTransaction": "Подпишете транзакция", "signup_for_card_accept_terms": "Регистрайте се за картата и приемете условията.", "silent_payments": "Мълчаливи плащания", + "silent_payments_always_scan": "Задайте мълчаливи плащания винаги сканиране", "silent_payments_disclaimer": "Новите адреси не са нови идентичности. Това е повторна употреба на съществуваща идентичност с различен етикет.", + "silent_payments_display_card": "Показване на безшумни плащания карта", "silent_payments_scan_from_date": "Сканиране от дата", "silent_payments_scan_from_date_or_blockheight": "Моля, въведете височината на блока, която искате да започнете да сканирате за входящи безшумни плащания, или вместо това използвайте датата. Можете да изберете дали портфейлът продължава да сканира всеки блок или проверява само определената височина.", "silent_payments_scan_from_height": "Сканиране от височината на блока", + "silent_payments_scanned_tip": "Сканиран за съвет! (${tip})", "silent_payments_scanning": "Безшумни плащания за сканиране", + "silent_payments_settings": "Настройки за безшумни плащания", "slidable": "Плъзгащ се", "sort_by": "Сортирай по", "spend_key_private": "Spend key (таен)", @@ -857,4 +861,4 @@ "you_will_get": "Обръщане в", "you_will_send": "Обръщане от", "yy": "гг" -} +} \ No newline at end of file diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index d04666014..35a4966a0 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -648,11 +648,15 @@ "signTransaction": "Podepsat transakci", "signup_for_card_accept_terms": "Zaregistrujte se pro kartu a souhlaste s podmínkami.", "silent_payments": "Tiché platby", + "silent_payments_always_scan": "Nastavit tiché platby vždy skenování", "silent_payments_disclaimer": "Nové adresy nejsou nové identity. Je to opětovné použití existující identity s jiným štítkem.", + "silent_payments_display_card": "Zobrazit kartu Silent Payments", "silent_payments_scan_from_date": "Skenovat od data", "silent_payments_scan_from_date_or_blockheight": "Zadejte výšku bloku, kterou chcete začít skenovat, zda jsou přicházející tiché platby, nebo místo toho použijte datum. Můžete si vybrat, zda peněženka pokračuje v skenování každého bloku nebo zkontroluje pouze zadanou výšku.", "silent_payments_scan_from_height": "Skenování z výšky bloku", + "silent_payments_scanned_tip": "Naskenované na tip! (${tip})", "silent_payments_scanning": "Skenování tichých plateb", + "silent_payments_settings": "Nastavení tichých plateb", "slidable": "Posuvné", "sort_by": "Seřazeno podle", "spend_key_private": "Klíč pro platby (soukromý)", @@ -857,4 +861,4 @@ "you_will_get": "Směnit na", "you_will_send": "Směnit z", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 67f78e748..1877c162a 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -649,11 +649,15 @@ "signTransaction": "Transaktion unterzeichnen", "signup_for_card_accept_terms": "Melden Sie sich für die Karte an und akzeptieren Sie die Bedingungen.", "silent_payments": "Stille Zahlungen", + "silent_payments_always_scan": "Setzen Sie stille Zahlungen immer scannen", "silent_payments_disclaimer": "Neue Adressen sind keine neuen Identitäten. Es ist eine Wiederverwendung einer bestehenden Identität mit einem anderen Etikett.", + "silent_payments_display_card": "Zeigen Sie stille Zahlungskarte", "silent_payments_scan_from_date": "Scan ab Datum", "silent_payments_scan_from_date_or_blockheight": "Bitte geben Sie die Blockhöhe ein, die Sie für eingehende stille Zahlungen scannen möchten, oder verwenden Sie stattdessen das Datum. Sie können wählen, ob die Brieftasche jeden Block scannt oder nur die angegebene Höhe überprüft.", "silent_payments_scan_from_height": "Scan aus der Blockhöhe scannen", + "silent_payments_scanned_tip": "Gescannt zum Trinkgeld! (${tip})", "silent_payments_scanning": "Stille Zahlungen scannen", + "silent_payments_settings": "Einstellungen für stille Zahlungen", "slidable": "Verschiebbar", "sort_by": "Sortiere nach", "spend_key_private": "Spend Key (geheim)", @@ -860,4 +864,4 @@ "you_will_get": "Konvertieren zu", "you_will_send": "Konvertieren von", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index a48211145..13408529a 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -648,11 +648,15 @@ "signTransaction": "Sign Transaction", "signup_for_card_accept_terms": "Sign up for the card and accept the terms.", "silent_payments": "Silent Payments", + "silent_payments_always_scan": "Set Silent Payments always scanning", "silent_payments_disclaimer": "New addresses are not new identities. It is a re-use of an existing identity with a different label.", + "silent_payments_display_card": "Show Silent Payments card", "silent_payments_scan_from_date": "Scan from date", "silent_payments_scan_from_date_or_blockheight": "Please enter the block height you want to start scanning for incoming silent payments, or, use the date instead. You can choose if the wallet continues scanning every block, or checks only the specified height.", "silent_payments_scan_from_height": "Scan from block height", + "silent_payments_scanned_tip": "SCANNED TO TIP! (${tip})", "silent_payments_scanning": "Silent Payments Scanning", + "silent_payments_settings": "Silent Payments settings", "slidable": "Slidable", "sort_by": "Sort by", "spend_key_private": "Spend key (private)", @@ -857,4 +861,4 @@ "you_will_get": "Convert to", "you_will_send": "Convert from", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index c3b511638..50d48bb98 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -649,11 +649,15 @@ "signTransaction": "Firmar transacción", "signup_for_card_accept_terms": "Regístrese para obtener la tarjeta y acepte los términos.", "silent_payments": "Pagos silenciosos", + "silent_payments_always_scan": "Establecer pagos silenciosos siempre escaneando", "silent_payments_disclaimer": "Las nuevas direcciones no son nuevas identidades. Es una reutilización de una identidad existente con una etiqueta diferente.", + "silent_payments_display_card": "Mostrar tarjeta de pagos silenciosos", "silent_payments_scan_from_date": "Escanear desde la fecha", "silent_payments_scan_from_date_or_blockheight": "Ingrese la altura del bloque que desea comenzar a escanear para pagos silenciosos entrantes, o use la fecha en su lugar. Puede elegir si la billetera continúa escaneando cada bloque, o verifica solo la altura especificada.", "silent_payments_scan_from_height": "Escanear desde la altura del bloque", + "silent_payments_scanned_tip": "Escaneado hasta la punta! (${tip})", "silent_payments_scanning": "Escaneo de pagos silenciosos", + "silent_payments_settings": "Configuración de pagos silenciosos", "slidable": "deslizable", "sort_by": "Ordenar por", "spend_key_private": "Spend clave (privado)", @@ -858,4 +862,4 @@ "you_will_get": "Convertir a", "you_will_send": "Convertir de", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index f4ee71bb7..411983e8d 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -648,11 +648,15 @@ "signTransaction": "Signer une transaction", "signup_for_card_accept_terms": "Inscrivez-vous pour la carte et acceptez les conditions.", "silent_payments": "Paiements silencieux", + "silent_payments_always_scan": "Définir les paiements silencieux toujours à la scanne", "silent_payments_disclaimer": "Les nouvelles adresses ne sont pas de nouvelles identités. Il s'agit d'une réutilisation d'une identité existante avec une étiquette différente.", + "silent_payments_display_card": "Afficher la carte de paiement silencieuse", "silent_payments_scan_from_date": "Analyser à partir de la date", "silent_payments_scan_from_date_or_blockheight": "Veuillez saisir la hauteur du bloc que vous souhaitez commencer à scanner pour les paiements silencieux entrants, ou utilisez la date à la place. Vous pouvez choisir si le portefeuille continue de numériser chaque bloc ou ne vérifie que la hauteur spécifiée.", "silent_payments_scan_from_height": "Scan à partir de la hauteur du bloc", + "silent_payments_scanned_tip": "Scanné à la pointe! (${tip})", "silent_payments_scanning": "Payments silencieux SCANNING", + "silent_payments_settings": "Paramètres de paiement silencieux", "slidable": "Glissable", "sort_by": "Trier par", "spend_key_private": "Clef de dépense (spend key) (privée)", @@ -857,4 +861,4 @@ "you_will_get": "Convertir vers", "you_will_send": "Convertir depuis", "yy": "AA" -} +} \ No newline at end of file diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 17ae7843a..5809f3d2e 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -650,11 +650,15 @@ "signTransaction": "Sa hannu Ma'amala", "signup_for_card_accept_terms": "Yi rajista don katin kuma karɓi sharuɗɗan.", "silent_payments": "Biya silent", + "silent_payments_always_scan": "Saita biya na shiru koyaushe", "silent_payments_disclaimer": "Sabbin adiresoshin ba sabon tsari bane. Wannan shine sake amfani da asalin asalin tare da wata alama daban.", + "silent_payments_display_card": "Nuna katin silent", "silent_payments_scan_from_date": "Scan daga kwanan wata", "silent_payments_scan_from_date_or_blockheight": "Da fatan za a shigar da toshe wurin da kake son fara bincika don biyan silins mai shigowa, ko, yi amfani da kwanan wata. Zaka iya zabar idan walat ɗin ya ci gaba da bincika kowane toshe, ko duba tsinkaye da aka ƙayyade.", "silent_payments_scan_from_height": "Scan daga tsayin daka", + "silent_payments_scanned_tip": "Bincika don tip! (${tip})", "silent_payments_scanning": "Silent biya scanning", + "silent_payments_settings": "Saitunan Silent", "slidable": "Mai iya zamewa", "sort_by": "Kasa", "spend_key_private": "makullin biya (maɓallin kalmar sirri)", @@ -859,4 +863,4 @@ "you_will_get": "Maida zuwa", "you_will_send": "Maida daga", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 1465020fe..0b21747b4 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -650,11 +650,15 @@ "signTransaction": "लेन-देन पर हस्ताक्षर करें", "signup_for_card_accept_terms": "कार्ड के लिए साइन अप करें और शर्तें स्वीकार करें।", "silent_payments": "मूक भुगतान", + "silent_payments_always_scan": "मूक भुगतान हमेशा स्कैनिंग सेट करें", "silent_payments_disclaimer": "नए पते नई पहचान नहीं हैं। यह एक अलग लेबल के साथ एक मौजूदा पहचान का पुन: उपयोग है।", + "silent_payments_display_card": "मूक भुगतान कार्ड दिखाएं", "silent_payments_scan_from_date": "तिथि से स्कैन करना", "silent_payments_scan_from_date_or_blockheight": "कृपया उस ब्लॉक ऊंचाई दर्ज करें जिसे आप आने वाले मूक भुगतान के लिए स्कैन करना शुरू करना चाहते हैं, या, इसके बजाय तारीख का उपयोग करें। आप चुन सकते हैं कि क्या वॉलेट हर ब्लॉक को स्कैन करना जारी रखता है, या केवल निर्दिष्ट ऊंचाई की जांच करता है।", "silent_payments_scan_from_height": "ब्लॉक ऊंचाई से स्कैन करें", + "silent_payments_scanned_tip": "टिप करने के लिए स्कैन किया! (${tip})", "silent_payments_scanning": "मूक भुगतान स्कैनिंग", + "silent_payments_settings": "मूक भुगतान सेटिंग्स", "slidable": "फिसलने लायक", "sort_by": "इसके अनुसार क्रमबद्ध करें", "spend_key_private": "खर्च करना (निजी)", @@ -859,4 +863,4 @@ "you_will_get": "में बदलें", "you_will_send": "से रूपांतरित करें", "yy": "वाईवाई" -} +} \ No newline at end of file diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 58c619809..dd2093a03 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -648,11 +648,15 @@ "signTransaction": "Potpišite transakciju", "signup_for_card_accept_terms": "Prijavite se za karticu i prihvatite uvjete.", "silent_payments": "Tiha plaćanja", + "silent_payments_always_scan": "Postavite tiho plaćanje uvijek skeniranje", "silent_payments_disclaimer": "Nove adrese nisu novi identiteti. To je ponovna upotreba postojećeg identiteta s drugom oznakom.", + "silent_payments_display_card": "Prikaži karticu tihih plaćanja", "silent_payments_scan_from_date": "Skeniranje iz datuma", "silent_payments_scan_from_date_or_blockheight": "Unesite visinu bloka koju želite započeti skeniranje za dolazna tiha plaćanja ili umjesto toga upotrijebite datum. Možete odabrati da li novčanik nastavlja skenirati svaki blok ili provjerava samo navedenu visinu.", "silent_payments_scan_from_height": "Skeniranje s visine bloka", + "silent_payments_scanned_tip": "Skenirano na savjet! (${tip})", "silent_payments_scanning": "Skeniranje tihih plaćanja", + "silent_payments_settings": "Postavke tihih plaćanja", "slidable": "Klizna", "sort_by": "Poredaj po", "spend_key_private": "Spend key (privatni)", @@ -857,4 +861,4 @@ "you_will_get": "Razmijeni u", "you_will_send": "Razmijeni iz", "yy": "GG" -} +} \ No newline at end of file diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index d78a2d21d..3726d431b 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -651,11 +651,15 @@ "signTransaction": "Tandatangani Transaksi", "signup_for_card_accept_terms": "Daftar untuk kartu dan terima syarat dan ketentuan.", "silent_payments": "Pembayaran diam", + "silent_payments_always_scan": "Tetapkan pembayaran diam selalu pemindaian", "silent_payments_disclaimer": "Alamat baru bukanlah identitas baru. Ini adalah penggunaan kembali identitas yang ada dengan label yang berbeda.", + "silent_payments_display_card": "Tunjukkan kartu pembayaran diam", "silent_payments_scan_from_date": "Pindai dari tanggal", "silent_payments_scan_from_date_or_blockheight": "Harap masukkan ketinggian blok yang ingin Anda mulai pemindaian untuk pembayaran diam yang masuk, atau, gunakan tanggal sebagai gantinya. Anda dapat memilih jika dompet terus memindai setiap blok, atau memeriksa hanya ketinggian yang ditentukan.", "silent_payments_scan_from_height": "Pindai dari Tinggi Blok", + "silent_payments_scanned_tip": "Pindai untuk memberi tip! (${tip})", "silent_payments_scanning": "Pemindaian pembayaran diam", + "silent_payments_settings": "Pengaturan pembayaran diam", "slidable": "Dapat digeser", "sort_by": "Sortir dengan", "spend_key_private": "Kunci pengeluaran (privat)", @@ -860,4 +864,4 @@ "you_will_get": "Konversi ke", "you_will_send": "Konversi dari", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 25c548e08..92c893fd2 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -650,11 +650,15 @@ "signTransaction": "Firma la transazione", "signup_for_card_accept_terms": "Registrati per la carta e accetta i termini.", "silent_payments": "Pagamenti silenziosi", + "silent_payments_always_scan": "Impostare i pagamenti silenziosi che scansionano sempre", "silent_payments_disclaimer": "I nuovi indirizzi non sono nuove identità. È un riutilizzo di un'identità esistente con un'etichetta diversa.", + "silent_payments_display_card": "Mostra la carta di pagamenti silenziosi", "silent_payments_scan_from_date": "Scansionare dalla data", "silent_payments_scan_from_date_or_blockheight": "Inserisci l'altezza del blocco che si desidera iniziare la scansione per i pagamenti silenziosi in arrivo o, utilizza invece la data. Puoi scegliere se il portafoglio continua a scansionare ogni blocco o controlla solo l'altezza specificata.", "silent_payments_scan_from_height": "Scansione dall'altezza del blocco", + "silent_payments_scanned_tip": "Scansionato per dare la mancia! (${tip})", "silent_payments_scanning": "Scansione di pagamenti silenziosi", + "silent_payments_settings": "Impostazioni di pagamenti silenziosi", "slidable": "Scorrevole", "sort_by": "Ordina per", "spend_key_private": "Chiave di spesa (privata)", @@ -860,4 +864,4 @@ "you_will_get": "Converti a", "you_will_send": "Conveti da", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 52bb531d6..e3e105d4a 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -649,11 +649,15 @@ "signTransaction": "トランザクションに署名する", "signup_for_card_accept_terms": "カードにサインアップして、利用規約に同意してください。", "silent_payments": "サイレント支払い", + "silent_payments_always_scan": "サイレント決済を常にスキャンします", "silent_payments_disclaimer": "新しいアドレスは新しいアイデンティティではありません。これは、異なるラベルを持つ既存のアイデンティティの再利用です。", + "silent_payments_display_card": "サイレントペイメントカードを表示します", "silent_payments_scan_from_date": "日付からスキャンします", "silent_payments_scan_from_date_or_blockheight": "着信のサイレント決済のためにスキャンを開始するブロックの高さを入力するか、代わりに日付を使用してください。ウォレットがすべてのブロックをスキャンし続けるか、指定された高さのみをチェックするかどうかを選択できます。", "silent_payments_scan_from_height": "ブロックの高さからスキャンします", + "silent_payments_scanned_tip": "チップをスキャンしました! (${tip})", "silent_payments_scanning": "サイレントペイメントスキャン", + "silent_payments_settings": "サイレントペイメント設定", "slidable": "スライド可能", "sort_by": "並び替え", "spend_key_private": "キーを使う (プライベート)", @@ -858,4 +862,4 @@ "you_will_get": "に変換", "you_will_send": "から変換", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 44ab9b461..bf1e4ee61 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -649,11 +649,15 @@ "signTransaction": "거래 서명", "signup_for_card_accept_terms": "카드에 가입하고 약관에 동의합니다.", "silent_payments": "조용한 지불", + "silent_payments_always_scan": "무음금을 항상 스캔합니다", "silent_payments_disclaimer": "새로운 주소는 새로운 정체성이 아닙니다. 다른 레이블로 기존 신원을 재사용하는 것입니다.", + "silent_payments_display_card": "사일런트 지불 카드 표시", "silent_payments_scan_from_date": "날짜부터 스캔하십시오", "silent_payments_scan_from_date_or_blockheight": "들어오는 사일런트 결제를 위해 스캔을 시작하려는 블록 높이를 입력하거나 대신 날짜를 사용하십시오. 지갑이 모든 블록을 계속 스캔하는지 여부를 선택하거나 지정된 높이 만 확인할 수 있습니다.", "silent_payments_scan_from_height": "블록 높이에서 스캔하십시오", + "silent_payments_scanned_tip": "팁을 스캔했습니다! (${tip})", "silent_payments_scanning": "조용한 지불 스캔", + "silent_payments_settings": "조용한 지불 설정", "slidable": "슬라이딩 가능", "sort_by": "정렬 기준", "spend_key_private": "지출 키 (은밀한)", @@ -859,4 +863,4 @@ "you_will_send": "다음에서 변환", "YY": "YY", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index bc7c6d261..7530b6678 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -648,11 +648,15 @@ "signTransaction": "ငွေလွှဲဝင်ပါ။", "signup_for_card_accept_terms": "ကတ်အတွက် စာရင်းသွင်းပြီး စည်းကမ်းချက်များကို လက်ခံပါ။", "silent_payments": "အသံတိတ်ငွေပေးချေမှု", + "silent_payments_always_scan": "အမြဲတမ်း scanning အမြဲ scanning", "silent_payments_disclaimer": "လိပ်စာအသစ်များသည်အထောက်အထားအသစ်များမဟုတ်ပါ။ ၎င်းသည်ကွဲပြားခြားနားသောတံဆိပ်ဖြင့်ရှိပြီးသားဝိသေသလက်ခဏာကိုပြန်လည်အသုံးပြုခြင်းဖြစ်သည်။", + "silent_payments_display_card": "အသံတိတ်ငွေပေးချေမှုကဒ်ကိုပြပါ", "silent_payments_scan_from_date": "ရက်စွဲမှစကင်ဖတ်ပါ", "silent_payments_scan_from_date_or_blockheight": "ကျေးဇူးပြု. သင်ဝင်လာသောအသံတိတ်ငွေပေးချေမှုအတွက်သင်စကင်ဖတ်စစ်ဆေးလိုသည့်အမြင့်ကိုဖြည့်ပါ။ သို့မဟုတ်နေ့စွဲကိုသုံးပါ။ Wallet သည်လုပ်ကွက်တိုင်းကိုဆက်လက်စကင်ဖတ်စစ်ဆေးပါကသို့မဟုတ်သတ်မှတ်ထားသောအမြင့်ကိုသာစစ်ဆေးပါကသင်ရွေးချယ်နိုင်သည်။", "silent_payments_scan_from_height": "ပိတ်ပင်တားဆီးမှုအမြင့်ကနေ scan", + "silent_payments_scanned_tip": "အစွန်အဖျားမှ scan ဖတ်! (${tip})", "silent_payments_scanning": "အသံတိတ်ငွေပေးချေမှု scanning", + "silent_payments_settings": "အသံတိတ်ငွေပေးချေမှုဆက်တင်များ", "slidable": "လျှောချနိုင်သည်။", "sort_by": "အလိုက်စဥ်သည်", "spend_key_private": "သော့သုံးရန် (သီးသန့်)", @@ -774,7 +778,7 @@ "tx_rejected_dust_output_send_all": "Network စည်းမျဉ်းစည်းကမ်းများဖြင့် ပယ်ချ. ငွေပေးချေမှုသည် output output (ဖုန်မှုန့်) ဖြင့်ပယ်ချခဲ့သည်။ ဒင်္ဂါးပြားထိန်းချုပ်မှုအောက်တွင်ရွေးချယ်ထားသောဒင်္ဂါးများ၏လက်ကျန်ငွေကိုစစ်ဆေးပါ။", "tx_rejected_vout_negative": "ဒီငွေပေးငွေယူရဲ့အခကြေးငွေအတွက်ပေးဆောင်ဖို့လုံလောက်တဲ့ဟန်ချက်မလုံလောက်။ ဒင်္ဂါးပြား၏လက်ကျန်ငွေလက်ကျန်ငွေကိုစစ်ဆေးပါ။", "tx_wrong_balance_exception": "ဤငွေပမာဏကိုပေးပို့ရန်သင့်တွင် ${currency} မရှိပါ။", -"tx_wrong_balance_with_amount_exception": "သင့်တွင်လုံလောက်မှုမရှိပါ${currency} ${amount}", + "tx_wrong_balance_with_amount_exception": "သင့်တွင်လုံလောက်မှုမရှိပါ${currency} ${amount}", "tx_zero_fee_exception": "0 ကြေးနှင့်အတူငွေပေးငွေယူပေးပို့လို့မရပါဘူး။ နှုန်းကိုတိုးမြှင့်ခြင်းသို့မဟုတ်နောက်ဆုံးခန့်မှန်းချက်များအတွက်သင်၏ connection ကိုစစ်ဆေးပါ။", "unavailable_balance": "လက်ကျန်ငွေ မရရှိနိုင်ပါ။", "unavailable_balance_description": "မရရှိနိုင်သော လက်ကျန်ငွေ- ဤစုစုပေါင်းတွင် ဆိုင်းငံ့ထားသော ငွေပေးငွေယူများတွင် သော့ခတ်ထားသော ငွေကြေးများနှင့် သင်၏ coin ထိန်းချုပ်မှုဆက်တင်များတွင် သင် တက်ကြွစွာ အေးခဲထားသော ငွေများ ပါဝင်သည်။ သော့ခတ်ထားသော လက်ကျန်ငွေများကို ၎င်းတို့၏ သက်ဆိုင်ရာ ငွေပေးငွေယူများ ပြီးမြောက်သည်နှင့် တပြိုင်နက် ရရှိနိုင်မည်ဖြစ်ပြီး၊ အေးခဲထားသော လက်ကျန်များကို ၎င်းတို့အား ပြန်ဖြုတ်ရန် သင်ဆုံးဖြတ်သည်အထိ ငွေပေးငွေယူများအတွက် ဆက်လက်၍မရနိုင်ပါ။", @@ -857,4 +861,4 @@ "you_will_get": "သို့ပြောင်းပါ။", "you_will_send": "မှပြောင်းပါ။", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 7f383dccc..7764cb659 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -648,11 +648,15 @@ "signTransaction": "Transactie ondertekenen", "signup_for_card_accept_terms": "Meld je aan voor de kaart en accepteer de voorwaarden.", "silent_payments": "Stille betalingen", + "silent_payments_always_scan": "Stel stille betalingen in het scannen", "silent_payments_disclaimer": "Nieuwe adressen zijn geen nieuwe identiteiten. Het is een hergebruik van een bestaande identiteit met een ander label.", + "silent_payments_display_card": "Toon stille betalingskaart", "silent_payments_scan_from_date": "Scan vanaf datum", "silent_payments_scan_from_date_or_blockheight": "Voer de blokhoogte in die u wilt beginnen met scannen op inkomende stille betalingen, of gebruik in plaats daarvan de datum. U kunt kiezen of de portemonnee elk blok blijft scannen of alleen de opgegeven hoogte controleert.", "silent_payments_scan_from_height": "Scan van blokhoogte", + "silent_payments_scanned_tip": "Gescand om te fooien! (${tip})", "silent_payments_scanning": "Stille betalingen scannen", + "silent_payments_settings": "Stille betalingsinstellingen", "slidable": "Verschuifbaar", "sort_by": "Sorteer op", "spend_key_private": "Sleutel uitgeven (privaat)", @@ -858,4 +862,4 @@ "you_will_get": "Converteren naar", "you_will_send": "Converteren van", "yy": "JJ" -} +} \ No newline at end of file diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 342e4e86f..ef502d31b 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -648,11 +648,15 @@ "signTransaction": "Podpisz transakcję", "signup_for_card_accept_terms": "Zarejestruj się, aby otrzymać kartę i zaakceptuj warunki.", "silent_payments": "Ciche płatności", + "silent_payments_always_scan": "Ustaw ciche płatności zawsze skanowanie", "silent_payments_disclaimer": "Nowe adresy nie są nową tożsamością. Jest to ponowne wykorzystanie istniejącej tożsamości z inną etykietą.", + "silent_payments_display_card": "Pokaż kartę Silent Payments", "silent_payments_scan_from_date": "Skanuj z daty", "silent_payments_scan_from_date_or_blockheight": "Wprowadź wysokość bloku, którą chcesz rozpocząć skanowanie w poszukiwaniu cichej płatności lub zamiast tego skorzystaj z daty. Możesz wybrać, czy portfel kontynuuje skanowanie każdego bloku, lub sprawdza tylko określoną wysokość.", "silent_payments_scan_from_height": "Skanuj z wysokości bloku", + "silent_payments_scanned_tip": "Zeskanowany do napiwku! (${tip})", "silent_payments_scanning": "Skanowanie cichych płatności", + "silent_payments_settings": "Ustawienia o cichej płatności", "slidable": "Przesuwne", "sort_by": "Sortuj według", "spend_key_private": "Klucz prywatny", @@ -857,4 +861,4 @@ "you_will_get": "Konwertuj na", "you_will_send": "Konwertuj z", "yy": "RR" -} +} \ No newline at end of file diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 57ac428c6..02fcf11a5 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -650,11 +650,15 @@ "signTransaction": "Assinar transação", "signup_for_card_accept_terms": "Cadastre-se no cartão e aceite os termos.", "silent_payments": "Pagamentos silenciosos", + "silent_payments_always_scan": "Defina pagamentos silenciosos sempre digitalizando", "silent_payments_disclaimer": "Novos endereços não são novas identidades. É uma reutilização de uma identidade existente com um rótulo diferente.", + "silent_payments_display_card": "Mostrar cartão de pagamento silencioso", "silent_payments_scan_from_date": "Escanear a partir da data", "silent_payments_scan_from_date_or_blockheight": "Por favor, insira a altura do bloco que deseja iniciar o escaneamento para obter pagamentos silenciosos ou use a data. Você pode escolher se a carteira continua escaneando cada bloco ou verifica apenas a altura especificada.", "silent_payments_scan_from_height": "Escanear a partir da altura do bloco", + "silent_payments_scanned_tip": "Escaneado até o fim! (${tip})", "silent_payments_scanning": "Escanear Pagamentos Silenciosos", + "silent_payments_settings": "Configurações de pagamentos silenciosos", "slidable": "Deslizável", "sort_by": "Ordenar por", "spend_key_private": "Chave de gastos (privada)", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 48c6ce025..bb0abbc08 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -649,11 +649,15 @@ "signTransaction": "Подписать транзакцию", "signup_for_card_accept_terms": "Подпишитесь на карту и примите условия.", "silent_payments": "Молчаливые платежи", + "silent_payments_always_scan": "Установить молчаливые платежи всегда сканирование", "silent_payments_disclaimer": "Новые адреса не являются новыми личностями. Это повторное использование существующей идентичности с другой этикеткой.", + "silent_payments_display_card": "Показать бесшумную платежную карту", "silent_payments_scan_from_date": "Сканирование с даты", "silent_payments_scan_from_date_or_blockheight": "Пожалуйста, введите высоту блока, которую вы хотите начать сканирование для входящих молчаливых платежей, или вместо этого используйте дату. Вы можете выбрать, продолжает ли кошелек сканировать каждый блок или проверять только указанную высоту.", "silent_payments_scan_from_height": "Сканирование с высоты блока", + "silent_payments_scanned_tip": "Оканируется, чтобы чаевые! (${tip})", "silent_payments_scanning": "Сканирование безмолвных платежей", + "silent_payments_settings": "Silent Payments Settings", "slidable": "Скользящий", "sort_by": "Сортировать по", "spend_key_private": "Приватный ключ траты", @@ -858,4 +862,4 @@ "you_will_get": "Конвертировать в", "you_will_send": "Конвертировать из", "yy": "ГГ" -} +} \ No newline at end of file diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 207ce1601..990c92cb1 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -648,11 +648,15 @@ "signTransaction": "ลงนามในการทำธุรกรรม", "signup_for_card_accept_terms": "ลงทะเบียนสำหรับบัตรและยอมรับเงื่อนไข", "silent_payments": "การชำระเงินเงียบ", + "silent_payments_always_scan": "ตั้งค่าการชำระเงินแบบเงียบเสมอ", "silent_payments_disclaimer": "ที่อยู่ใหม่ไม่ใช่ตัวตนใหม่ มันเป็นการใช้ซ้ำของตัวตนที่มีอยู่ด้วยฉลากที่แตกต่างกัน", + "silent_payments_display_card": "แสดงบัตร Silent Payments", "silent_payments_scan_from_date": "สแกนตั้งแต่วันที่", "silent_payments_scan_from_date_or_blockheight": "โปรดป้อนความสูงของบล็อกที่คุณต้องการเริ่มการสแกนสำหรับการชำระเงินแบบเงียบ ๆ หรือใช้วันที่แทน คุณสามารถเลือกได้ว่ากระเป๋าเงินยังคงสแกนทุกบล็อกหรือตรวจสอบความสูงที่ระบุเท่านั้น", "silent_payments_scan_from_height": "สแกนจากความสูงของบล็อก", + "silent_payments_scanned_tip": "สแกนไปที่ปลาย! (${tip})", "silent_payments_scanning": "การสแกนการชำระเงินแบบเงียบ", + "silent_payments_settings": "การตั้งค่าการชำระเงินแบบเงียบ", "slidable": "เลื่อนได้", "sort_by": "เรียงตาม", "spend_key_private": "คีย์จ่าย (ส่วนตัว)", @@ -857,4 +861,4 @@ "you_will_get": "แปลงเป็น", "you_will_send": "แปลงจาก", "yy": "ปี" -} +} \ No newline at end of file diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index d661a254c..8c3347d6a 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -648,11 +648,15 @@ "signTransaction": "Mag-sign Transaksyon", "signup_for_card_accept_terms": "Mag -sign up para sa card at tanggapin ang mga termino.", "silent_payments": "Tahimik na pagbabayad", + "silent_payments_always_scan": "Itakda ang mga tahimik na pagbabayad na laging nag -scan", "silent_payments_disclaimer": "Ang mga bagong address ay hindi mga bagong pagkakakilanlan. Ito ay isang muling paggamit ng isang umiiral na pagkakakilanlan na may ibang label.", + "silent_payments_display_card": "Ipakita ang Silent Payment Card", "silent_payments_scan_from_date": "I -scan mula sa petsa", "silent_payments_scan_from_date_or_blockheight": "Mangyaring ipasok ang taas ng block na nais mong simulan ang pag -scan para sa papasok na tahimik na pagbabayad, o, gamitin ang petsa sa halip. Maaari kang pumili kung ang pitaka ay patuloy na pag -scan sa bawat bloke, o suriin lamang ang tinukoy na taas.", "silent_payments_scan_from_height": "I -scan mula sa taas ng block", + "silent_payments_scanned_tip": "Na -scan sa tip! (${tip})", "silent_payments_scanning": "Tahimik na pag -scan ng mga pagbabayad", + "silent_payments_settings": "Mga setting ng tahimik na pagbabayad", "slidable": "Slidable", "sort_by": "Pag -uri -uriin sa pamamagitan ng", "spend_key_private": "Gumastos ng susi (pribado)", @@ -857,4 +861,4 @@ "you_will_get": "Mag -convert sa", "you_will_send": "I -convert mula sa", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 7d6e39bf4..a346d874f 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -648,11 +648,15 @@ "signTransaction": "İşlem İmzala", "signup_for_card_accept_terms": "Kart için kaydol ve koşulları kabul et.", "silent_payments": "Sessiz ödemeler", + "silent_payments_always_scan": "Sessiz ödemeleri her zaman tarama ayarlayın", "silent_payments_disclaimer": "Yeni adresler yeni kimlikler değildir. Farklı bir etikete sahip mevcut bir kimliğin yeniden kullanımıdır.", + "silent_payments_display_card": "Sessiz Ödeme Kartı Göster", "silent_payments_scan_from_date": "Tarihten tarama", "silent_payments_scan_from_date_or_blockheight": "Lütfen gelen sessiz ödemeler için taramaya başlamak istediğiniz blok yüksekliğini girin veya bunun yerine tarihi kullanın. Cüzdanın her bloğu taramaya devam edip etmediğini veya yalnızca belirtilen yüksekliği kontrol edip etmediğini seçebilirsiniz.", "silent_payments_scan_from_height": "Blok yüksekliğinden tarama", + "silent_payments_scanned_tip": "Bahşiş için tarandı! (${tip})", "silent_payments_scanning": "Sessiz Ödemeler Taraması", + "silent_payments_settings": "Sessiz Ödeme Ayarları", "slidable": "kaydırılabilir", "sort_by": "Göre sırala", "spend_key_private": "Harcama anahtarı (özel)", @@ -857,4 +861,4 @@ "you_will_get": "Biçimine dönüştür:", "you_will_send": "Biçiminden dönüştür:", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index ae92fa806..33c4ca67b 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -649,11 +649,15 @@ "signTransaction": "Підписати транзакцію", "signup_for_card_accept_terms": "Зареєструйтеся на картку та прийміть умови.", "silent_payments": "Мовчазні платежі", + "silent_payments_always_scan": "Встановити мовчазні платежі завжди сканувати", "silent_payments_disclaimer": "Нові адреси - це не нові ідентичності. Це повторне використання існуючої ідентичності з іншою етикеткою.", + "silent_payments_display_card": "Покажіть безшумну карту платежів", "silent_payments_scan_from_date": "Сканувати з дати", "silent_payments_scan_from_date_or_blockheight": "Введіть висоту блоку, яку ви хочете почати сканувати для вхідних мовчазних платежів, або скористайтеся датою замість цього. Ви можете вибрати, якщо гаманець продовжує сканувати кожен блок, або перевіряє лише вказану висоту.", "silent_payments_scan_from_height": "Сканування від висоти блоку", + "silent_payments_scanned_tip": "Сканований на підказку! (${tip})", "silent_payments_scanning": "Мовчазні платежі сканування", + "silent_payments_settings": "Налаштування мовчазних платежів", "slidable": "Розсувний", "sort_by": "Сортувати за", "spend_key_private": "Приватний ключ витрати", @@ -858,4 +862,4 @@ "you_will_get": "Конвертувати в", "you_will_send": "Конвертувати з", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 5e8778f62..49c187426 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -650,11 +650,15 @@ "signTransaction": "۔ﮟﯾﺮﮐ ﻂﺨﺘﺳﺩ ﺮﭘ ﻦﯾﺩ ﻦﯿﻟ", "signup_for_card_accept_terms": "کارڈ کے لیے سائن اپ کریں اور شرائط کو قبول کریں۔", "silent_payments": "خاموش ادائیگی", + "silent_payments_always_scan": "خاموش ادائیگی ہمیشہ اسکیننگ کریں", "silent_payments_disclaimer": "نئے پتے نئی شناخت نہیں ہیں۔ یہ ایک مختلف لیبل کے ساتھ موجودہ شناخت کا دوبارہ استعمال ہے۔", + "silent_payments_display_card": "خاموش ادائیگی کارڈ دکھائیں", "silent_payments_scan_from_date": "تاریخ سے اسکین کریں", "silent_payments_scan_from_date_or_blockheight": "براہ کرم بلاک اونچائی میں داخل ہوں جس سے آپ آنے والی خاموش ادائیگیوں کے لئے اسکیننگ شروع کرنا چاہتے ہیں ، یا اس کے بجائے تاریخ کا استعمال کریں۔ آپ یہ منتخب کرسکتے ہیں کہ اگر پرس ہر بلاک کو اسکیننگ جاری رکھے ہوئے ہے ، یا صرف مخصوص اونچائی کی جانچ پڑتال کرتا ہے۔", "silent_payments_scan_from_height": "بلاک اونچائی سے اسکین کریں", + "silent_payments_scanned_tip": "نوکنے کے لئے اسکین! (${tip})", "silent_payments_scanning": "خاموش ادائیگی اسکیننگ", + "silent_payments_settings": "خاموش ادائیگی کی ترتیبات", "slidable": "سلائیڈ ایبل", "sort_by": "ترتیب دیں", "spend_key_private": "خرچ کی کلید (نجی)", @@ -859,4 +863,4 @@ "you_will_get": "میں تبدیل کریں۔", "you_will_send": "سے تبدیل کریں۔", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 2787d07bc..0a5d66afe 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -649,11 +649,15 @@ "signTransaction": "Wole Idunadura", "signup_for_card_accept_terms": "Ẹ f'orúkọ sílẹ̀ láti gba káàdì àti àjọrò.", "silent_payments": "Awọn sisanwo ipalọlọ", + "silent_payments_always_scan": "Ṣeto awọn sisanwo ipalọlọ nigbagbogbo n ṣatunṣe", "silent_payments_disclaimer": "Awọn adirẹsi tuntun kii ṣe awọn idanimọ tuntun. O jẹ yiyan ti idanimọ ti o wa pẹlu aami oriṣiriṣi.", + "silent_payments_display_card": "Ṣafihan kaadi isanwo ti o dakẹ", "silent_payments_scan_from_date": "Scan lati ọjọ", "silent_payments_scan_from_date_or_blockheight": "Jọwọ tẹ giga idibo ti o fẹ bẹrẹ ọlọjẹ fun awọn sisanwo ipalọlọ, tabi, lo ọjọ dipo. O le yan ti apamọwọ naa tẹsiwaju nṣapẹẹrẹ gbogbo bulọọki, tabi ṣayẹwo nikan giga ti o sọ tẹlẹ.", "silent_payments_scan_from_height": "Scan lati Iga Iga", + "silent_payments_scanned_tip": "Ṣayẹwo si sample! (${tip})", "silent_payments_scanning": "Awọn sisanwo ipalọlọ", + "silent_payments_settings": "Awọn eto isanwo ti o dakẹ", "slidable": "Slidable", "sort_by": "Sa pelu", "spend_key_private": "Kọ́kọ́rọ́ sísan (àdáni)", @@ -858,4 +862,4 @@ "you_will_get": "Ṣe pàṣípààrọ̀ sí", "you_will_send": "Ṣe pàṣípààrọ̀ láti", "yy": "Ọd" -} +} \ No newline at end of file diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index bc31d7c26..be1234325 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -648,11 +648,15 @@ "signTransaction": "签署交易", "signup_for_card_accept_terms": "注册卡并接受条款。", "silent_payments": "无声付款", + "silent_payments_always_scan": "设置无声付款总是扫描", "silent_payments_disclaimer": "新地址不是新的身份。这是重复使用具有不同标签的现有身份。", + "silent_payments_display_card": "显示无声支付卡", "silent_payments_scan_from_date": "从日期开始扫描", "silent_payments_scan_from_date_or_blockheight": "请输入您要开始扫描输入静音付款的块高度,或者使用日期。您可以选择钱包是否继续扫描每个块,或仅检查指定的高度。", "silent_payments_scan_from_height": "从块高度扫描", + "silent_payments_scanned_tip": "扫描到小费! (${tip})", "silent_payments_scanning": "无声付款扫描", + "silent_payments_settings": "无声付款设置", "slidable": "可滑动", "sort_by": "排序方式", "spend_key_private": "Spend 密钥 (私钥)", @@ -857,4 +861,4 @@ "you_will_get": "转换到", "you_will_send": "转换自", "yy": "YY" -} +} \ No newline at end of file diff --git a/tool/configure.dart b/tool/configure.dart index 38139d3ee..cf250fb54 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -181,7 +181,8 @@ abstract class Bitcoin { List getUnspents(Object wallet); Future updateUnspents(Object wallet); - WalletService createBitcoinWalletService(Box walletInfoSource, Box unspentCoinSource); + WalletService createBitcoinWalletService( + Box walletInfoSource, Box unspentCoinSource, bool alwaysScan); WalletService createLitecoinWalletService(Box walletInfoSource, Box unspentCoinSource); TransactionPriority getBitcoinTransactionPriorityMedium(); TransactionPriority getBitcoinTransactionPriorityCustom();