feat: sync fixes, sp settings

This commit is contained in:
Rafael Saes 2024-05-10 19:23:05 -03:00
parent 8b5ab79d29
commit e72ed496ff
45 changed files with 460 additions and 153 deletions

View file

@ -40,6 +40,7 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
String? passphrase,
List<BitcoinSilentPaymentAddressRecord>? initialSilentAddresses,
int initialSilentAddressIndex = 0,
bool? alwaysScan,
}) : super(
mnemonic: mnemonic,
passphrase: passphrase,
@ -56,7 +57,9 @@ abstract class BitcoinWalletBase extends ElectrumWallet with Store {
initialBalance: initialBalance,
seedBytes: seedBytes,
currency:
networkParam == BitcoinNetwork.testnet ? CryptoCurrency.tbtc : CryptoCurrency.btc) {
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> 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,
);
}

View file

@ -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<WalletInfo> walletInfoSource;
final Box<UnspentCoinsInfo> unspentCoinsInfoSource;
final bool alwaysScan;
@override
WalletType getType() => WalletType.bitcoin;
@ -58,7 +59,9 @@ class BitcoinWalletService extends WalletService<
password: password,
name: name,
walletInfo: walletInfo,
unspentCoinsInfo: unspentCoinsInfoSource);
unspentCoinsInfo: unspentCoinsInfoSource,
alwaysScan: alwaysScan,
);
await wallet.init();
saveBackup(name);
return wallet;
@ -68,7 +71,9 @@ class BitcoinWalletService extends WalletService<
password: password,
name: name,
walletInfo: walletInfo,
unspentCoinsInfo: unspentCoinsInfoSource);
unspentCoinsInfo: unspentCoinsInfoSource,
alwaysScan: alwaysScan,
);
await wallet.init();
return wallet;
}
@ -90,7 +95,9 @@ class BitcoinWalletService extends WalletService<
password: password,
name: currentName,
walletInfo: currentWalletInfo,
unspentCoinsInfo: unspentCoinsInfoSource);
unspentCoinsInfo: unspentCoinsInfoSource,
alwaysScan: alwaysScan,
);
await currentWallet.renameWalletFiles(newName);
await saveBackup(newName);
@ -105,12 +112,13 @@ class BitcoinWalletService extends WalletService<
@override
Future<BitcoinWallet> 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,

View file

@ -54,8 +54,8 @@ const int TWEAKS_COUNT = 25;
abstract class ElectrumWalletBase
extends WalletBase<ElectrumBalance, ElectrumTransactionHistory, ElectrumTransactionInfo>
with Store {
ElectrumWalletBase(
{required String password,
ElectrumWalletBase({
required String password,
required WalletInfo walletInfo,
required Box<UnspentCoinsInfo> unspentCoinsInfo,
required this.networkType,
@ -66,8 +66,9 @@ abstract class ElectrumWalletBase
List<BitcoinAddressRecord>? initialAddresses,
ElectrumClient? electrumClient,
ElectrumBalance? initialBalance,
CryptoCurrency? currency})
: accountHD =
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<void> _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();
}
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<void> 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();
}
});

View file

@ -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;
}

View file

@ -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;

View file

@ -211,8 +211,8 @@ class CWBitcoin extends Bitcoin {
}
WalletService createBitcoinWalletService(
Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource) {
return BitcoinWalletService(walletInfoSource, unspentCoinSource);
Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource, bool alwaysScan) {
return BitcoinWalletService(walletInfoSource, unspentCoinSource, alwaysScan);
}
WalletService createLitecoinWalletService(

View file

@ -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;
}

View file

