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(