Generic fixes (#1528)

* update target sdk for android * make welcome page scrollable fix moonpay url params * fix null exception when restoring from backup * fix ui issues * hopefully fix the timeout exception error report [skip ci] * validate electrum addresses * disable silent payments for hardware wallets * fixes and enhancements

Omar Hatem committed Jul 21, 2024 at 03:46 UTC 311fff2c446416ecc5c17e6a994e5c9aa7b2ecde
45 files changed +278 -269
android/app/build.gradle
+1 -1
@@ -46,7 +46,7 @@ android {
46 defaultConfig {
47 applicationId appProperties['id']
48 minSdkVersion 24
49 - targetSdkVersion 33
49 + targetSdkVersion 34
50 versionCode flutterVersionCode.toInteger()
51 versionName flutterVersionName
52 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
cw_bitcoin/lib/electrum_wallet_addresses.dart
+9 -8
@@ -224,6 +224,7 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
224 updateAddressesByMatch();
225 updateReceiveAddresses();
226 updateChangeAddresses();
227 + _validateAddresses();
228 await updateAddressesInBox();
229
230 if (currentReceiveAddressIndex >= receiveAddresses.length) {
@@ -458,10 +459,6 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
459 Future<void> discoverAddresses(List<BitcoinAddressRecord> addressList, bool isHidden,
460 Future<String?> Function(BitcoinAddressRecord) getAddressHistory,
461 {BitcoinAddressType type = SegwitAddresType.p2wpkh}) async {
461 - if (!isHidden) {
462 - _validateSideHdAddresses(addressList.toList());
463 - }
464 -
462 final newAddresses = await _createNewAddresses(gap,
463 startIndex: addressList.length, isHidden: isHidden, type: type);
464 addAddresses(newAddresses);
@@ -541,11 +538,15 @@ abstract class ElectrumWalletAddressesBase extends WalletAddresses with Store {
538 updateAddressesByMatch();
539 }
540
544 - void _validateSideHdAddresses(List<BitcoinAddressRecord> addrWithTransactions) {
545 - addrWithTransactions.forEach((element) {
546 - if (element.address !=
547 - getAddress(index: element.index, hd: mainHd, addressType: element.type))
541 + void _validateAddresses() {
542 + allAddresses.forEach((element) {
543 + if (!element.isHidden && element.address !=
544 + getAddress(index: element.index, hd: mainHd, addressType: element.type)) {
545 element.isHidden = true;
546 + } else if (element.isHidden && element.address !=
547 + getAddress(index: element.index, hd: sideHd, addressType: element.type)) {
548 + element.isHidden = false;
549 + }
550 });
551 }
552
cw_core/lib/crypto_currency.dart
+1 -1
@@ -281,7 +281,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> implemen
281 final s = 'Unexpected token: $name for CryptoCurrency fromFullName';
282 throw ArgumentError.value(name, 'Fullname', s);
283 }
284 - return CryptoCurrency._fullNameCurrencyMap[name.toLowerCase()]!;
284 + return CryptoCurrency._fullNameCurrencyMap[name.split("(").first.trim().toLowerCase()]!;
285 }
286
287 @override
cw_core/lib/transaction_info.dart
+1 -1
@@ -3,7 +3,7 @@ import 'package:cw_core/keyable.dart';
3
4 abstract class TransactionInfo extends Object with Keyable {
5 late String id;
6 - late String txhash = id;
6 + late String txHash = id;
7 late int amount;
8 int? fee;
9 late TransactionDirection direction;
cw_monero/lib/monero_subaddress_list.dart
+1 -2
@@ -124,8 +124,7 @@ abstract class MoneroSubaddressListBase with Store {
124 Future<List<Subaddress>> _getAllUnusedAddresses(
125 {required int accountIndex, required String label}) async {
126 final allAddresses = subaddress_list.getAllSubaddresses();
127 - final lastAddress = allAddresses.length == 0 ? allAddresses.last.address : Subaddress(id: -1, address: "", label: "");
128 - if (allAddresses.isEmpty || _usedAddresses.contains(lastAddress)) {
127 + if (allAddresses.isEmpty || _usedAddresses.contains(allAddresses.last)) {
128 final isAddressUnused = await _newSubaddress(accountIndex: accountIndex, label: label);
129 if (!isAddressUnused) {
130 return await _getAllUnusedAddresses(accountIndex: accountIndex, label: label);
cw_monero/lib/monero_transaction_info.dart
+5 -5
@@ -9,14 +9,14 @@ import 'package:cw_core/format_amount.dart';
9 import 'package:cw_monero/api/transaction_history.dart';
10
11 class MoneroTransactionInfo extends TransactionInfo {
12 - MoneroTransactionInfo(this.txhash, this.height, this.direction, this.date,
12 + MoneroTransactionInfo(this.txHash, this.height, this.direction, this.date,
13 this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee,
14 this.confirmations) :
15 - id = "${txhash}_${amount}_${accountIndex}_${addressIndex}";
15 + id = "${txHash}_${amount}_${accountIndex}_${addressIndex}";
16
17 MoneroTransactionInfo.fromMap(Map<String, Object?> map)
18 : id = "${map['hash']}_${map['amount']}_${map['accountIndex']}_${map['addressIndex']}",
19 - txhash = map['hash'] as String,
19 + txHash = map['hash'] as String,
20 height = (map['height'] ?? 0) as int,
21 direction = map['direction'] != null
22 ? parseTransactionDirectionFromNumber(map['direction'] as String)
@@ -39,7 +39,7 @@ class MoneroTransactionInfo extends TransactionInfo {
39
40 MoneroTransactionInfo.fromRow(TransactionInfoRow row)
41 : id = "${row.getHash()}_${row.getAmount()}_${row.subaddrAccount}_${row.subaddrIndex}",
42 - txhash = row.getHash(),
42 + txHash = row.getHash(),
43 height = row.blockHeight,
44 direction = parseTransactionDirectionFromInt(row.direction),
45 date = DateTime.fromMillisecondsSinceEpoch(row.getDatetime() * 1000),
@@ -58,7 +58,7 @@ class MoneroTransactionInfo extends TransactionInfo {
58 }
59
60 final String id;
61 - final String txhash;
61 + final String txHash;
62 final int height;
63 final TransactionDirection direction;
64 final DateTime date;
cw_wownero/lib/wownero_transaction_info.dart
+5 -5
@@ -7,14 +7,14 @@ import 'package:cw_core/format_amount.dart';
7 import 'package:cw_wownero/api/transaction_history.dart';
8
9 class WowneroTransactionInfo extends TransactionInfo {
10 - WowneroTransactionInfo(this.txhash, this.height, this.direction, this.date,
10 + WowneroTransactionInfo(this.txHash, this.height, this.direction, this.date,
11 this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee,
12 this.confirmations) :
13 - id = "${txhash}_${amount}_${accountIndex}_${addressIndex}";
13 + id = "${txHash}_${amount}_${accountIndex}_${addressIndex}";
14
15 WowneroTransactionInfo.fromMap(Map<String, Object?> map)
16 : id = "${map['hash']}_${map['amount']}_${map['accountIndex']}_${map['addressIndex']}",
17 - txhash = map['hash'] as String,
17 + txHash = map['hash'] as String,
18 height = (map['height'] ?? 0) as int,
19 direction = map['direction'] != null
20 ? parseTransactionDirectionFromNumber(map['direction'] as String)
@@ -37,7 +37,7 @@ class WowneroTransactionInfo extends TransactionInfo {
37
38 WowneroTransactionInfo.fromRow(TransactionInfoRow row)
39 : id = "${row.getHash()}_${row.getAmount()}_${row.subaddrAccount}_${row.subaddrIndex}",
40 - txhash = row.getHash(),
40 + txHash = row.getHash(),
41 height = row.blockHeight,
42 direction = parseTransactionDirectionFromInt(row.direction),
43 date = DateTime.fromMillisecondsSinceEpoch(row.getDatetime() * 1000),
@@ -56,7 +56,7 @@ class WowneroTransactionInfo extends TransactionInfo {
56 }
57
58 final String id;
59 - final String txhash;
59 + final String txHash;
60 final int height;
61 final TransactionDirection direction;
62 final DateTime date;
lib/bitcoin/cw_bitcoin.dart
+1 -1
@@ -560,7 +560,7 @@ class CWBitcoin extends Bitcoin {
560 if (tweaksResponse != null) {
561 return true;
562 }
563 - } on RequestFailedTimeoutException {
563 + } on RequestFailedTimeoutException catch (_) {
564 return false;
565 } catch (_) {
566 rethrow;
lib/buy/moonpay/moonpay_provider.dart
+2 -3
@@ -149,10 +149,9 @@ class MoonPayProvider extends BuyProvider {
149 'colorCode': settingsStore.currentTheme.type == ThemeType.dark
150 ? '#${Palette.blueCraiola.value.toRadixString(16).substring(2, 8)}'
151 : '#${Palette.moderateSlateBlue.value.toRadixString(16).substring(2, 8)}',
152 - 'defaultCurrencyCode': _normalizeCurrency(currency),
153 - 'baseCurrencyCode': _normalizeCurrency(currency),
152 + 'baseCurrencyCode': settingsStore.fiatCurrency.title,
153 'baseCurrencyAmount': amount ?? '0',
155 - 'currencyCode': currencyCode,
154 + 'currencyCode': _normalizeCurrency(currency),
155 'walletAddress': walletAddress,
156 'lockAmount': 'false',
157 'showAllCurrencies': 'false',
lib/entities/provider_types.dart
+1 -2
@@ -67,9 +67,8 @@ class ProvidersHelper {
67 ];
68 case WalletType.litecoin:
69 case WalletType.bitcoinCash:
70 - return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood, ProviderType.moonpay];
70 case WalletType.solana:
72 - return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood];
71 + return [ProviderType.askEachTime, ProviderType.onramper, ProviderType.robinhood, ProviderType.moonpay];
72 case WalletType.tron:
73 return [
74 ProviderType.askEachTime,
lib/src/screens/dashboard/pages/balance_page.dart
+1 -1
@@ -340,7 +340,7 @@ class CryptoBalanceWidget extends StatelessWidget {
340 builder: (BuildContext context) => AlertWithTwoActions(
341 alertTitle: S.of(context).change_current_node_title,
342 alertContent: S.of(context).confirm_silent_payments_switch_node,
343 - rightButtonText: S.of(context).ok,
343 + rightButtonText: S.of(context).confirm,
344 leftButtonText: S.of(context).cancel,
345 actionRightButton: () {
346 dashboardViewModel.setSilentPaymentsScanning(newValue);
lib/src/screens/rescan/rescan_page.dart
+35 -31
@@ -22,38 +22,42 @@ class RescanPage extends BasePage {
22
23 @override
24 Widget body(BuildContext context) {
25 - return Padding(
26 - padding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
27 - child: Column(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
28 - Observer(
29 - builder: (_) => BlockchainHeightWidget(
30 - key: _blockchainHeightWidgetKey,
31 - onHeightOrDateEntered: (value) => _rescanViewModel.isButtonEnabled = value,
32 - isSilentPaymentsScan: _rescanViewModel.isSilentPaymentsScan,
33 - doSingleScan: _rescanViewModel.doSingleScan,
34 - toggleSingleScan: () =>
35 - _rescanViewModel.doSingleScan = !_rescanViewModel.doSingleScan,
36 - walletType: _rescanViewModel.wallet.type,
37 - )),
38 - Observer(
39 - builder: (_) => LoadingPrimaryButton(
40 - isLoading: _rescanViewModel.state == RescanWalletState.rescaning,
41 - text: S.of(context).rescan,
42 - onPressed: () async {
43 - if (_rescanViewModel.isSilentPaymentsScan) {
44 - return _toggleSilentPaymentsScanning(context);
45 - }
25 + return GestureDetector(
26 + behavior: HitTestBehavior.opaque,
27 + onTap: () => FocusScope.of(context).unfocus(),
28 + child: Padding(
29 + padding: EdgeInsets.only(left: 24, right: 24, bottom: 24),
30 + child: Column(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
31 + Observer(
32 + builder: (_) => BlockchainHeightWidget(
33 + key: _blockchainHeightWidgetKey,
34 + onHeightOrDateEntered: (value) => _rescanViewModel.isButtonEnabled = value,
35 + isSilentPaymentsScan: _rescanViewModel.isSilentPaymentsScan,
36 + doSingleScan: _rescanViewModel.doSingleScan,
37 + toggleSingleScan: () =>
38 + _rescanViewModel.doSingleScan = !_rescanViewModel.doSingleScan,
39 + walletType: _rescanViewModel.wallet.type,
40 + )),
41 + Observer(
42 + builder: (_) => LoadingPrimaryButton(
43 + isLoading: _rescanViewModel.state == RescanWalletState.rescaning,
44 + text: S.of(context).rescan,
45 + onPressed: () async {
46 + if (_rescanViewModel.isSilentPaymentsScan) {
47 + return _toggleSilentPaymentsScanning(context);
48 + }
49
47 - _rescanViewModel.rescanCurrentWallet(
48 - restoreHeight: _blockchainHeightWidgetKey.currentState!.height);
50 + _rescanViewModel.rescanCurrentWallet(
51 + restoreHeight: _blockchainHeightWidgetKey.currentState!.height);
52
50 - Navigator.of(context).pop();
51 - },
52 - color: Theme.of(context).primaryColor,
53 - textColor: Colors.white,
54 - isDisabled: !_rescanViewModel.isButtonEnabled,
55 - ))
56 - ]),
53 + Navigator.of(context).pop();
54 + },
55 + color: Theme.of(context).primaryColor,
56 + textColor: Colors.white,
57 + isDisabled: !_rescanViewModel.isButtonEnabled,
58 + ))
59 + ]),
60 + ),
61 );
62 }
63
@@ -71,7 +75,7 @@ class RescanPage extends BasePage {
75 builder: (BuildContext _dialogContext) => AlertWithTwoActions(
76 alertTitle: S.of(_dialogContext).change_current_node_title,
77 alertContent: S.of(_dialogContext).confirm_silent_payments_switch_node,
74 - rightButtonText: S.of(_dialogContext).ok,
78 + rightButtonText: S.of(_dialogContext).confirm,
79 leftButtonText: S.of(_dialogContext).cancel,
80 actionRightButton: () async {
81 Navigator.of(_dialogContext).pop();
lib/src/screens/welcome/welcome_page.dart
+91 -92
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
2 import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
3 import 'package:cake_wallet/themes/theme_base.dart';
4 import 'package:cake_wallet/utils/responsive_layout_util.dart';
@@ -49,115 +50,113 @@ class WelcomePage extends BasePage {
50
51 @override
52 Widget body(BuildContext context) {
52 - final welcomeImage = currentTheme.type == ThemeType.dark
53 - ? welcomeImageDark
54 - : welcomeImageLight;
53 + final welcomeImage = currentTheme.type == ThemeType.dark ? welcomeImageDark : welcomeImageLight;
54
55 final newWalletImage = Image.asset('assets/images/new_wallet.png',
56 height: 12,
57 width: 12,
58 color: Theme.of(context).extension<WalletListTheme>()!.restoreWalletButtonTextColor);
59 final restoreWalletImage = Image.asset('assets/images/restore_wallet.png',
61 - height: 12,
62 -
63 - width: 12,
64 - color: Theme.of(context).extension<CakeTextTheme>()!.titleColor);
60 + height: 12, width: 12, color: Theme.of(context).extension<CakeTextTheme>()!.titleColor);
61
62 return WillPopScope(
67 - onWillPop: () async => false,
68 - child: Container(
69 - alignment: Alignment.center,
70 - padding: EdgeInsets.only(top: 64, bottom: 24, left: 24, right: 24),
71 - child: ConstrainedBox(
72 - constraints: BoxConstraints(
73 - maxWidth: ResponsiveLayoutUtilBase.kDesktopMaxWidthConstraint),
74 - child: Column(
75 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
76 - children: <Widget>[
77 - Column(
78 - children: <Widget>[
79 - AspectRatio(
80 - aspectRatio: aspectRatioImage,
81 - child: FittedBox(
82 - child: welcomeImage, fit: BoxFit.contain),
83 - ),
84 - Padding(
85 - padding: EdgeInsets.only(top: 24),
86 - child: Text(
87 - S.of(context).welcome,
88 - style: TextStyle(
89 - fontSize: 18,
90 - fontWeight: FontWeight.w500,
91 - color: Theme.of(context).extension<NewWalletTheme>()!.hintTextColor,
92 - ),
93 - textAlign: TextAlign.center,
94 - ),
95 - ),
96 - Padding(
97 - padding: EdgeInsets.only(top: 5),
98 - child: Text(
99 - appTitle(context),
100 - style: TextStyle(
101 - fontSize: 36,
102 - fontWeight: FontWeight.bold,
103 - color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
104 - ),
105 - textAlign: TextAlign.center,
63 + onWillPop: () async => false,
64 + child: ScrollableWithBottomSection(
65 + content: Container(
66 + alignment: Alignment.center,
67 + padding: EdgeInsets.only(top: 64, bottom: 24, left: 24, right: 24),
68 + child: ConstrainedBox(
69 + constraints:
70 + BoxConstraints(maxWidth: ResponsiveLayoutUtilBase.kDesktopMaxWidthConstraint),
71 + child: Column(
72 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
73 + children: <Widget>[
74 + Column(
75 + children: <Widget>[
76 + AspectRatio(
77 + aspectRatio: aspectRatioImage,
78 + child: FittedBox(child: welcomeImage, fit: BoxFit.contain),
79 + ),
80 + Padding(
81 + padding: EdgeInsets.only(top: 24),
82 + child: Text(
83 + S.of(context).welcome,
84 + style: TextStyle(
85 + fontSize: 18,
86 + fontWeight: FontWeight.w500,
87 + color: Theme.of(context).extension<NewWalletTheme>()!.hintTextColor,
88 ),
89 + textAlign: TextAlign.center,
90 ),
108 - Padding(
109 - padding: EdgeInsets.only(top: 5),
110 - child: Text(
111 - appDescription(context),
112 - style: TextStyle(
113 - fontSize: 16,
114 - fontWeight: FontWeight.w500,
115 - color: Theme.of(context).extension<NewWalletTheme>()!.hintTextColor,
116 - ),
117 - textAlign: TextAlign.center,
91 + ),
92 + Padding(
93 + padding: EdgeInsets.only(top: 5),
94 + child: Text(
95 + appTitle(context),
96 + style: TextStyle(
97 + fontSize: 36,
98 + fontWeight: FontWeight.bold,
99 + color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
100 ),
101 + textAlign: TextAlign.center,
102 ),
120 - ],
121 - ),
122 - Column(
123 - children: <Widget>[
124 - Text(
125 - S.of(context).please_make_selection,
103 + ),
104 + Padding(
105 + padding: EdgeInsets.only(top: 5),
106 + child: Text(
107 + appDescription(context),
108 style: TextStyle(
127 - fontSize: 12,
128 - fontWeight: FontWeight.normal,
109 + fontSize: 16,
110 + fontWeight: FontWeight.w500,
111 color: Theme.of(context).extension<NewWalletTheme>()!.hintTextColor,
112 ),
113 textAlign: TextAlign.center,
114 ),
133 - Padding(
134 - padding: EdgeInsets.only(top: 24),
135 - child: PrimaryImageButton(
136 - onPressed: () => Navigator.pushNamed(
137 - context, Routes.newWalletFromWelcome),
138 - image: newWalletImage,
139 - text: S.of(context).create_new,
140 - color: Theme.of(context).extension<WalletListTheme>()!.createNewWalletButtonBackgroundColor,
141 - textColor: Theme.of(context).extension<WalletListTheme>()!.restoreWalletButtonTextColor,
142 - ),
143 - ),
144 - Padding(
145 - padding: EdgeInsets.only(top: 10),
146 - child: PrimaryImageButton(
147 - onPressed: () {
148 - Navigator.pushNamed(
149 - context, Routes.restoreOptions,
150 - arguments: true);
151 - },
152 - image: restoreWalletImage,
153 - text: S.of(context).restore_wallet,
154 - color: Theme.of(context).cardColor,
155 - textColor: Theme.of(context).extension<CakeTextTheme>()!.titleColor),
156 - )
157 - ],
158 - )
159 - ],
115 + ),
116 + ],
117 + ),
118 + ],
119 + ),
120 + ),
121 + ),
122 + bottomSection: Column(
123 + children: <Widget>[
124 + Text(
125 + S.of(context).please_make_selection,
126 + style: TextStyle(
127 + fontSize: 12,
128 + fontWeight: FontWeight.normal,
129 + color: Theme.of(context).extension<NewWalletTheme>()!.hintTextColor,
130 + ),
131 + textAlign: TextAlign.center,
132 + ),
133 + Padding(
134 + padding: EdgeInsets.only(top: 24),
135 + child: PrimaryImageButton(
136 + onPressed: () => Navigator.pushNamed(context, Routes.newWalletFromWelcome),
137 + image: newWalletImage,
138 + text: S.of(context).create_new,
139 + color: Theme.of(context)
140 + .extension<WalletListTheme>()!
141 + .createNewWalletButtonBackgroundColor,
142 + textColor:
143 + Theme.of(context).extension<WalletListTheme>()!.restoreWalletButtonTextColor,
144 ),
161 - )));
145 + ),
146 + Padding(
147 + padding: EdgeInsets.only(top: 10),
148 + child: PrimaryImageButton(
149 + onPressed: () {
150 + Navigator.pushNamed(context, Routes.restoreOptions, arguments: true);
151 + },
152 + image: restoreWalletImage,
153 + text: S.of(context).restore_wallet,
154 + color: Theme.of(context).cardColor,
155 + textColor: Theme.of(context).extension<CakeTextTheme>()!.titleColor),
156 + )
157 + ],
158 + ),
159 + ),
160 + );
161 }
162 }
lib/src/widgets/blockchain_height_widget.dart
+76 -72
@@ -65,89 +65,93 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
65
66 @override
67 Widget build(BuildContext context) {
68 - return Column(
69 - crossAxisAlignment: CrossAxisAlignment.start,
70 - children: <Widget>[
71 - Row(
72 - children: <Widget>[
73 - Flexible(
74 - child: Container(
75 - padding: EdgeInsets.only(top: 20.0, bottom: 10.0),
76 - child: BaseTextFormField(
77 - focusNode: widget.focusNode,
78 - controller: restoreHeightController,
79 - keyboardType: TextInputType.numberWithOptions(signed: false, decimal: false),
80 - hintText: widget.isSilentPaymentsScan
81 - ? S.of(context).silent_payments_scan_from_height
82 - : S.of(context).widgets_restore_from_blockheight,
83 - )))
84 - ],
85 - ),
86 - if (widget.hasDatePicker) ...[
87 - Padding(
88 - padding: EdgeInsets.only(top: 15, bottom: 15),
89 - child: Text(
90 - S.of(context).widgets_or,
91 - style: TextStyle(
92 - fontSize: 16.0,
93 - fontWeight: FontWeight.w500,
94 - color: Theme.of(context).extension<CakeTextTheme>()!.titleColor),
95 - ),
96 - ),
68 + return GestureDetector(
69 + behavior: HitTestBehavior.opaque,
70 + onTap: () => FocusScope.of(context).unfocus(),
71 + child: Column(
72 + crossAxisAlignment: CrossAxisAlignment.start,
73 + children: <Widget>[
74 Row(
75 children: <Widget>[
76 Flexible(
77 child: Container(
101 - child: InkWell(
102 - onTap: () => _selectDate(context),
103 - child: IgnorePointer(
78 + padding: EdgeInsets.only(top: 20.0, bottom: 10.0),
79 child: BaseTextFormField(
105 - controller: dateController,
106 - hintText: widget.isSilentPaymentsScan
107 - ? S.of(context).silent_payments_scan_from_date
108 - : S.of(context).widgets_restore_from_date,
109 - )),
110 - ),
111 - ))
80 + focusNode: widget.focusNode,
81 + controller: restoreHeightController,
82 + keyboardType: TextInputType.numberWithOptions(signed: false, decimal: false),
83 + hintText: widget.isSilentPaymentsScan
84 + ? S.of(context).silent_payments_scan_from_height
85 + : S.of(context).widgets_restore_from_blockheight,
86 + )))
87 ],
88 ),
114 - if (widget.isSilentPaymentsScan)
89 + if (widget.hasDatePicker) ...[
90 Padding(
116 - padding: EdgeInsets.only(top: 24),
117 - child: Row(
118 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
119 - children: [
120 - Text(
121 - S.of(context).scan_one_block,
122 - style: TextStyle(
123 - fontSize: 14,
124 - fontWeight: FontWeight.normal,
125 - color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
126 - ),
127 - ),
128 - Padding(
129 - padding: const EdgeInsets.only(right: 8),
130 - child: StandardSwitch(
131 - value: widget.doSingleScan,
132 - onTaped: () => widget.toggleSingleScan?.call(),
133 - ),
134 - )
135 - ],
91 + padding: EdgeInsets.only(top: 15, bottom: 15),
92 + child: Text(
93 + S.of(context).widgets_or,
94 + style: TextStyle(
95 + fontSize: 16.0,
96 + fontWeight: FontWeight.w500,
97 + color: Theme.of(context).extension<CakeTextTheme>()!.titleColor),
98 ),
99 ),
138 - Padding(
139 - padding: EdgeInsets.only(left: 40, right: 40, top: 24),
140 - child: Text(
141 - widget.isSilentPaymentsScan
142 - ? S.of(context).silent_payments_scan_from_date_or_blockheight
143 - : S.of(context).restore_from_date_or_blockheight,
144 - textAlign: TextAlign.center,
145 - style: TextStyle(
146 - fontSize: 12, fontWeight: FontWeight.normal, color: Theme.of(context).hintColor),
100 + Row(
101 + children: <Widget>[
102 + Flexible(
103 + child: Container(
104 + child: InkWell(
105 + onTap: () => _selectDate(context),
106 + child: IgnorePointer(
107 + child: BaseTextFormField(
108 + controller: dateController,
109 + hintText: widget.isSilentPaymentsScan
110 + ? S.of(context).silent_payments_scan_from_date
111 + : S.of(context).widgets_restore_from_date,
112 + )),
113 + ),
114 + ))
115 + ],
116 ),
148 - )
149 - ]
150 - ],
117 + if (widget.isSilentPaymentsScan)
118 + Padding(
119 + padding: EdgeInsets.only(top: 24),
120 + child: Row(
121 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
122 + children: [
123 + Text(
124 + S.of(context).scan_one_block,
125 + style: TextStyle(
126 + fontSize: 14,
127 + fontWeight: FontWeight.normal,
128 + color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
129 + ),
130 + ),
131 + Padding(
132 + padding: const EdgeInsets.only(right: 8),
133 + child: StandardSwitch(
134 + value: widget.doSingleScan,
135 + onTaped: () => widget.toggleSingleScan?.call(),
136 + ),
137 + )
138 + ],
139 + ),
140 + ),
141 + Padding(
142 + padding: EdgeInsets.only(left: 40, right: 40, top: 24),
143 + child: Text(
144 + widget.isSilentPaymentsScan
145 + ? S.of(context).silent_payments_scan_from_date_or_blockheight
146 + : S.of(context).restore_from_date_or_blockheight,
147 + textAlign: TextAlign.center,
148 + style: TextStyle(
149 + fontSize: 12, fontWeight: FontWeight.normal, color: Theme.of(context).hintColor),
150 + ),
151 + )
152 + ]
153 + ],
154 + ),
155 );
156 }
157
lib/store/settings_store.dart
+5 -3
@@ -1184,9 +1184,11 @@ abstract class SettingsStoreBase with Store {
1184 raw: sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ??
1185 priority[WalletType.monero]!;
1186
1187 - priority[WalletType.wownero] = wownero?.deserializeWowneroTransactionPriority(
1188 - raw: sharedPreferences.getInt(PreferencesKey.wowneroTransactionPriority)!) ??
1189 - priority[WalletType.wownero]!;
1187 + if (wownero != null &&
1188 + sharedPreferences.getInt(PreferencesKey.wowneroTransactionPriority) != null) {
1189 + priority[WalletType.wownero] = wownero!.deserializeWowneroTransactionPriority(
1190 + raw: sharedPreferences.getInt(PreferencesKey.wowneroTransactionPriority)!);
1191 + }
1192
1193 if (bitcoin != null &&
1194 sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority) != null) {
lib/view_model/dashboard/balance_view_model.dart
+1 -1
@@ -61,7 +61,7 @@ abstract class BalanceViewModelBase with Store {
61 WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, TransactionInfo> wallet;
62
63 @computed
64 - bool get hasSilentPayments => wallet.type == WalletType.bitcoin;
64 + bool get hasSilentPayments => wallet.type == WalletType.bitcoin && !wallet.isHardwareWallet;
65
66 @computed
67 double get price {
lib/view_model/dashboard/dashboard_view_model.dart
+1 -1
@@ -308,7 +308,7 @@ abstract class DashboardViewModelBase with Store {
308 wallet.type == WalletType.haven;
309
310 @computed
311 - bool get hasSilentPayments => wallet.type == WalletType.bitcoin;
311 + bool get hasSilentPayments => wallet.type == WalletType.bitcoin && !wallet.isHardwareWallet;
312
313 @computed
314 bool get showSilentPaymentsCard => hasSilentPayments && settingsStore.silentPaymentsCardDisplay;
lib/view_model/transaction_details_view_model.dart
+13 -13
@@ -86,7 +86,7 @@ abstract class TransactionDetailsViewModelBase with Store {
86 if (showRecipientAddress && !isRecipientAddressShown) {
87 try {
88 final recipientAddress = transactionDescriptionBox.values
89 - .firstWhere((val) => val.id == transactionInfo.id)
89 + .firstWhere((val) => val.id == transactionInfo.txHash)
90 .recipientAddress;
91
92 if (recipientAddress?.isNotEmpty ?? false) {
@@ -105,14 +105,14 @@ abstract class TransactionDetailsViewModelBase with Store {
105 value: _explorerDescription(type),
106 onTap: () async {
107 try {
108 - final uri = Uri.parse(_explorerUrl(type, tx.id));
108 + final uri = Uri.parse(_explorerUrl(type, tx.txHash));
109 if (await canLaunchUrl(uri)) await launchUrl(uri, mode: LaunchMode.externalApplication);
110 } catch (e) {}
111 }));
112
113 final description = transactionDescriptionBox.values.firstWhere(
114 - (val) => val.id == transactionInfo.id,
115 - orElse: () => TransactionDescription(id: transactionInfo.id));
114 + (val) => val.id == transactionInfo.txHash,
115 + orElse: () => TransactionDescription(id: transactionInfo.txHash));
116
117 items.add(TextFieldListItem(
118 title: S.current.note_tap_to_change,
@@ -214,7 +214,7 @@ abstract class TransactionDetailsViewModelBase with Store {
214 final addressIndex = tx.additionalInfo['addressIndex'] as int;
215 final feeFormatted = tx.feeFormatted();
216 final _items = [
217 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txhash),
217 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
218 StandartListItem(
219 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
220 StandartListItem(title: S.current.transaction_details_height, value: '${tx.height}'),
@@ -250,7 +250,7 @@ abstract class TransactionDetailsViewModelBase with Store {
250
251 void _addElectrumListItems(TransactionInfo tx, DateFormat dateFormat) {
252 final _items = [
253 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
253 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
254 StandartListItem(
255 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
256 StandartListItem(title: S.current.confirmations, value: tx.confirmations.toString()),
@@ -265,7 +265,7 @@ abstract class TransactionDetailsViewModelBase with Store {
265
266 void _addHavenListItems(TransactionInfo tx, DateFormat dateFormat) {
267 items.addAll([
268 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
268 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
269 StandartListItem(
270 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
271 StandartListItem(title: S.current.transaction_details_height, value: '${tx.height}'),
@@ -277,7 +277,7 @@ abstract class TransactionDetailsViewModelBase with Store {
277
278 void _addEthereumListItems(TransactionInfo tx, DateFormat dateFormat) {
279 final _items = [
280 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
280 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
281 StandartListItem(
282 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
283 StandartListItem(title: S.current.confirmations, value: tx.confirmations.toString()),
@@ -296,7 +296,7 @@ abstract class TransactionDetailsViewModelBase with Store {
296
297 void _addNanoListItems(TransactionInfo tx, DateFormat dateFormat) {
298 final _items = [
299 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
299 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
300 if (showRecipientAddress && tx.to != null)
301 StandartListItem(title: S.current.transaction_details_recipient_address, value: tx.to!),
302 if (showRecipientAddress && tx.from != null)
@@ -313,7 +313,7 @@ abstract class TransactionDetailsViewModelBase with Store {
313
314 void _addPolygonListItems(TransactionInfo tx, DateFormat dateFormat) {
315 final _items = [
316 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
316 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
317 StandartListItem(
318 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
319 StandartListItem(title: S.current.confirmations, value: tx.confirmations.toString()),
@@ -332,7 +332,7 @@ abstract class TransactionDetailsViewModelBase with Store {
332
333 void _addSolanaListItems(TransactionInfo tx, DateFormat dateFormat) {
334 final _items = [
335 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
335 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
336 StandartListItem(
337 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
338 StandartListItem(title: S.current.transaction_details_amount, value: tx.amountFormatted()),
@@ -396,7 +396,7 @@ abstract class TransactionDetailsViewModelBase with Store {
396
397 void _addTronListItems(TransactionInfo tx, DateFormat dateFormat) {
398 final _items = [
399 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.id),
399 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
400 StandartListItem(
401 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
402 StandartListItem(title: S.current.transaction_details_amount, value: tx.amountFormatted()),
@@ -455,7 +455,7 @@ abstract class TransactionDetailsViewModelBase with Store {
455 final addressIndex = tx.additionalInfo['addressIndex'] as int;
456 final feeFormatted = tx.feeFormatted();
457 final _items = [
458 - StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txhash),
458 + StandartListItem(title: S.current.transaction_details_transaction_id, value: tx.txHash),
459 StandartListItem(
460 title: S.current.transaction_details_date, value: dateFormat.format(tx.date)),
461 StandartListItem(title: S.current.transaction_details_height, value: '${tx.height}'),
res/values/strings_ar.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "تأكيد خصم الرسوم",
144 "confirm_fee_deduction_content": "هل توافق على خصم الرسوم من الإخراج؟",
145 "confirm_sending": "تأكيد الإرسال",
146 - "confirm_silent_payments_switch_node": "حاليا مطلوب لتبديل العقد لمسح المدفوعات الصامتة",
146 + "confirm_silent_payments_switch_node": "العقدة الحالية لا تدعم المدفوعات الصامتة \\ ncake wallet سوف تتحول إلى عقدة متوافقة ، فقط للمسح الضوئي",
147 "confirmations": "التأكيدات",
148 "confirmed": "رصيد مؤكد",
149 "confirmed_tx": "مؤكد",
res/values/strings_bg.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Потвърдете приспадането на таксите",
144 "confirm_fee_deduction_content": "Съгласни ли сте да приспадате таксата от продукцията?",
145 "confirm_sending": "Потвърждаване на изпращането",
146 - "confirm_silent_payments_switch_node": "Понастоящем се изисква да превключвате възлите за сканиране на мълчаливи плащания",
146 + "confirm_silent_payments_switch_node": "Текущият ви възел не поддържа Silent Payments \\ Ncake Wallet ще премине към съвместим възел, само за сканиране",
147 "confirmations": "потвърждения",
148 "confirmed": "Потвърден баланс",
149 "confirmed_tx": "Потвърдено",
res/values/strings_cs.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Potvrďte odpočet poplatků",
144 "confirm_fee_deduction_content": "Souhlasíte s odečtením poplatku z výstupu?",
145 "confirm_sending": "Potvrdit odeslání",
146 - "confirm_silent_payments_switch_node": "V současné době je nutné přepínat uzly pro skenování tichých plateb",
146 + "confirm_silent_payments_switch_node": "Váš aktuální uzel nepodporuje tiché platby \\ Ncake peněženka se přepne na kompatibilní uzel, pouze pro skenování",
147 "confirmations": "Potvrzení",
148 "confirmed": "Potvrzený zůstatek",
149 "confirmed_tx": "Potvrzeno",
res/values/strings_de.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Gebührenabzug bestätigen",
144 "confirm_fee_deduction_content": "Stimmen Sie zu, die Gebühr von der Ausgabe abzuziehen?",
145 "confirm_sending": "Senden bestätigen",
146 - "confirm_silent_payments_switch_node": "Derzeit ist es erforderlich, Knoten zu wechseln, um stille Zahlungen zu scannen",
146 + "confirm_silent_payments_switch_node": "Ihr aktueller Knoten unterstützt keine stillen Zahlungen \\ NCAKE Wallet wechselt zu einem kompatiblen Knoten, nur zum Scannen",
147 "confirmations": "Bestätigungen",
148 "confirmed": "Bestätigter Saldo",
149 "confirmed_tx": "Bestätigt",
res/values/strings_en.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Confirm Fee Deduction",
144 "confirm_fee_deduction_content": "Do you agree to deduct the fee from the output?",
145 "confirm_sending": "Confirm sending",
146 - "confirm_silent_payments_switch_node": "Currently it is required to switch nodes to scan silent payments",
146 + "confirm_silent_payments_switch_node": "Your current node does not support silent payments\\nCake Wallet will switch to a compatible node, just for scanning",
147 "confirmations": "Confirmations",
148 "confirmed": "Confirmed Balance",
149 "confirmed_tx": "Confirmed",
res/values/strings_es.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Confirmar la deducción de la tarifa",
144 "confirm_fee_deduction_content": "¿Acepta deducir la tarifa de la producción?",
145 "confirm_sending": "Confirmar envío",
146 - "confirm_silent_payments_switch_node": "Actualmente se requiere cambiar los nodos para escanear pagos silenciosos",
146 + "confirm_silent_payments_switch_node": "Su nodo actual no admite pagos silenciosos \\ ncake billet cambiará a un nodo compatible, solo para escanear",
147 "confirmations": "Confirmaciones",
148 "confirmed": "Saldo confirmado",
149 "confirmed_tx": "Confirmado",
res/values/strings_fr.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Confirmer la déduction des frais",
144 "confirm_fee_deduction_content": "Acceptez-vous de déduire les frais de la production?",
145 "confirm_sending": "Confirmer l'envoi",
146 - "confirm_silent_payments_switch_node": "Actuellement, il est nécessaire de changer de nœuds pour scanner les paiements silencieux",
146 + "confirm_silent_payments_switch_node": "Votre nœud actuel ne prend pas en charge les paiements silencieux \\ ncake qui passera à un nœud compatible, juste pour la numérisation",
147 "confirmations": "Confirmations",
148 "confirmed": "Solde confirmé",
149 "confirmed_tx": "Confirmé",
res/values/strings_ha.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Tabbatar da cire kudade",
144 "confirm_fee_deduction_content": "Shin kun yarda ku cire kuɗin daga fitarwa?",
145 "confirm_sending": "Tabbatar da aikawa",
146 - "confirm_silent_payments_switch_node": "A halin yanzu ana buƙatar sauya nodes don bincika biyan siliki",
146 + "confirm_silent_payments_switch_node": "Kumburinku na yanzu ba ya goyan bayan biyan shiru da shiru \\ NCADA Wallet zai canza zuwa kumburi mai dacewa, don bincika",
147 "confirmations": "Tabbatar",
148 "confirmed": "An tabbatar",
149 "confirmed_tx": "Tabbatar",
res/values/strings_hi.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "शुल्क कटौती की पुष्टि करें",
144 "confirm_fee_deduction_content": "क्या आप आउटपुट से शुल्क में कटौती करने के लिए सहमत हैं?",
145 "confirm_sending": "भेजने की पुष्टि करें",
146 - "confirm_silent_payments_switch_node": "वर्तमान में मूक भुगतान को स्कैन करने के लिए नोड्स को स्विच करना आवश्यक है",
146 + "confirm_silent_payments_switch_node": "आपका वर्तमान नोड मूक भुगतान का समर्थन नहीं करता है \\ ncake वॉलेट एक संगत नोड पर स्विच करेगा, बस स्कैनिंग के लिए",
147 "confirmations": "पुष्टिकरण",
148 "confirmed": "पुष्टि की गई शेष राशिी",
149 "confirmed_tx": "की पुष्टि",
res/values/strings_hr.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Potvrdite odbitak naknade",
144 "confirm_fee_deduction_content": "Slažete li se da ćete odbiti naknadu od izlaza?",
145 "confirm_sending": "Potvrdi slanje",
146 - "confirm_silent_payments_switch_node": "Trenutno je potrebno prebaciti čvorove na skeniranje tihih plaćanja",
146 + "confirm_silent_payments_switch_node": "Vaš trenutni čvor ne podržava tiha plaćanja \\ ncake novčanik prebacit će se na kompatibilni čvor, samo za skeniranje",
147 "confirmations": "Potvrde",
148 "confirmed": "Potvrđeno stanje",
149 "confirmed_tx": "Potvrđen",
res/values/strings_id.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Konfirmasi pengurangan biaya",
144 "confirm_fee_deduction_content": "Apakah Anda setuju untuk mengurangi biaya dari output?",
145 "confirm_sending": "Konfirmasi pengiriman",
146 - "confirm_silent_payments_switch_node": "Saat ini diminta untuk mengganti node untuk memindai pembayaran diam",
146 + "confirm_silent_payments_switch_node": "Node Anda saat ini tidak mendukung pembayaran diam \\ ncake Wallet akan beralih ke simpul yang kompatibel, hanya untuk pemindaian",
147 "confirmations": "Konfirmasi",
148 "confirmed": "Saldo Terkonfirmasi",
149 "confirmed_tx": "Dikonfirmasi",
res/values/strings_it.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Conferma la detrazione delle commissioni",
144 "confirm_fee_deduction_content": "Accetti di detrarre la commissione dall'output?",
145 "confirm_sending": "Conferma l'invio",
146 - "confirm_silent_payments_switch_node": "Attualmente è necessario cambiare nodi per scansionare i pagamenti silenziosi",
146 + "confirm_silent_payments_switch_node": "Il tuo nodo corrente non supporta i pagamenti silenziosi \\ ncake Wallet passerà a un nodo compatibile, solo per la scansione",
147 "confirmations": "Conferme",
148 "confirmed": "Saldo confermato",
149 "confirmed_tx": "Confermato",
res/values/strings_ja.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "料金控除を確認します",
144 "confirm_fee_deduction_content": "出力から料金を差し引くことに同意しますか?",
145 "confirm_sending": "送信を確認",
146 - "confirm_silent_payments_switch_node": "現在、ノードを切り替えてサイレント決済をスキャンする必要があります",
146 + "confirm_silent_payments_switch_node": "現在のノードはサイレントペイメントをサポートしていません\\ ncakeウォレットは、スキャン用に互換性のあるノードに切り替えます",
147 "confirmations": "確認",
148 "confirmed": "確認済み残高",
149 "confirmed_tx": "確認済み",
res/values/strings_ko.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "수수료 공제를 확인하십시오",
144 "confirm_fee_deduction_content": "출력에서 수수료를 공제하는 데 동의하십니까?",
145 "confirm_sending": "전송 확인",
146 - "confirm_silent_payments_switch_node": "현재 사일런트 결제를 스캔하려면 노드를 전환해야합니다.",
146 + "confirm_silent_payments_switch_node": "현재 노드는 무음 지불을 지원하지 않습니다 \\ ncake 지갑은 스캔을 위해 호환 가능한 노드로 전환됩니다.",
147 "confirmations": "확인",
148 "confirmed": "확인된 잔액",
149 "confirmed_tx": "확인",
res/values/strings_my.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "အခကြေးငွေကိုနှုတ်ယူခြင်း",
144 "confirm_fee_deduction_content": "output မှအခကြေးငွေကိုယူရန်သဘောတူပါသလား။",
145 "confirm_sending": "ပေးပို့အတည်ပြုပါ။",
146 - "confirm_silent_payments_switch_node": "လောလောဆယ်အသံတိတ်ငွေပေးချေမှုကိုစကင်ဖတ်စစ်ဆေးရန် node များကိုပြောင်းရန်လိုအပ်သည်",
146 + "confirm_silent_payments_switch_node": "သင်၏လက်ရှိ node သည်အသံတိတ်ငွေပေးချေမှုကိုမပံ့ပိုးပါဟု \\ t",
147 "confirmations": "အတည်ပြုချက်များ",
148 "confirmed": "အတည်ပြုထားသော လက်ကျန်ငွေ",
149 "confirmed_tx": "အတည်ပြုသည်",
res/values/strings_nl.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Bevestig de aftrek van de kosten",
144 "confirm_fee_deduction_content": "Stemt u ermee in om de vergoeding af te trekken van de output?",
145 "confirm_sending": "Bevestig verzending",
146 - "confirm_silent_payments_switch_node": "Momenteel is het vereist om knooppunten te schakelen om stille betalingen te scannen",
146 + "confirm_silent_payments_switch_node": "Uw huidige knooppunt ondersteunt geen stille betalingen \\ ncake -portemonnee schakelt over naar een compatibele knoop",
147 "confirmations": "Bevestigingen",
148 "confirmed": "Bevestigd saldo",
149 "confirmed_tx": "Bevestigd",
res/values/strings_pl.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Potwierdź odliczenie opłaty",
144 "confirm_fee_deduction_content": "Czy zgadzasz się odliczyć opłatę od wyników?",
145 "confirm_sending": "Potwierdź wysłanie",
146 - "confirm_silent_payments_switch_node": "Obecnie wymagane jest zmiana węzłów w celu skanowania cichych płatności",
146 + "confirm_silent_payments_switch_node": "Twój obecny węzeł nie obsługuje cichych płatności \\ NCAKE Portfel przełączy się na kompatybilny węzeł, tylko do skanowania",
147 "confirmations": "Potwierdzenia",
148 "confirmed": "Potwierdzone saldo",
149 "confirmed_tx": "Potwierdzony",
res/values/strings_pt.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Confirme dedução da taxa",
144 "confirm_fee_deduction_content": "Você concorda em deduzir a taxa da saída?",
145 "confirm_sending": "Confirmar o envio",
146 - "confirm_silent_payments_switch_node": "Atualmente, é necessário trocar de nós para digitalizar pagamentos silenciosos",
146 + "confirm_silent_payments_switch_node": "Seu nó atual não suporta pagamentos silenciosos \\ Ncake Wallet mudará para um nó compatível, apenas para digitalização",
147 "confirmations": "Confirmações",
148 "confirmed": "Saldo Confirmado",
149 "confirmed_tx": "Confirmado",
res/values/strings_ru.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Подтвердите вычет платы",
144 "confirm_fee_deduction_content": "Согласны ли вы вычесть плату из вывода?",
145 "confirm_sending": "Подтвердить отправку",
146 - "confirm_silent_payments_switch_node": "В настоящее время требуется переключение узлов для сканирования молчаливых платежей",
146 + "confirm_silent_payments_switch_node": "Ваш текущий узел не поддерживает Silent Payments \\ ncake Wallet переключится на совместимый узел, только для сканирования",
147 "confirmations": "Подтверждения",
148 "confirmed": "Подтвержденный баланс",
149 "confirmed_tx": "Подтвержденный",
res/values/strings_th.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "ยืนยันการหักค่าธรรมเนียม",
144 "confirm_fee_deduction_content": "คุณตกลงที่จะหักค่าธรรมเนียมจากผลลัพธ์หรือไม่?",
145 "confirm_sending": "ยืนยันการส่ง",
146 - "confirm_silent_payments_switch_node": "ขณะนี้จำเป็นต้องเปลี่ยนโหนดเพื่อสแกนการชำระเงินแบบเงียบ",
146 + "confirm_silent_payments_switch_node": "โหนดปัจจุบันของคุณไม่รองรับการชำระเงินแบบเงียบ \\ ncake กระเป๋าเงินจะเปลี่ยนเป็นโหนดที่เข้ากันได้เพียงเพื่อการสแกน",
147 "confirmations": "การยืนยัน",
148 "confirmed": "ยอดคงเหลือที่ยืนยันแล้ว",
149 "confirmed_tx": "ซึ่งยืนยันแล้ว",
res/values/strings_tl.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Kumpirmahin ang pagbabawas ng bayad",
144 "confirm_fee_deduction_content": "Sumasang -ayon ka bang bawasan ang bayad mula sa output?",
145 "confirm_sending": "Kumpirmahin ang pagpapadala",
146 - "confirm_silent_payments_switch_node": "Sa kasalukuyan kinakailangan itong lumipat ng mga node upang i -scan ang mga tahimik na pagbabayad",
146 + "confirm_silent_payments_switch_node": "Ang iyong kasalukuyang node ay hindi sumusuporta sa tahimik na pagbabayad \\ ncake wallet ay lilipat sa isang katugmang node, para lamang sa pag -scan",
147 "confirmations": "Mga kumpirmasyon",
148 "confirmed": "Nakumpirma na balanse",
149 "confirmed_tx": "Nakumpirma",
res/values/strings_tr.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Ücret kesintisini onaylayın",
144 "confirm_fee_deduction_content": "Ücreti çıktıdan düşürmeyi kabul ediyor musunuz?",
145 "confirm_sending": "Göndermeyi onayla",
146 - "confirm_silent_payments_switch_node": "Şu anda sessiz ödemeleri taramak için düğümleri değiştirmek gerekiyor",
146 + "confirm_silent_payments_switch_node": "Mevcut düğümünüz sessiz ödemeleri desteklemiyor \\ nCake cüzdanı, sadece tarama için uyumlu bir düğüme geçecektir",
147 "confirmations": "Onay",
148 "confirmed": "Onaylanmış Bakiye",
149 "confirmed_tx": "Onaylanmış",
res/values/strings_uk.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Підтвердьте відрахування комісії",
144 "confirm_fee_deduction_content": "Чи погоджуєтесь ви вирахувати комісію з сумми одержувача?",
145 "confirm_sending": "Підтвердити відправлення",
146 - "confirm_silent_payments_switch_node": "В даний час потрібно перемикати вузли на сканування мовчазних платежів",
146 + "confirm_silent_payments_switch_node": "Ваш поточний вузол не підтримує мовчазні платежі \\ ncake Wallet перейде на сумісний вузол, лише для сканування",
147 "confirmations": "Підтвердження",
148 "confirmed": "Підтверджений баланс",
149 "confirmed_tx": "Підтверджений",
res/values/strings_ur.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "فیس میں کٹوتی کی تصدیق کریں",
144 "confirm_fee_deduction_content": "کیا آپ آؤٹ پٹ سے فیس کم کرنے پر راضی ہیں؟",
145 "confirm_sending": "بھیجنے کی تصدیق کریں۔",
146 - "confirm_silent_payments_switch_node": "فی الحال خاموش ادائیگیوں کو اسکین کرنے کے لئے نوڈس کو تبدیل کرنے کی ضرورت ہے",
146 + "confirm_silent_payments_switch_node": "آپ کا موجودہ نوڈ خاموش ادائیگیوں کی حمایت نہیں کرتا ہے۔",
147 "confirmations": "تصدیقات",
148 "confirmed": "تصدیق شدہ بیلنس",
149 "confirmed_tx": "تصدیق",
res/values/strings_yo.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "Jẹrisi iyọkuro owo",
144 "confirm_fee_deduction_content": "Ṣe o gba lati yọkuro idiyele naa kuro ni iṣejade?",
145 "confirm_sending": "Jẹ́rìí sí ránṣẹ́",
146 - "confirm_silent_payments_switch_node": "Lọwọlọwọ o nilo lati yi awọn apa pada si awọn sisanwo ipalọlọ",
146 + "confirm_silent_payments_switch_node": "Ilode rẹ ti lọwọlọwọ ko ṣe atilẹyin awọn sisanwo ti o dakẹ \\ owet apamọwọ yoo yipada si oju-ọrọ ibaramu, o kan fun Scning",
147 "confirmations": "Àwọn ẹ̀rí",
148 "confirmed": "A ti jẹ́rìí ẹ̀",
149 "confirmed_tx": "Jẹrisi",
res/values/strings_zh.arb
+1 -1
@@ -143,7 +143,7 @@
143 "confirm_fee_deduction": "确认费用扣除",
144 "confirm_fee_deduction_content": "您是否同意从产出中扣除费用?",
145 "confirm_sending": "确认发送",
146 - "confirm_silent_payments_switch_node": "目前需要切换节点来扫描无声付款",
146 + "confirm_silent_payments_switch_node": "您当前的节点不支持无声付款\\ ncake钱包将切换到兼容节点,仅用于扫描",
147 "confirmations": "确认",
148 "confirmed": "确认余额",
149 "confirmed_tx": "确认的",
tool/append_translation.dart
+2
@@ -2,6 +2,8 @@ import 'utils/translation/arb_file_utils.dart';
2 import 'utils/translation/translation_constants.dart';
3 import 'utils/translation/translation_utils.dart';
4
5 +/// flutter packages pub run tool/append_translation.dart "hello_world" "Hello World!"
6 +
7 void main(List<String> args) async {
8 if (args.length != 2) {
9 throw Exception(