@ -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<void> setup({
getIt.registerSingleton<ExchangeTemplateStore>(
ExchangeTemplateStore(templateSource: _exchangeTemplates));
getIt.registerSingleton<YatStore>(
YatStore(appStore: getIt.get<AppStore>(), secureStorage: getIt.get<SecureStorage>())
..init());
YatStore(appStore: getIt.get<AppStore>(), secureStorage: getIt.get<SecureStorage>())..init());
getIt.registerSingleton<AnonpayTransactionsStore>(
AnonpayTransactionsStore(anonpayInvoiceInfoSource: _anonpayInvoiceInfoSource));
@ -745,6 +746,9 @@ Future<void> setup({
return DisplaySettingsViewModel(getIt.get<SettingsStore>());
});
getIt.registerFactory(() =>
SilentPaymentsSettingsViewModel(getIt.get<SettingsStore>(), getIt.get<AppStore>().wallet!));
getIt.registerFactory(() {
return PrivacySettingsViewModel(getIt.get<SettingsStore>(), getIt.get<AppStore>().wallet!);
});
@ -806,6 +810,9 @@ Future<void> setup({
getIt.registerFactory(() => DisplaySettingsPage(getIt.get<DisplaySettingsViewModel>()));
getIt.registerFactory(
() => SilentPaymentsSettingsPage(getIt.get<SilentPaymentsSettingsViewModel>()));
getIt.registerFactory(() => OtherSettingsPage(getIt.get<OtherSettingsViewModel>()));
getIt.registerFactory(() => NanoChangeRepPage(
@ -889,7 +896,11 @@ Future<void> setup({
case WalletType.monero:
return monero!.createMoneroWalletService(_walletInfoSource, _unspentCoinsInfoSource);
case WalletType.bitcoin:
return bitcoin!.createBitcoinWalletService(_walletInfoSource, _unspentCoinsInfoSource);
return bitcoin!.createBitcoinWalletService(
_walletInfoSource,
_unspentCoinsInfoSource,
getIt.get<SettingsStore>().silentPaymentsAlwaysScan,
);
case WalletType.litecoin:
return bitcoin!.createLitecoinWalletService(_walletInfoSource, _unspentCoinsInfoSource);
case WalletType.ethereum:
@ -987,8 +998,8 @@ Future<void> setup({
getIt.registerFactory(() => BackupPage(getIt.get<BackupViewModel>()));
getIt.registerFactory(() =>
EditBackupPasswordViewModel(getIt.get<SecureStorage>(), getIt.get<SecretStore>()));
getIt.registerFactory(
() => EditBackupPasswordViewModel(getIt.get<SecureStorage>(), getIt.get<SecretStore>()));
getIt.registerFactory(() => EditBackupPasswordPage(getIt.get<EditBackupPasswordViewModel>()));
@ -1036,8 +1047,8 @@ Future<void> setup({
getIt.registerFactory(() => SupportPage(getIt.get<SupportViewModel>()));
getIt.registerFactory(() => SupportChatPage(getIt.get<SupportViewModel>(),
secureStorage: getIt.get<SecureStorage>()));
getIt.registerFactory(() =>
SupportChatPage(getIt.get<SupportViewModel>(), secureStorage: getIt.get<SecureStorage>()));
getIt.registerFactory(() => SupportOtherLinksPage(getIt.get<SupportViewModel>()));

View file

@ -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';

View file

@ -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<dynamic> createRoute(RouteSettings settings) {
param1: settings.arguments as OnAuthenticationFinished, param2: false),
onWillPop: () async => false));
case Routes.silentPaymentsSettings:
return CupertinoPageRoute<void>(
fullscreenDialog: true, builder: (_) => getIt.get<SilentPaymentsSettingsPage>());
case Routes.connectionSync:
return CupertinoPageRoute<void>(
fullscreenDialog: true, builder: (_) => getIt.get<ConnectionSyncPage>());

View file

@ -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';

View file

@ -247,7 +247,10 @@ class CryptoBalanceWidget extends StatelessWidget {
);
},
),
if (dashboardViewModel.hasSilentPayments) ...[
Observer(builder: (context) {
return Column(
children: [
if (dashboardViewModel.showSilentPaymentsCard) ...[
SizedBox(height: 10),
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),
@ -306,13 +309,17 @@ class CryptoBalanceWidget extends StatelessWidget {
onTap: () => _toggleSilentPaymentsScanning(context),
icon: Icon(
Icons.lock,
color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
color:
Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
size: 50,
),
),
),
]
],
);
}),
],
),
),
);

View file

@ -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<MenuWidget> {
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(

View file

@ -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),
),
],
),
);
}),
);
}
}

View file

@ -14,6 +14,7 @@ class SettingActions {
});
static List<SettingActions> 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',

View file

@ -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);

View file

@ -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;

View file

@ -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);
}
}

View file

@ -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": "مفتاح الإنفاق (خاص)",

View file

@ -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 (таен)",

View file

@ -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ý)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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": "खर्च करना (निजी)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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": "キーを使う (プライベート)",

View file

@ -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": "지출 키 (은밀한)",

View file

@ -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": "သော့သုံးရန် (သီးသန့်)",

View file

@ -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)",

View file

@ -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",

View file

@ -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)",

View file

@ -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": "Приватный ключ траты",

View file

@ -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": "คีย์จ่าย (ส่วนตัว)",

View file

@ -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)",

View file

@ -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)",

View file

@ -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": "Приватний ключ витрати",

View file

@ -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": "خرچ کی کلید (نجی)",

View file

@ -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)",

View file

@ -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 密钥 (私钥)",

View file

@ -181,7 +181,8 @@ abstract class Bitcoin {
List<Unspent> getUnspents(Object wallet);
Future<void> updateUnspents(Object wallet);
WalletService createBitcoinWalletService(Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource);
WalletService createBitcoinWalletService(
Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource, bool alwaysScan);
WalletService createLitecoinWalletService(Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource);
TransactionPriority getBitcoinTransactionPriorityMedium();
TransactionPriority getBitcoinTransactionPriorityCustom();