WIP: CW-665 Implement AirGapped Monero Transactions (#1535)

* replace qr scanner with fast_scanner * bump java version * fix qr code scanning * add flashlight and camera switch * airgap work * commitTransactionUR * bump fast_scanner, fix configure script * add option to restore wallet from NERO qr format * fixes to the flow and logic use gsed or otherwise it fails? * remove Expanded() to fix URQR on release builds * cache key to allow app updates * rename cache key * [skip ci] cache key.jks in cache_dependencies * update fast_scanner to work on ios, with light mlkit dependency * ui fixes * error handling fix * update fast_scanner to drop iOS dependency * changes from review * Update lib/entities/qr_scanner.dart * changes from review * remove useless commit * don't set state multiple times remove return Container() for non monero wallets * return on fail don't handle empty qr codes * set node as trusted display primary address in seed screen * fix wow and haven * migrate node to trusted * - update trusted node for existing users - update locales - fix conflicts - move menu item --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

cyan committed Nov 9, 2024 at 19:59 UTC cea3084bb320dde27fbdbb78fba579311b58b704
84 files changed +1318 -141
.github/workflows/cache_dependencies.yml
+1 -2
@@ -62,10 +62,9 @@ jobs:
62 /opt/android/cake_wallet/cw_haven/android/.cxx
63 /opt/android/cake_wallet/scripts/monero_c/release
64 key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
65 -
65 - if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
66 name: Generate Externals
67 run: |
68 cd /opt/android/cake_wallet/scripts/android/
69 source ./app_env.sh cakewallet
71 - ./build_monero_all.sh
70 + ./build_monero_all.sh
\ No newline at end of file
.github/workflows/pr_test_build_android.yml
+3 -1
@@ -82,7 +82,8 @@ jobs:
82 path: |
83 /opt/android/cake_wallet/cw_haven/android/.cxx
84 /opt/android/cake_wallet/scripts/monero_c/release
85 - key: ${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
85 + /opt/android/cake_wallet/android/app/key.jks
86 + key: android_${{ hashFiles('**/prepare_moneroc.sh' ,'**/build_monero_all.sh' ,'**/cache_dependencies.yml') }}
87
88 - if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
89 name: Generate Externals
@@ -116,6 +117,7 @@ jobs:
117 ./build_mwebd.sh --dont-install
118
119 - name: Generate KeyStore
120 + if: ${{ steps.cache-externals.outputs.cache-hit != 'true' }}
121 run: |
122 cd /opt/android/cake_wallet/android/app
123 keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias testKey -noprompt -dname "CN=CakeWallet, OU=CakeWallet, O=CakeWallet, L=Florida, S=America, C=USA" -storepass $STORE_PASS -keypass $KEY_PASS
android/app/build.gradle
+5
@@ -92,3 +92,8 @@ dependencies {
92 androidTestImplementation 'androidx.test:runner:1.3.0'
93 androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
94 }
95 +configurations {
96 + implementation.exclude module:'proto-google-common-protos'
97 + implementation.exclude module:'protolite-well-known-types'
98 + implementation.exclude module:'protobuf-javalite'
99 +}
\ No newline at end of file
android/gradle.properties
+1 -1
@@ -1,4 +1,4 @@
1 -org.gradle.jvmargs=-Xmx1536M
1 +org.gradle.jvmargs=-Xmx3072M
2 android.enableR8=true
3 android.useAndroidX=true
4 android.enableJetifier=true
assets/node_list.yml
+1
@@ -1,6 +1,7 @@
1 -
2 uri: xmr-node.cakewallet.com:18081
3 is_default: true
4 + trusted: true
5 -
6 uri: cakexmrl7bonq7ovjka5kuwuyd3f7qnkz6z6s6dmsy3uckwra7bvggyd.onion:18081
7 is_default: false
cw_bitcoin/lib/pending_bitcoin_transaction.dart
+5
@@ -153,4 +153,9 @@ class PendingBitcoinTransaction with PendingTransaction {
153 inputAddresses: _tx.inputs.map((input) => input.txId).toList(),
154 outputAddresses: outputAddresses,
155 fee: fee);
156 +
157 + @override
158 + Future<String?> commitUR() {
159 + throw UnimplementedError();
160 + }
161 }
cw_bitcoin_cash/lib/src/pending_bitcoin_cash_transaction.dart
+4
@@ -85,4 +85,8 @@ class PendingBitcoinCashTransaction with PendingTransaction {
85 fee: fee,
86 isReplaced: false,
87 );
88 + @override
89 + Future<String?> commitUR() {
90 + throw UnimplementedError();
91 + }
92 }
cw_core/lib/monero_wallet_keys.dart
+3 -1
@@ -1,10 +1,12 @@
1 class MoneroWalletKeys {
2 const MoneroWalletKeys(
3 - {required this.privateSpendKey,
3 + {required this.primaryAddress,
4 + required this.privateSpendKey,
5 required this.privateViewKey,
6 required this.publicSpendKey,
7 required this.publicViewKey});
8
9 + final String primaryAddress;
10 final String publicViewKey;
11 final String privateViewKey;
12 final String publicSpendKey;
cw_core/lib/pending_transaction.dart
+3
@@ -14,5 +14,8 @@ mixin PendingTransaction {
14 int? get outputCount => null;
15 PendingChange? change;
16
17 + bool shouldCommitUR() => false;
18 +
19 Future<void> commit();
20 + Future<String?> commitUR();
21 }
cw_evm/lib/pending_evm_chain_transaction.dart
+5
@@ -47,4 +47,9 @@ class PendingEVMChainTransaction with PendingTransaction {
47
48 return '0x${Hex.HEX.encode(txid)}';
49 }
50 +
51 + @override
52 + Future<String?> commitUR() {
53 + throw UnimplementedError();
54 + }
55 }
cw_haven/lib/api/exceptions/wallet_restore_from_keys_exception.dart
+5
@@ -2,4 +2,9 @@ class WalletRestoreFromKeysException implements Exception {
2 WalletRestoreFromKeysException({required this.message});
3
4 final String message;
5 +
6 + @override
7 + String toString() {
8 + return message;
9 + }
10 }
\ No newline at end of file
cw_haven/lib/haven_wallet.dart
+1
@@ -73,6 +73,7 @@ abstract class HavenWalletBase
73
74 @override
75 MoneroWalletKeys get keys => MoneroWalletKeys(
76 + primaryAddress: haven_wallet.getAddress(accountIndex: 0, addressIndex: 0),
77 privateSpendKey: haven_wallet.getSecretSpendKey(),
78 privateViewKey: haven_wallet.getSecretViewKey(),
79 publicSpendKey: haven_wallet.getPublicSpendKey(),
cw_haven/lib/pending_haven_transaction.dart
+5
@@ -48,4 +48,9 @@ class PendingHavenTransaction with PendingTransaction {
48 rethrow;
49 }
50 }
51 +
52 + @override
53 + Future<String?> commitUR() {
54 + throw UnimplementedError();
55 + }
56 }
cw_monero/lib/api/account_list.dart
+1
@@ -2,6 +2,7 @@ import 'package:cw_monero/api/wallet.dart';
2 import 'package:monero/monero.dart' as monero;
3
4 monero.wallet? wptr = null;
5 +bool get isViewOnly => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;
6
7 int _wlptrForW = 0;
8 monero.WalletListener? _wlptr = null;
cw_monero/lib/api/transaction_history.dart
+18 -6
@@ -13,7 +13,13 @@ import 'package:mutex/mutex.dart';
13
14
15 String getTxKey(String txId) {
16 - return monero.Wallet_getTxKey(wptr!, txid: txId);
16 + final txKey = monero.Wallet_getTxKey(wptr!, txid: txId);
17 + final status = monero.Wallet_status(wptr!);
18 + if (status != 0) {
19 + final error = monero.Wallet_errorString(wptr!);
20 + return txId+"_"+error;
21 + }
22 + return txKey;
23 }
24 final txHistoryMutex = Mutex();
25 monero.TransactionHistory? txhistory;
@@ -178,12 +184,13 @@ PendingTransactionDescription createTransactionMultDestSync(
184 );
185 }
186
181 -void commitTransactionFromPointerAddress({required int address}) =>
182 - commitTransaction(transactionPointer: monero.PendingTransaction.fromAddress(address));
187 +String? commitTransactionFromPointerAddress({required int address, required bool useUR}) =>
188 + commitTransaction(transactionPointer: monero.PendingTransaction.fromAddress(address), useUR: useUR);
189
184 -void commitTransaction({required monero.PendingTransaction transactionPointer}) {
185 -
186 - final txCommit = monero.PendingTransaction_commit(transactionPointer, filename: '', overwrite: false);
190 +String? commitTransaction({required monero.PendingTransaction transactionPointer, required bool useUR}) {
191 + final txCommit = useUR
192 + ? monero.PendingTransaction_commitUR(transactionPointer, 120)
193 + : monero.PendingTransaction_commit(transactionPointer, filename: '', overwrite: false);
194
195 final String? error = (() {
196 final status = monero.PendingTransaction_status(transactionPointer.cast());
@@ -196,6 +203,11 @@ void commitTransaction({required monero.PendingTransaction transactionPointer})
203 if (error != null) {
204 throw CreationTransactionException(message: error);
205 }
206 + if (useUR) {
207 + return txCommit as String?;
208 + } else {
209 + return null;
210 + }
211 }
212
213 Future<PendingTransactionDescription> _createTransactionSync(Map args) async {
cw_monero/lib/api/wallet_manager.dart
+2
@@ -425,3 +425,5 @@ Future<void> restoreFromSpendKey(
425 });
426
427 bool isWalletExist({required String path}) => _isWalletExist(path);
428 +
429 +bool isViewOnlyBySpendKey() => int.tryParse(monero.Wallet_secretSpendKey(wptr!)) == 0;
\ No newline at end of file
cw_monero/lib/monero_wallet.dart
+32
@@ -19,6 +19,7 @@ import 'package:cw_core/transaction_direction.dart';
19 import 'package:cw_core/unspent_coins_info.dart';
20 import 'package:cw_core/wallet_base.dart';
21 import 'package:cw_core/wallet_info.dart';
22 +import 'package:cw_monero/api/account_list.dart';
23 import 'package:cw_monero/api/coins_info.dart';
24 import 'package:cw_monero/api/monero_output.dart';
25 import 'package:cw_monero/api/structs/pending_transaction.dart';
@@ -121,6 +122,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
122
123 @override
124 MoneroWalletKeys get keys => MoneroWalletKeys(
125 + primaryAddress: monero_wallet.getAddress(accountIndex: 0, addressIndex: 0),
126 privateSpendKey: monero_wallet.getSecretSpendKey(),
127 privateViewKey: monero_wallet.getSecretViewKey(),
128 publicSpendKey: monero_wallet.getPublicSpendKey(),
@@ -230,6 +232,36 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
232 }
233 }
234
235 + Future<bool> submitTransactionUR(String ur) async {
236 + final retStatus = monero.Wallet_submitTransactionUR(wptr!, ur);
237 + final status = monero.Wallet_status(wptr!);
238 + if (status != 0) {
239 + final err = monero.Wallet_errorString(wptr!);
240 + throw MoneroTransactionCreationException("unable to broadcast signed transaction: $err");
241 + }
242 + return retStatus;
243 + }
244 +
245 + bool importKeyImagesUR(String ur) {
246 + final retStatus = monero.Wallet_importKeyImagesUR(wptr!, ur);
247 + final status = monero.Wallet_status(wptr!);
248 + if (status != 0) {
249 + final err = monero.Wallet_errorString(wptr!);
250 + throw Exception("unable to import key images: $err");
251 + }
252 + return retStatus;
253 + }
254 +
255 + String exportOutputsUR(bool all) {
256 + final str = monero.Wallet_exportOutputsUR(wptr!, all: all);
257 + final status = monero.Wallet_status(wptr!);
258 + if (status != 0) {
259 + final err = monero.Wallet_errorString(wptr!);
260 + throw MoneroTransactionCreationException("unable to export UR: $err");
261 + }
262 + return str;
263 + }
264 +
265 @override
266 Future<PendingTransaction> createTransaction(Object credentials) async {
267 final _credentials = credentials as MoneroTransactionCreationCredentials;
cw_monero/lib/pending_monero_transaction.dart
+23 -1
@@ -1,3 +1,4 @@
1 +import 'package:cw_monero/api/account_list.dart';
2 import 'package:cw_monero/api/structs/pending_transaction.dart';
3 import 'package:cw_monero/api/transaction_history.dart'
4 as monero_transaction_history;
@@ -35,11 +36,32 @@ class PendingMoneroTransaction with PendingTransaction {
36 String get feeFormatted => AmountConverter.amountIntToString(
37 CryptoCurrency.xmr, pendingTransactionDescription.fee);
38
39 + bool shouldCommitUR() => isViewOnly;
40 +
41 @override
42 Future<void> commit() async {
43 try {
44 monero_transaction_history.commitTransactionFromPointerAddress(
42 - address: pendingTransactionDescription.pointerAddress);
45 + address: pendingTransactionDescription.pointerAddress,
46 + useUR: false);
47 + } catch (e) {
48 + final message = e.toString();
49 +
50 + if (message.contains('Reason: double spend')) {
51 + throw DoubleSpendException();
52 + }
53 +
54 + rethrow;
55 + }
56 + }
57 +
58 + @override
59 + Future<String?> commitUR() async {
60 + try {
61 + final ret = monero_transaction_history.commitTransactionFromPointerAddress(
62 + address: pendingTransactionDescription.pointerAddress,
63 + useUR: true);
64 + return ret;
65 } catch (e) {
66 final message = e.toString();
67
cw_nano/lib/pending_nano_transaction.dart
+5
@@ -37,4 +37,9 @@ class PendingNanoTransaction with PendingTransaction {
37 await nanoClient.processBlock(block, "send");
38 }
39 }
40 +
41 + @override
42 + Future<String?> commitUR() {
43 + throw UnimplementedError();
44 + }
45 }
cw_shared_external/pubspec.lock new
+189
@@ -0,0 +1,189 @@
1 +# Generated by pub
2 +# See https://dart.dev/tools/pub/glossary#lockfile
3 +packages:
4 + async:
5 + dependency: transitive
6 + description:
7 + name: async
8 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
9 + url: "https://pub.dev"
10 + source: hosted
11 + version: "2.11.0"
12 + boolean_selector:
13 + dependency: transitive
14 + description:
15 + name: boolean_selector
16 + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
17 + url: "https://pub.dev"
18 + source: hosted
19 + version: "2.1.1"
20 + characters:
21 + dependency: transitive
22 + description:
23 + name: characters
24 + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
25 + url: "https://pub.dev"
26 + source: hosted
27 + version: "1.3.0"
28 + clock:
29 + dependency: transitive
30 + description:
31 + name: clock
32 + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
33 + url: "https://pub.dev"
34 + source: hosted
35 + version: "1.1.1"
36 + collection:
37 + dependency: transitive
38 + description:
39 + name: collection
40 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
41 + url: "https://pub.dev"
42 + source: hosted
43 + version: "1.18.0"
44 + fake_async:
45 + dependency: transitive
46 + description:
47 + name: fake_async
48 + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
49 + url: "https://pub.dev"
50 + source: hosted
51 + version: "1.3.1"
52 + flutter:
53 + dependency: "direct main"
54 + description: flutter
55 + source: sdk
56 + version: "0.0.0"
57 + flutter_test:
58 + dependency: "direct dev"
59 + description: flutter
60 + source: sdk
61 + version: "0.0.0"
62 + leak_tracker:
63 + dependency: transitive
64 + description:
65 + name: leak_tracker
66 + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
67 + url: "https://pub.dev"
68 + source: hosted
69 + version: "10.0.4"
70 + leak_tracker_flutter_testing:
71 + dependency: transitive
72 + description:
73 + name: leak_tracker_flutter_testing
74 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
75 + url: "https://pub.dev"
76 + source: hosted
77 + version: "3.0.3"
78 + leak_tracker_testing:
79 + dependency: transitive
80 + description:
81 + name: leak_tracker_testing
82 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
83 + url: "https://pub.dev"
84 + source: hosted
85 + version: "3.0.1"
86 + matcher:
87 + dependency: transitive
88 + description:
89 + name: matcher
90 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
91 + url: "https://pub.dev"
92 + source: hosted
93 + version: "0.12.16+1"
94 + material_color_utilities:
95 + dependency: transitive
96 + description:
97 + name: material_color_utilities
98 + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
99 + url: "https://pub.dev"
100 + source: hosted
101 + version: "0.8.0"
102 + meta:
103 + dependency: transitive
104 + description:
105 + name: meta
106 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
107 + url: "https://pub.dev"
108 + source: hosted
109 + version: "1.12.0"
110 + path:
111 + dependency: transitive
112 + description:
113 + name: path
114 + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
115 + url: "https://pub.dev"
116 + source: hosted
117 + version: "1.9.0"
118 + sky_engine:
119 + dependency: transitive
120 + description: flutter
121 + source: sdk
122 + version: "0.0.99"
123 + source_span:
124 + dependency: transitive
125 + description:
126 + name: source_span
127 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
128 + url: "https://pub.dev"
129 + source: hosted
130 + version: "1.10.0"
131 + stack_trace:
132 + dependency: transitive
133 + description:
134 + name: stack_trace
135 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
136 + url: "https://pub.dev"
137 + source: hosted
138 + version: "1.11.1"
139 + stream_channel:
140 + dependency: transitive
141 + description:
142 + name: stream_channel
143 + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
144 + url: "https://pub.dev"
145 + source: hosted
146 + version: "2.1.2"
147 + string_scanner:
148 + dependency: transitive
149 + description:
150 + name: string_scanner
151 + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
152 + url: "https://pub.dev"
153 + source: hosted
154 + version: "1.2.0"
155 + term_glyph:
156 + dependency: transitive
157 + description:
158 + name: term_glyph
159 + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
160 + url: "https://pub.dev"
161 + source: hosted
162 + version: "1.2.1"
163 + test_api:
164 + dependency: transitive
165 + description:
166 + name: test_api
167 + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
168 + url: "https://pub.dev"
169 + source: hosted
170 + version: "0.7.0"
171 + vector_math:
172 + dependency: transitive
173 + description:
174 + name: vector_math
175 + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
176 + url: "https://pub.dev"
177 + source: hosted
178 + version: "2.1.4"
179 + vm_service:
180 + dependency: transitive
181 + description:
182 + name: vm_service
183 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
184 + url: "https://pub.dev"
185 + source: hosted
186 + version: "14.2.1"
187 +sdks:
188 + dart: ">=3.3.0 <4.0.0"
189 + flutter: ">=3.18.0-18.0.pre.54"
cw_solana/lib/pending_solana_transaction.dart
+5
@@ -40,4 +40,9 @@ class PendingSolanaTransaction with PendingTransaction {
40
41 @override
42 String get id => '';
43 +
44 + @override
45 + Future<String?> commitUR() {
46 + throw UnimplementedError();
47 + }
48 }
cw_tron/lib/pending_tron_transaction.dart
+5
@@ -30,4 +30,9 @@ class PendingTronTransaction with PendingTransaction {
30
31 @override
32 String get id => '';
33 +
34 + @override
35 + Future<String?> commitUR() {
36 + throw UnimplementedError();
37 + }
38 }
cw_wownero/lib/api/exceptions/wallet_restore_from_keys_exception.dart
+1
@@ -3,5 +3,6 @@ class WalletRestoreFromKeysException implements Exception {
3
4 final String message;
5
6 + @override
7 String toString() => message;
8 }
\ No newline at end of file
cw_wownero/lib/pending_wownero_transaction.dart
+5
@@ -50,4 +50,9 @@ class PendingWowneroTransaction with PendingTransaction {
50 rethrow;
51 }
52 }
53 +
54 + @override
55 + Future<String?> commitUR() {
56 + throw UnimplementedError();
57 + }
58 }
cw_wownero/lib/wownero_wallet.dart
+1
@@ -120,6 +120,7 @@ abstract class WowneroWalletBase
120
121 @override
122 MoneroWalletKeys get keys => MoneroWalletKeys(
123 + primaryAddress: wownero_wallet.getAddress(accountIndex: 0, addressIndex: 0),
124 privateSpendKey: wownero_wallet.getSecretSpendKey(),
125 privateViewKey: wownero_wallet.getSecretViewKey(),
126 publicSpendKey: wownero_wallet.getPublicSpendKey(),
lib/di.dart
+7
@@ -125,6 +125,7 @@ import 'package:cake_wallet/src/screens/subaddress/address_edit_or_create_page.d
125 import 'package:cake_wallet/src/screens/support/support_page.dart';
126 import 'package:cake_wallet/src/screens/support_chat/support_chat_page.dart';
127 import 'package:cake_wallet/src/screens/support_other_links/support_other_links_page.dart';
128 +import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart';
129 import 'package:cake_wallet/src/screens/wallet/wallet_edit_page.dart';
130 import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
131 import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart';
@@ -134,6 +135,7 @@ import 'package:cake_wallet/utils/device_info.dart';
135 import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
136 import 'package:cake_wallet/utils/payment_request.dart';
137 import 'package:cake_wallet/utils/responsive_layout_util.dart';
138 +import 'package:cake_wallet/view_model/animated_ur_model.dart';
139 import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
140 import 'package:cake_wallet/view_model/anon_invoice_page_view_model.dart';
141 import 'package:cake_wallet/view_model/anonpay_details_view_model.dart';
@@ -903,6 +905,11 @@ Future<void> setup({
905 getIt.registerFactory(() => WalletKeysViewModel(getIt.get<AppStore>()));
906
907 getIt.registerFactory(() => WalletKeysPage(getIt.get<WalletKeysViewModel>()));
908 +
909 + getIt.registerFactory(() => AnimatedURModel(getIt.get<AppStore>()));
910 +
911 + getIt.registerFactoryParam<AnimatedURPage, String, void>((String urQr, _) =>
912 + AnimatedURPage(getIt.get<AnimatedURModel>(), urQr: urQr));
913
914 getIt.registerFactoryParam<ContactViewModel, ContactRecord?, void>(
915 (ContactRecord? contact, _) => ContactViewModel(_contactSource, contact: contact));
lib/entities/default_settings_migration.dart
+14 -1
@@ -259,6 +259,10 @@ Future<void> defaultSettingsMigration(
259 case 42:
260 updateBtcElectrumNodeToUseSSL(nodes, sharedPreferences);
261 break;
262 + case 43:
263 + _updateCakeXmrNode(nodes);
264 + break;
265 +
266 default:
267 break;
268 }
@@ -273,6 +277,15 @@ Future<void> defaultSettingsMigration(
277 await sharedPreferences.setInt(PreferencesKey.currentDefaultSettingsMigrationVersion, version);
278 }
279
280 +void _updateCakeXmrNode(Box<Node> nodes) {
281 + final node = nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletMoneroUri);
282 +
283 + if (node != null && !node.trusted) {
284 + node.trusted = true;
285 + node.save();
286 + }
287 +}
288 +
289 void updateBtcElectrumNodeToUseSSL(Box<Node> nodes, SharedPreferences sharedPreferences) {
290 final btcElectrumNode = nodes.values.firstWhereOrNull((element) => element.uriRaw == newCakeWalletBitcoinUri);
291
@@ -843,7 +856,7 @@ Future<void> changeDefaultMoneroNode(
856 }
857 });
858
846 - final newCakeWalletNode = Node(uri: newCakeWalletMoneroUri, type: WalletType.monero);
859 + final newCakeWalletNode = Node(uri: newCakeWalletMoneroUri, type: WalletType.monero, trusted: true);
860
861 await nodeSource.add(newCakeWalletNode);
862
lib/entities/qr_scanner.dart
+365 -4
@@ -1,15 +1,376 @@
1 -import 'package:barcode_scan2/barcode_scan2.dart';
1 +import 'dart:math';
2 +
3 +import 'package:cake_wallet/generated/i18n.dart';
4 +import 'package:cake_wallet/main.dart';
5 +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
6 +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
7 +import 'package:cake_wallet/utils/show_pop_up.dart';
8 +import 'package:fast_scanner/fast_scanner.dart';
9 +import 'package:flutter/material.dart';
10 +import 'package:flutter/scheduler.dart';
11
12 var isQrScannerShown = false;
13
5 -Future<String> presentQRScanner() async {
14 +Future<String> presentQRScanner(BuildContext context) async {
15 isQrScannerShown = true;
16 try {
8 - final result = await BarcodeScanner.scan();
17 + final result = await Navigator.of(context).push<String>(
18 + MaterialPageRoute(
19 + builder:(context) {
20 + return BarcodeScannerSimple();
21 + },
22 + ),
23 + );
24 isQrScannerShown = false;
10 - return result.rawContent.trim();
25 + return result??'';
26 } catch (e) {
27 isQrScannerShown = false;
28 rethrow;
29 }
30 }
31 +
32 +// https://github.com/MrCyjaneK/fast_scanner/blob/master/example/lib/barcode_scanner_simple.dart
33 +class BarcodeScannerSimple extends StatefulWidget {
34 + const BarcodeScannerSimple({super.key});
35 +
36 + @override
37 + State<BarcodeScannerSimple> createState() => _BarcodeScannerSimpleState();
38 +}
39 +
40 +class _BarcodeScannerSimpleState extends State<BarcodeScannerSimple> {
41 + Barcode? _barcode;
42 + bool popped = false;
43 +
44 + List<String> urCodes = [];
45 + late var ur = URQRToURQRData(urCodes);
46 +
47 + void _handleBarcode(BarcodeCapture barcodes) {
48 + try {
49 + _handleBarcodeInternal(barcodes);
50 + } catch (e) {
51 + showPopUp<void>(
52 + context: context,
53 + builder: (context) {
54 + return AlertWithOneAction(
55 + alertTitle: S.of(context).error,
56 + alertContent: S.of(context).error_dialog_content,
57 + buttonText: 'ok',
58 + buttonAction: () {
59 + Navigator.of(context).pop();
60 + },
61 + );
62 + },
63 + );
64 + print(e);
65 + }
66 + }
67 +
68 + void _handleBarcodeInternal(BarcodeCapture barcodes) {
69 + for (final barcode in barcodes.barcodes) {
70 + // don't handle unknown QR codes
71 + if (barcode.rawValue?.trim().isEmpty??false == false) continue;
72 + if (barcode.rawValue!.startsWith("ur:")) {
73 + if (urCodes.contains(barcode.rawValue)) continue;
74 + setState(() {
75 + urCodes.add(barcode.rawValue!);
76 + ur = URQRToURQRData(urCodes);
77 + });
78 + if (ur.progress == 1) {
79 + setState(() {
80 + popped = true;
81 + });
82 + SchedulerBinding.instance.addPostFrameCallback((_) {
83 + Navigator.of(context).pop(ur.inputs.join("\n"));
84 + });
85 + };
86 + }
87 + }
88 + if (urCodes.isNotEmpty) return;
89 + if (mounted) {
90 + setState(() {
91 + _barcode = barcodes.barcodes.firstOrNull;
92 + });
93 + if (_barcode != null && popped != true) {
94 + setState(() {
95 + popped = true;
96 + });
97 + SchedulerBinding.instance.addPostFrameCallback((_) {
98 + Navigator.of(context).pop(_barcode?.rawValue ?? "");
99 + });
100 + }
101 + }
102 + }
103 +
104 + final MobileScannerController ctrl = MobileScannerController();
105 +
106 + @override
107 + Widget build(BuildContext context) {
108 + return Scaffold(
109 + appBar: AppBar(
110 + title: const Text('Scan'),
111 + actions: [
112 + SwitchCameraButton(controller: ctrl),
113 + ToggleFlashlightButton(controller: ctrl),
114 + ],
115 + ),
116 + backgroundColor: Colors.black,
117 + body: Stack(
118 + children: [
119 + MobileScanner(
120 + onDetect: _handleBarcode,
121 + controller: ctrl,
122 + ),
123 + if (ur.inputs.length != 0)
124 + Center(child:
125 + Text(
126 + "${ur.inputs.length}/${ur.count}",
127 + style: Theme.of(context).textTheme.displayLarge?.copyWith(color: Colors.white)
128 + ),
129 + ),
130 + SizedBox(
131 + child: Center(
132 + child: SizedBox(
133 + width: 250,
134 + height: 250,
135 + child: CustomPaint(
136 + painter: ProgressPainter(
137 + urQrProgress: URQrProgress(
138 + expectedPartCount: ur.count - 1,
139 + processedPartsCount: ur.inputs.length,
140 + receivedPartIndexes: _urParts(),
141 + percentage: ur.progress,
142 + ),
143 + ),
144 + ),
145 + ),
146 + ),
147 + ),
148 + ],
149 + ),
150 + );
151 + }
152 +
153 + List<int> _urParts() {
154 + List<int> l = [];
155 + for (var inp in ur.inputs) {
156 + try {
157 + l.add(int.parse(inp.split("/")[1].split("-")[0]));
158 + } catch (e) {}
159 + }
160 + return l;
161 + }
162 +}
163 +
164 +
165 +class ToggleFlashlightButton extends StatelessWidget {
166 + const ToggleFlashlightButton({required this.controller, super.key});
167 +
168 + final MobileScannerController controller;
169 +
170 + @override
171 + Widget build(BuildContext context) {
172 + return ValueListenableBuilder(
173 + valueListenable: controller,
174 + builder: (context, state, child) {
175 + if (!state.isInitialized || !state.isRunning) {
176 + return const SizedBox.shrink();
177 + }
178 +
179 + switch (state.torchState) {
180 + case TorchState.auto:
181 + return IconButton(
182 + iconSize: 32.0,
183 + icon: const Icon(Icons.flash_auto),
184 + onPressed: () async {
185 + await controller.toggleTorch();
186 + },
187 + );
188 + case TorchState.off:
189 + return IconButton(
190 + iconSize: 32.0,
191 + icon: const Icon(Icons.flash_off),
192 + onPressed: () async {
193 + await controller.toggleTorch();
194 + },
195 + );
196 + case TorchState.on:
197 + return IconButton(
198 + iconSize: 32.0,
199 + icon: const Icon(Icons.flash_on),
200 + onPressed: () async {
201 + await controller.toggleTorch();
202 + },
203 + );
204 + case TorchState.unavailable:
205 + return const Icon(
206 + Icons.no_flash,
207 + color: Colors.grey,
208 + );
209 + }
210 + },
211 + );
212 + }
213 +}
214 +
215 +class SwitchCameraButton extends StatelessWidget {
216 + const SwitchCameraButton({required this.controller, super.key});
217 +
218 + final MobileScannerController controller;
219 +
220 + @override
221 + Widget build(BuildContext context) {
222 + return ValueListenableBuilder(
223 + valueListenable: controller,
224 + builder: (context, state, child) {
225 + if (!state.isInitialized || !state.isRunning) {
226 + return const SizedBox.shrink();
227 + }
228 +
229 + final int? availableCameras = state.availableCameras;
230 +
231 + if (availableCameras != null && availableCameras < 2) {
232 + return const SizedBox.shrink();
233 + }
234 +
235 + final Widget icon;
236 +
237 + switch (state.cameraDirection) {
238 + case CameraFacing.front:
239 + icon = const Icon(Icons.camera_front);
240 + case CameraFacing.back:
241 + icon = const Icon(Icons.camera_rear);
242 + }
243 +
244 + return IconButton(
245 + iconSize: 32.0,
246 + icon: icon,
247 + onPressed: () async {
248 + await controller.switchCamera();
249 + },
250 + );
251 + },
252 + );
253 + }
254 +}
255 +
256 +class URQRData {
257 + URQRData(
258 + {required this.tag,
259 + required this.str,
260 + required this.progress,
261 + required this.count,
262 + required this.error,
263 + required this.inputs});
264 + final String tag;
265 + final String str;
266 + final double progress;
267 + final int count;
268 + final String error;
269 + final List<String> inputs;
270 + Map<String, dynamic> toJson() {
271 + return {
272 + "tag": tag,
273 + "str": str,
274 + "progress": progress,
275 + "count": count,
276 + "error": error,
277 + "inputs": inputs,
278 + };
279 + }
280 +}
281 +
282 +URQRData URQRToURQRData(List<String> urqr_) {
283 + final urqr = urqr_.toSet().toList();
284 + urqr.sort((s1, s2) {
285 + final s1s = s1.split("/");
286 + final s1frameStr = s1s[1].split("-");
287 + final s1curFrame = int.parse(s1frameStr[0]);
288 + final s2s = s2.split("/");
289 + final s2frameStr = s2s[1].split("-");
290 + final s2curFrame = int.parse(s2frameStr[0]);
291 + return s1curFrame - s2curFrame;
292 + });
293 +
294 + String tag = '';
295 + int count = 0;
296 + String bw = '';
297 + for (var elm in urqr) {
298 + final s = elm.substring(elm.indexOf(":") + 1); // strip down ur: prefix
299 + final s2 = s.split("/");
300 + tag = s2[0];
301 + final frameStr = s2[1].split("-");
302 + // final curFrame = int.parse(frameStr[0]);
303 + count = int.parse(frameStr[1]);
304 + final byteWords = s2[2];
305 + bw += byteWords;
306 + }
307 + String? error;
308 +
309 + return URQRData(
310 + tag: tag,
311 + str: bw,
312 + progress: count == 0 ? 0 : (urqr.length / count),
313 + count: count,
314 + error: error ?? "",
315 + inputs: urqr,
316 + );
317 +}
318 +
319 +class ProgressPainter extends CustomPainter {
320 + final URQrProgress urQrProgress;
321 +
322 + ProgressPainter({required this.urQrProgress});
323 +
324 + @override
325 + void paint(Canvas canvas, Size size) {
326 + final c = Offset(size.width / 2.0, size.height / 2.0);
327 + final radius = size.width * 0.9;
328 + final rect = Rect.fromCenter(center: c, width: radius, height: radius);
329 + const fullAngle = 360.0;
330 + var startAngle = 0.0;
331 + for (int i = 0; i < urQrProgress.expectedPartCount.toInt(); i++) {
332 + var sweepAngle =
333 + (1 / urQrProgress.expectedPartCount) * fullAngle * pi / 180.0;
334 + drawSector(canvas, urQrProgress.receivedPartIndexes.contains(i), rect,
335 + startAngle, sweepAngle);
336 + startAngle += sweepAngle;
337 + }
338 + }
339 +
340 + void drawSector(Canvas canvas, bool isActive, Rect rect, double startAngle,
341 + double sweepAngle) {
342 + final paint = Paint()
343 + ..style = PaintingStyle.stroke
344 + ..strokeWidth = 8
345 + ..strokeCap = StrokeCap.round
346 + ..strokeJoin = StrokeJoin.round
347 + ..color = isActive ? const Color(0xffff6600) : Colors.white70;
348 + canvas.drawArc(rect, startAngle, sweepAngle, false, paint);
349 + }
350 +
351 + @override
352 + bool shouldRepaint(covariant ProgressPainter oldDelegate) {
353 + return urQrProgress != oldDelegate.urQrProgress;
354 + }
355 +}
356 +
357 +class URQrProgress {
358 + int expectedPartCount;
359 + int processedPartsCount;
360 + List<int> receivedPartIndexes;
361 + double percentage;
362 +
363 + URQrProgress({
364 + required this.expectedPartCount,
365 + required this.processedPartsCount,
366 + required this.receivedPartIndexes,
367 + required this.percentage,
368 + });
369 +
370 + bool equals(URQrProgress? progress) {
371 + if (progress == null) {
372 + return false;
373 + }
374 + return processedPartsCount == progress.processedPartsCount;
375 + }
376 +}
lib/main.dart
+1 -1
@@ -204,7 +204,7 @@ Future<void> initializeAppConfigs() async {
204 transactionDescriptions: transactionDescriptions,
205 secureStorage: secureStorage,
206 anonpayInvoiceInfo: anonpayInvoiceInfo,
207 - initialMigrationVersion: 42,
207 + initialMigrationVersion: 43,
208 );
209 }
210
lib/monero/cw_monero.dart
+24
@@ -248,6 +248,7 @@ class CWMonero extends Monero {
248 final moneroWallet = wallet as MoneroWallet;
249 final keys = moneroWallet.keys;
250 return <String, String>{
251 + 'primaryAddress': keys.primaryAddress,
252 'privateSpendKey': keys.privateSpendKey,
253 'privateViewKey': keys.privateViewKey,
254 'publicSpendKey': keys.publicSpendKey,
@@ -357,9 +358,32 @@ class CWMonero extends Monero {
358 Future<int> getCurrentHeight() async {
359 return monero_wallet_api.getCurrentHeight();
360 }
361 +
362 + @override
363 + bool importKeyImagesUR(Object wallet, String ur) {
364 + final moneroWallet = wallet as MoneroWallet;
365 + return moneroWallet.importKeyImagesUR(ur);
366 + }
367 +
368 +
369 + @override
370 + Future<bool> commitTransactionUR(Object wallet, String ur) {
371 + final moneroWallet = wallet as MoneroWallet;
372 + return moneroWallet.submitTransactionUR(ur);
373 + }
374 +
375 + @override
376 + String exportOutputsUR(Object wallet, bool all) {
377 + final moneroWallet = wallet as MoneroWallet;
378 + return moneroWallet.exportOutputsUR(all);
379 + }
380
381 @override
382 void monerocCheck() {
383 checkIfMoneroCIsFine();
384 }
385 +
386 + bool isViewOnly() {
387 + return isViewOnlyBySpendKey();
388 + }
389 }
lib/router.dart
+4
@@ -96,6 +96,7 @@ import 'package:cake_wallet/src/screens/transaction_details/rbf_details_page.dar
96 import 'package:cake_wallet/src/screens/transaction_details/transaction_details_page.dart';
97 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
98 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
99 +import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart';
100 import 'package:cake_wallet/src/screens/wallet/wallet_edit_page.dart';
101 import 'package:cake_wallet/src/screens/wallet_connect/wc_connections_listing_view.dart';
102 import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
@@ -732,6 +733,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
733 case Routes.setup2faInfoPage:
734 return MaterialPageRoute<void>(builder: (_) => getIt.get<Setup2FAInfoPage>());
735
736 + case Routes.urqrAnimatedPage:
737 + return MaterialPageRoute<void>(builder: (_) => getIt.get<AnimatedURPage>(param1: settings.arguments));
738 +
739 case Routes.homeSettings:
740 return CupertinoPageRoute<void>(
741 builder: (_) => getIt.get<HomeSettingsPage>(param1: settings.arguments),
lib/routes.dart
+1
@@ -108,6 +108,7 @@ class Routes {
108
109 static const signPage = '/sign_page';
110 static const connectDevices = '/device/connect';
111 + static const urqrAnimatedPage = '/urqr/animated_page';
112 static const walletGroupsDisplayPage = '/wallet_groups_display_page';
113 static const walletGroupDescription = '/wallet_group_description';
114 }
lib/src/screens/cake_pay/cards/cake_pay_confirm_purchase_card_page.dart
+2 -2
@@ -347,8 +347,8 @@ class CakePayBuyCardDetailPage extends BasePage {
347 rightButtonText: S.of(popupContext).send,
348 leftButtonText: S.of(popupContext).cancel,
349 actionRightButton: () async {
350 - Navigator.of(popupContext).pop();
351 - await cakePayPurchaseViewModel.sendViewModel.commitTransaction();
350 + Navigator.of(context).pop();
351 + await cakePayPurchaseViewModel.sendViewModel.commitTransaction(context);
352 },
353 actionLeftButton: () => Navigator.of(popupContext).pop()));
354 },
lib/src/screens/dashboard/widgets/menu_widget.dart
+3 -1
@@ -101,6 +101,9 @@ class MenuWidgetState extends State<MenuWidget> {
101 if (!widget.dashboardViewModel.hasSilentPayments) {
102 items.removeWhere((element) => element.name(context) == S.of(context).silent_payments_settings);
103 }
104 + if (!widget.dashboardViewModel.isMoneroViewOnly) {
105 + items.removeWhere((element) => element.name(context) == S.of(context).export_outputs);
106 + }
107 if (!widget.dashboardViewModel.hasMweb) {
108 items.removeWhere((element) => element.name(context) == S.of(context).litecoin_mweb_settings);
109 }
@@ -189,7 +192,6 @@ class MenuWidgetState extends State<MenuWidget> {
192 index--;
193
194 final item = items[index];
192 -
195 final isLastTile = index == itemCount - 1;
196
197 return SettingActionButton(
lib/src/screens/exchange_trade/exchange_trade_page.dart
+1 -1
@@ -277,7 +277,7 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
277 actionRightButton: () async {
278 Navigator.of(popupContext).pop();
279 await widget.exchangeTradeViewModel.sendViewModel
280 - .commitTransaction();
280 + .commitTransaction(context);
281 transactionStatePopup();
282 },
283 actionLeftButton: () => Navigator.of(popupContext).pop(),
lib/src/screens/send/send_page.dart
+1 -1
@@ -498,7 +498,7 @@ class SendPage extends BasePage {
498 ValueKey('send_page_confirm_sending_dialog_cancel_button_key'),
499 actionRightButton: () async {
500 Navigator.of(_dialogContext).pop();
501 - sendViewModel.commitTransaction();
501 + sendViewModel.commitTransaction(context);
502 await showPopUp<void>(
503 context: context,
504 builder: (BuildContext _dialogContext) {
lib/src/screens/settings/desktop_settings/desktop_settings_page.dart
+5 -2
@@ -4,6 +4,7 @@ import 'package:cake_wallet/src/widgets/setting_action_button.dart';
4 import 'package:cake_wallet/src/widgets/setting_actions.dart';
5 import 'package:cake_wallet/typography.dart';
6 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
7 +import 'package:cw_core/wallet_type.dart';
8 import 'package:flutter/material.dart';
9 import 'package:cake_wallet/router.dart' as Router;
10 import 'package:cake_wallet/themes/extensions/menu_theme.dart';
@@ -60,8 +61,10 @@ class _DesktopSettingsPageState extends State<DesktopSettingsPage> {
61 return Container();
62 }
63
63 - if (!widget.dashboardViewModel.hasMweb &&
64 - item.name(context) == S.of(context).litecoin_mweb_settings) {
64 + if ((!widget.dashboardViewModel.isMoneroViewOnly &&
65 + item.name(context) == S.of(context).export_outputs) ||
66 + (!widget.dashboardViewModel.hasMweb &&
67 + item.name(context) == S.of(context).litecoin_mweb_settings)) {
68 return Container();
69 }
70
lib/src/screens/transaction_details/rbf_details_page.dart
+1 -1
@@ -168,7 +168,7 @@ class RBFDetailsPage extends BasePage {
168 leftButtonText: S.of(popupContext).cancel,
169 actionRightButton: () async {
170 Navigator.of(popupContext).pop();
171 - await transactionDetailsViewModel.sendViewModel.commitTransaction();
171 + await transactionDetailsViewModel.sendViewModel.commitTransaction(context);
172 try {
173 Navigator.of(popupContext).pop();
174 } catch (_) {}
lib/src/screens/ur/animated_ur_page.dart new
+184
@@ -0,0 +1,184 @@
1 +import 'dart:async';
2 +
3 +import 'package:cake_wallet/di.dart';
4 +import 'package:cake_wallet/entities/qr_scanner.dart';
5 +import 'package:cake_wallet/generated/i18n.dart';
6 +import 'package:cake_wallet/monero/monero.dart';
7 +import 'package:cake_wallet/src/screens/base_page.dart';
8 +import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
9 +import 'package:cake_wallet/src/screens/send/widgets/confirm_sending_alert.dart';
10 +import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
11 +import 'package:cake_wallet/src/widgets/primary_button.dart';
12 +import 'package:cake_wallet/utils/show_pop_up.dart';
13 +import 'package:cake_wallet/view_model/animated_ur_model.dart';
14 +import 'package:cake_wallet/view_model/dashboard/wallet_balance.dart';
15 +import 'package:cw_core/balance.dart';
16 +import 'package:cw_core/transaction_history.dart';
17 +import 'package:cw_core/transaction_info.dart';
18 +import 'package:cw_core/wallet_base.dart';
19 +import 'package:flutter/foundation.dart';
20 +import 'package:flutter/material.dart';
21 +
22 +// ur:xmr-txunsigned - unsigned transaction
23 +// should show a scanner afterwards.
24 +
25 +class AnimatedURPage extends BasePage {
26 + final bool isAll;
27 + AnimatedURPage(this.animatedURmodel, {required String urQr, this.isAll = false}) {
28 + if (urQr == "export-outputs") {
29 + this.urQr = monero!.exportOutputsUR(animatedURmodel.wallet, false);
30 + } else if (urQr == "export-outputs-all") {
31 + this.urQr = monero!.exportOutputsUR(animatedURmodel.wallet, true);
32 + } else {
33 + this.urQr = urQr;
34 + }
35 + }
36 +
37 + late String urQr;
38 +
39 + final AnimatedURModel animatedURmodel;
40 +
41 + String get urQrType {
42 + final first = urQr.trim().split("\n")[0];
43 + return first.split('/')[0];
44 + }
45 +
46 + @override
47 + Widget body(BuildContext context) {
48 + return Column(
49 + mainAxisSize: MainAxisSize.min,
50 + children: [
51 + Padding(
52 + padding: const EdgeInsets.only(top: 64.0),
53 + child: URQR(
54 + frames: urQr.trim().split("\n"),
55 + ),
56 + ),
57 + SizedBox(height: 32),
58 + if (urQrType == "ur:xmr-txunsigned" || urQrType == "ur:xmr-output")
59 + Padding(
60 + padding: const EdgeInsets.symmetric(horizontal: 16.0),
61 + child: SizedBox(
62 + width: double.maxFinite,
63 + child: PrimaryButton(
64 + onPressed: () => _continue(context),
65 + text: "Continue",
66 + color: Theme.of(context).primaryColor,
67 + textColor: Colors.white,
68 + ),
69 + ),
70 + ),
71 + SizedBox(height: 32),
72 + if (urQrType == "ur:xmr-output" && !isAll) Padding(
73 + padding: const EdgeInsets.symmetric(horizontal: 16.0),
74 + child: SizedBox(
75 + width: double.maxFinite,
76 + child: PrimaryButton(
77 + onPressed: () => _exportAll(context),
78 + text: "Export all",
79 + color: Theme.of(context).colorScheme.secondary,
80 + textColor: Colors.white,
81 + ),
82 + ),
83 + ),
84 + ],
85 + );
86 + }
87 +
88 + void _exportAll(BuildContext context) {
89 + Navigator.of(context).pushReplacement(
90 + MaterialPageRoute(
91 + builder: (context) {
92 + return AnimatedURPage(animatedURmodel, urQr: "export-outputs-all", isAll: true);
93 + },
94 + ),
95 + );
96 + }
97 +
98 + Future<void> _continue(BuildContext context) async {
99 + try {
100 + switch (urQrType) {
101 + case "ur:xmr-txunsigned": // ur:xmr-txsigned
102 + final ur = await presentQRScanner(context);
103 + final result = await monero!.commitTransactionUR(animatedURmodel.wallet, ur);
104 + if (result) {
105 + Navigator.of(context).pop(true);
106 + }
107 + break;
108 + case "ur:xmr-output": // xmr-keyimage
109 + final ur = await presentQRScanner(context);
110 + final result = await monero!.importKeyImagesUR(animatedURmodel.wallet, ur);
111 + if (result) {
112 + Navigator.of(context).pop(true);
113 + }
114 + break;
115 + default:
116 + throw UnimplementedError("unable to handle UR: ${urQrType}");
117 + }
118 + } catch (e) {
119 + await showPopUp<void>(
120 + context: context,
121 + builder: (BuildContext context) {
122 + return AlertWithOneAction(
123 + alertTitle: S.of(context).error,
124 + alertContent: e.toString(),
125 + buttonText: S.of(context).ok,
126 + buttonAction: () => Navigator.pop(context, true));
127 + });
128 + }
129 + }
130 +}
131 +
132 +class URQR extends StatefulWidget {
133 + URQR({super.key, required this.frames});
134 +
135 + List<String> frames;
136 +
137 + @override
138 + // ignore: library_private_types_in_public_api
139 + _URQRState createState() => _URQRState();
140 +}
141 +
142 +const urFrameTime = 1000 ~/ 5;
143 +
144 +class _URQRState extends State<URQR> {
145 + Timer? t;
146 + int frame = 0;
147 + @override
148 + void initState() {
149 + super.initState();
150 + setState(() {
151 + t = Timer.periodic(const Duration(milliseconds: urFrameTime), (timer) {
152 + _nextFrame();
153 + });
154 + });
155 + }
156 +
157 + void _nextFrame() {
158 + setState(() {
159 + frame++;
160 + });
161 + }
162 +
163 + @override
164 + void dispose() {
165 + t?.cancel();
166 + super.dispose();
167 + }
168 +
169 + @override
170 + Widget build(BuildContext context) {
171 + return Column(
172 + mainAxisSize: MainAxisSize.min,
173 + mainAxisAlignment: MainAxisAlignment.center,
174 + children: [
175 + Center(
176 + child: QrImage(
177 + data: widget.frames[frame % widget.frames.length], version: -1,
178 + size: 400,
179 + ),
180 + ),
181 + ],
182 + );
183 + }
184 +}
\ No newline at end of file
lib/src/screens/wallet_connect/wc_connections_listing_view.dart
+1 -1
@@ -65,7 +65,7 @@ class WCPairingsWidget extends BasePage {
65 bool isCameraPermissionGranted =
66 await PermissionHandler.checkPermission(Permission.camera, context);
67 if (!isCameraPermissionGranted) return;
68 - uri = await presentQRScanner();
68 + uri = await presentQRScanner(context);
69 } else {
70 uri = await _showEnterWalletConnectURIPopUp(context);
71 }
lib/src/widgets/address_text_field.dart
+1 -1
@@ -231,7 +231,7 @@ class AddressTextField extends StatelessWidget {
231 bool isCameraPermissionGranted =
232 await PermissionHandler.checkPermission(Permission.camera, context);
233 if (!isCameraPermissionGranted) return;
234 - final code = await presentQRScanner();
234 + final code = await presentQRScanner(context);
235 if (code.isEmpty) {
236 return;
237 }
lib/src/widgets/setting_actions.dart
+11
@@ -21,6 +21,7 @@ class SettingActions {
21 addressBookSettingAction,
22 silentPaymentsSettingAction,
23 litecoinMwebSettingAction,
24 + exportOutputsAction,
25 securityBackupSettingAction,
26 privacySettingAction,
27 displaySettingAction,
@@ -50,6 +51,16 @@ class SettingActions {
51 },
52 );
53
54 + static SettingActions exportOutputsAction = SettingActions._(
55 + key: ValueKey('dashboard_page_menu_widget_export_outputs_settings_button_key'),
56 + name: (context) => S.of(context).export_outputs,
57 + image: 'assets/images/monero_menu.png',
58 + onTap: (BuildContext context) {
59 + Navigator.pop(context);
60 + Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: 'export-outputs');
61 + },
62 + );
63 +
64 static SettingActions litecoinMwebSettingAction = SettingActions._(
65 key: ValueKey('dashboard_page_menu_widget_litecoin_mweb_settings_button_key'),
66 name: (context) => S.of(context).litecoin_mweb_settings,
lib/view_model/animated_ur_model.dart new
+10
@@ -0,0 +1,10 @@
1 +import 'package:cake_wallet/store/app_store.dart';
2 +import 'package:cw_core/wallet_base.dart';
3 +import 'package:mobx/mobx.dart';
4 +
5 +class AnimatedURModel with Store {
6 + AnimatedURModel(this.appStore)
7 + : wallet = appStore.wallet!;
8 + final AppStore appStore;
9 + final WalletBase wallet;
10 +}
\ No newline at end of file
lib/view_model/dashboard/dashboard_view_model.dart
+6
@@ -393,6 +393,12 @@ abstract class DashboardViewModelBase with Store {
393 wallet.type == WalletType.wownero ||
394 wallet.type == WalletType.haven;
395
396 + @computed
397 + bool get isMoneroViewOnly {
398 + if (wallet.type != WalletType.monero) return false;
399 + return monero!.isViewOnly();
400 + }
401 +
402 @computed
403 String? get getMoneroError {
404 if (wallet.type != WalletType.monero) return null;
lib/view_model/node_list/node_create_or_edit_view_model.dart
+1 -1
@@ -213,7 +213,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
213 bool isCameraPermissionGranted =
214 await PermissionHandler.checkPermission(Permission.camera, context);
215 if (!isCameraPermissionGranted) return;
216 - String code = await presentQRScanner();
216 + String code = await presentQRScanner(context);
217
218 if (code.isEmpty) {
219 throw Exception('Unexpected scan QR code value: value is empty');
lib/view_model/restore/restore_wallet.dart
+13 -1
@@ -1,3 +1,5 @@
1 +import 'dart:convert';
2 +
3 import 'package:cake_wallet/view_model/restore/restore_mode.dart';
4 import 'package:cw_core/wallet_type.dart';
5
@@ -32,6 +34,16 @@ class RestoredWallet {
34 final String? privateKey;
35
36 factory RestoredWallet.fromKey(Map<String, dynamic> json) {
37 + try {
38 + final codeParsed = jsonDecode(json['raw_qr'].toString());
39 + if (codeParsed["version"] == 0) {
40 + json['address'] = codeParsed["primaryAddress"];
41 + json['view_key'] = codeParsed["privateViewKey"];
42 + json['height'] = codeParsed["restoreHeight"].toString();
43 + }
44 + } catch (e) {
45 + // fine, we don't care, it is only for monero anyway
46 + }
47 final height = json['height'] as String?;
48 return RestoredWallet(
49 restoreMode: json['mode'] as WalletRestoreMode,
@@ -39,7 +51,7 @@ class RestoredWallet {
51 address: json['address'] as String?,
52 spendKey: json['spend_key'] as String?,
53 viewKey: json['view_key'] as String?,
42 - height: height != null ? int.parse(height) : 0,
54 + height: height != null ? int.tryParse(height)??0 : 0,
55 privateKey: json['private_key'] as String?,
56 );
57 }
lib/view_model/restore/wallet_restore_from_qr_code.dart
+26 -2
@@ -1,3 +1,5 @@
1 +import 'dart:convert';
2 +
3 import 'package:cake_wallet/core/seed_validator.dart';
4 import 'package:cake_wallet/entities/parse_address_from_domain.dart';
5 import 'package:cake_wallet/entities/qr_scanner.dart';
@@ -48,6 +50,17 @@ class WalletRestoreFromQRCode {
50
51 final extracted = sortedKeys.firstWhereOrNull((key) => code.toLowerCase().contains(key));
52
53 + if (extracted == null) {
54 + // Special case for view-only monero wallet
55 + final codeParsed = json.decode(code);
56 + if (codeParsed["version"] == 0 &&
57 + codeParsed["primaryAddress"] != null &&
58 + codeParsed["privateViewKey"] != null &&
59 + codeParsed["restoreHeight"] != null) {
60 + return WalletType.monero;
61 + }
62 + }
63 +
64 return _walletTypeMap[extracted];
65 }
66
@@ -75,7 +88,7 @@ class WalletRestoreFromQRCode {
88 }
89
90 static Future<RestoredWallet> scanQRCodeForRestoring(BuildContext context) async {
78 - String code = await presentQRScanner();
91 + String code = await presentQRScanner(context);
92 if (code.isEmpty) throw Exception('Unexpected scan QR code value: value is empty');
93
94 WalletType? walletType;
@@ -109,7 +122,7 @@ class WalletRestoreFromQRCode {
122 queryParameters['address'] = _extractAddressFromUrl(code, walletType!);
123 }
124
112 - Map<String, dynamic> credentials = {'type': walletType, ...queryParameters};
125 + Map<String, dynamic> credentials = {'type': walletType, ...queryParameters, 'raw_qr': code};
126
127 credentials['mode'] = _determineWalletRestoreMode(credentials);
128
@@ -205,6 +218,17 @@ class WalletRestoreFromQRCode {
218 return WalletRestoreMode.keys;
219 }
220
221 + if (type == WalletType.monero) {
222 + final codeParsed = json.decode(credentials['raw_qr'].toString());
223 + if (codeParsed["version"] != 0) throw UnimplementedError("Found view-only restore with unsupported version");
224 + if (codeParsed["primaryAddress"] == null ||
225 + codeParsed["privateViewKey"] == null ||
226 + codeParsed["restoreHeight"] == null) {
227 + throw UnimplementedError("Missing one or more attributes in the JSON");
228 + }
229 + return WalletRestoreMode.keys;
230 + }
231 +
232 throw Exception('Unexpected restore mode: restore params are invalid');
233 }
234 }
lib/view_model/send/send_view_model.dart
+16 -2
@@ -1,3 +1,4 @@
1 +import 'package:cake_wallet/di.dart';
2 import 'package:cake_wallet/entities/contact.dart';
3 import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
4 import 'package:cake_wallet/entities/transaction_description.dart';
@@ -10,7 +11,9 @@ import 'package:cake_wallet/entities/contact_record.dart';
11 import 'package:cake_wallet/entities/wallet_contact.dart';
12 import 'package:cake_wallet/polygon/polygon.dart';
13 import 'package:cake_wallet/reactions/wallet_connect.dart';
14 +import 'package:cake_wallet/routes.dart';
15 import 'package:cake_wallet/solana/solana.dart';
16 +import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart';
17 import 'package:cake_wallet/store/app_store.dart';
18 import 'package:cake_wallet/tron/tron.dart';
19 import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart';
@@ -23,6 +26,7 @@ import 'package:cw_core/transaction_priority.dart';
26 import 'package:cw_core/unspent_coin_type.dart';
27 import 'package:cake_wallet/view_model/send/output.dart';
28 import 'package:cake_wallet/view_model/send/send_template_view_model.dart';
29 +import 'package:flutter/material.dart';
30 import 'package:hive/hive.dart';
31 import 'package:mobx/mobx.dart';
32 import 'package:cake_wallet/entities/template.dart';
@@ -457,7 +461,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
461 }
462
463 @action
460 - Future<void> commitTransaction() async {
464 + Future<void> commitTransaction(BuildContext context) async {
465 if (pendingTransaction == null) {
466 throw Exception("Pending transaction doesn't exist. It should not be happened.");
467 }
@@ -476,7 +480,17 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
480
481 try {
482 state = TransactionCommitting();
479 - await pendingTransaction!.commit();
483 +
484 + if (pendingTransaction!.shouldCommitUR()) {
485 + final urstr = await pendingTransaction!.commitUR();
486 + final result = await Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: urstr);
487 + if (result == null) {
488 + state = FailureState("Canceled by user");
489 + return;
490 + }
491 + } else {
492 + await pendingTransaction!.commit();
493 + }
494
495 if (walletType == WalletType.nano) {
496 nano!.updateTransactions(wallet);
lib/view_model/wallet_keys_view_model.dart
+12
@@ -72,6 +72,10 @@ abstract class WalletKeysViewModelBase with Store {
72 final keys = monero!.getKeys(_appStore.wallet!);
73
74 items.addAll([
75 + if (keys['primaryAddress'] != null)
76 + StandartListItem(
77 + title: S.current.primary_address,
78 + value: keys['primaryAddress']!),
79 if (keys['publicSpendKey'] != null)
80 StandartListItem(
81 key: ValueKey('${_walletName}_wallet_public_spend_key_item_key'),
@@ -131,6 +135,10 @@ abstract class WalletKeysViewModelBase with Store {
135 final keys = haven!.getKeys(_appStore.wallet!);
136
137 items.addAll([
138 + if (keys['primaryAddress'] != null)
139 + StandartListItem(
140 + title: S.current.primary_address,
141 + value: keys['primaryAddress']!),
142 if (keys['publicSpendKey'] != null)
143 StandartListItem(
144 key: ValueKey('${_walletName}_wallet_public_spend_key_item_key'),
@@ -168,6 +176,10 @@ abstract class WalletKeysViewModelBase with Store {
176 final keys = wownero!.getKeys(_appStore.wallet!);
177
178 items.addAll([
179 + if (keys['primaryAddress'] != null)
180 + StandartListItem(
181 + title: S.current.primary_address,
182 + value: keys['primaryAddress']!),
183 if (keys['publicSpendKey'] != null)
184 StandartListItem(
185 key: ValueKey('${_walletName}_wallet_public_spend_key_item_key'),
linux/flutter/generated_plugins.cmake
-1
@@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
10 )
11
12 list(APPEND FLUTTER_FFI_PLUGIN_LIST
13 - sp_scanner
13 )
14
15 set(PLUGIN_BUNDLED_LIBRARIES)
macos/Flutter/GeneratedPluginRegistrant.swift
+2 -2
@@ -6,9 +6,9 @@ import FlutterMacOS
6 import Foundation
7
8 import connectivity_plus
9 -import cw_mweb
9 import device_info_plus
10 import devicelocale
11 +import fast_scanner
12 import flutter_inappwebview_macos
13 import flutter_local_authentication
14 import flutter_secure_storage_macos
@@ -23,9 +23,9 @@ import wakelock_plus
23
24 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
25 ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
26 - CwMwebPlugin.register(with: registry.registrar(forPlugin: "CwMwebPlugin"))
26 DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
27 DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin"))
28 + MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))
29 InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
30 FlutterLocalAuthenticationPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalAuthenticationPlugin"))
31 FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
macos/Podfile.lock
+6
@@ -8,6 +8,8 @@ PODS:
8 - FlutterMacOS
9 - devicelocale (0.0.1):
10 - FlutterMacOS
11 + - fast_scanner (5.1.1):
12 + - FlutterMacOS
13 - flutter_inappwebview_macos (0.0.1):
14 - FlutterMacOS
15 - OrderedSet (~> 5.0)
@@ -42,6 +44,7 @@ DEPENDENCIES:
44 - cw_mweb (from `Flutter/ephemeral/.symlinks/plugins/cw_mweb/macos`)
45 - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
46 - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`)
47 + - fast_scanner (from `Flutter/ephemeral/.symlinks/plugins/fast_scanner/macos`)
48 - flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`)
49 - flutter_local_authentication (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_authentication/macos`)
50 - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`)
@@ -69,6 +72,8 @@ EXTERNAL SOURCES:
72 :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
73 devicelocale:
74 :path: Flutter/ephemeral/.symlinks/plugins/devicelocale/macos
75 + fast_scanner:
76 + :path: Flutter/ephemeral/.symlinks/plugins/fast_scanner/macos
77 flutter_inappwebview_macos:
78 :path: Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos
79 flutter_local_authentication:
@@ -99,6 +104,7 @@ SPEC CHECKSUMS:
104 cw_mweb: 7440b12ead811dda972a9918442ea2a458e8742c
105 device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
106 devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225
107 + fast_scanner: d31bae07e2653403a69dac99fb710c1722b16a97
108 flutter_inappwebview_macos: 9600c9df9fdb346aaa8933812009f8d94304203d
109 flutter_local_authentication: 85674893931e1c9cfa7c9e4f5973cb8c56b018b0
110 flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea
pubspec_base.yaml
+4 -2
@@ -14,8 +14,10 @@ dependencies:
14 # provider: ^6.0.3
15 rxdart: ^0.28.0
16 yaml: ^3.1.1
17 - #barcode_scan: any
18 - barcode_scan2: ^4.2.1
17 + fast_scanner:
18 + git:
19 + url: https://github.com/MrCyjaneK/fast_scanner
20 + ref: c8311b46cc67dd02250970a54d2a4526168187f3
21 http: ^1.1.0
22 path_provider: ^2.0.11
23 mobx: ^2.1.4
res/values/strings_ar.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "رابط Clearnet",
137 "close": "يغلق",
138 "coin_control": "التحكم في العملة (اختياري)",
139 - "cold_or_recover_wallet": "أضف محفظة باردة أو استعد محفظة ورقية",
139 + "cold_or_recover_wallet": "أضف محفظة للقراءة فقط من Cupcake أو محفظة باردة أو استعاد محفظة ورقية",
140 "color_theme": "سمة اللون",
141 "commit_transaction_amount_fee": "تنفيذ الصفقة\nالمبلغ: ${amount}\nالرسوم: ${fee}",
142 "confirm": "تأكيد",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "جهات الاتصال",
162 "contact_list_wallets": "محافظ",
163 "contact_name": "اسم جهة الاتصال",
164 + "contact_name_exists": " .ﻒﻠﺘﺨﻣ ﻢﺳﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ .ﻞﻌﻔﻟﺎﺑ ﺓﺩﻮﺟﻮﻣ ﻢﺳﻻﺍ ﺍﺬﻬﺑ ﻝﺎﺼﺗﺍ ﺔﻬﺟ",
165 "contact_support": "اتصل بالدعم",
166 "continue_text": "التالي",
167 "contract_warning": "تم وضع علامة على عنوان العقد هذا على أنه احتيالي محتمل. يرجى المعالجة بحذر.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "انتهاء الصلاحية والصلاحية",
298 "export_backup": "تصدير نسخة احتياطية",
299 "export_logs": "سجلات التصدير",
300 + "export_outputs": "مخرجات التصدير",
301 "extra_id": "معرف إضافي:",
302 "extracted_address_content": "سوف ترسل الأموال إلى\n${recipient_name}",
303 "failed_authentication": "${state_error} فشل المصادقة.",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven بواسطة Cake Wallet",
339 "haven_app_wallet_text": "محفظة رائعة ل Haven",
340 "help": "مساعده",
341 + "hidden_addresses": "العناوين المخفية",
342 "hidden_balance": "الميزان الخفي",
343 + "hide": "يخفي",
344 "hide_details": "أخف التفاصيل",
345 "high_contrast_theme": "موضوع عالي التباين",
346 "home_screen_settings": "إعدادات الشاشة الرئيسية",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "مهم",
505 "prepaid_cards": "البطاقات المدفوعة مسبقا",
506 "prevent_screenshots": "منع لقطات الشاشة وتسجيل الشاشة",
507 + "primary_address": "العنوان الأساسي",
508 "privacy": "خصوصية",
509 "privacy_policy": "سياسة الخصوصية",
510 "privacy_settings": "إعدادات الخصوصية",
@@ -696,6 +701,7 @@
701 "share": "يشارك",
702 "share_address": "شارك العنوان",
703 "shared_seed_wallet_groups": "مجموعات محفظة البذور المشتركة",
704 + "show": "يعرض",
705 "show_details": "اظهر التفاصيل",
706 "show_keys": "اظهار السييد / المفاتيح",
707 "show_market_place": "إظهار السوق",
@@ -942,6 +948,5 @@
948 "you_pay": "انت تدفع",
949 "you_will_get": "حول الى",
950 "you_will_send": "تحويل من",
945 - "yy": "YY",
946 - "contact_name_exists": " .ﻒﻠﺘﺨﻣ ﻢﺳﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ .ﻞﻌﻔﻟﺎﺑ ﺓﺩﻮﺟﻮﻣ ﻢﺳﻻﺍ ﺍﺬﻬﺑ ﻝﺎﺼﺗﺍ ﺔﻬﺟ"
947 -}
951 + "yy": "YY"
952 +}
\ No newline at end of file
res/values/strings_bg.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Clearnet връзка",
137 "close": "затвори",
138 "coin_control": "Управление на монетите (не е задължително)",
139 - "cold_or_recover_wallet": "Добавете студен портфейл или възстановете хартиен портфейл",
139 + "cold_or_recover_wallet": "Добавете портфейл само за четене от Cupcake или студен портфейл или възстановете хартиен портфейл",
140 "color_theme": "Цвят",
141 "commit_transaction_amount_fee": "Изпълняване на транзакция\nСума: ${amount}\nТакса: ${fee}",
142 "confirm": "Потвърждаване",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Контакти",
162 "contact_list_wallets": "Моите портфейли",
163 "contact_name": "Име на контакт",
164 + "contact_name_exists": "Вече съществува контакт с това име. Моля, изберете друго име.",
165 "contact_support": "Свържи се с отдел поддръжка",
166 "continue_text": "Напред",
167 "contract_warning": "Този адрес на договора е маркиран като потенциално измамник. Моля, обработете с повишено внимание.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Изтичане и валидност",
298 "export_backup": "Експортиране на резервно копие",
299 "export_logs": "Експортни дневници",
300 + "export_outputs": "Експортни резултати",
301 "extra_id": "Допълнително ID:",
302 "extracted_address_content": "Ще изпратите средства на \n${recipient_name}",
303 "failed_authentication": "Неуспешно удостоверяване. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven от Cake Wallet",
339 "haven_app_wallet_text": "Невероятен портфейл за Haven",
340 "help": "Помощ",
341 + "hidden_addresses": "Скрити адреси",
342 "hidden_balance": "Скрит баланс",
343 + "hide": "Скрий",
344 "hide_details": "Скриване на подробностите",
345 "high_contrast_theme": "Тема с висок контраст",
346 "home_screen_settings": "Настройки на началния екран",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "ВАЖНО",
505 "prepaid_cards": "Предплатени карти",
506 "prevent_screenshots": "Предотвратете екранни снимки и запис на екрана",
507 + "primary_address": "Първичен адрес",
508 "privacy": "Поверителност",
509 "privacy_policy": "Политика за поверителността",
510 "privacy_settings": "Настройки за поверителност",
@@ -696,6 +701,7 @@
701 "share": "Дял",
702 "share_address": "Сподели адрес",
703 "shared_seed_wallet_groups": "Споделени групи за портфейли за семена",
704 + "show": "Показване",
705 "show_details": "Показване на подробностите",
706 "show_keys": "Покажи seed/keys",
707 "show_market_place": "Покажи пазар",
@@ -942,6 +948,5 @@
948 "you_pay": "Вие плащате",
949 "you_will_get": "Обръщане в",
950 "you_will_send": "Обръщане от",
945 - "yy": "гг",
946 - "contact_name_exists": "Вече съществува контакт с това име. Моля, изберете друго име."
947 -}
951 + "yy": "гг"
952 +}
\ No newline at end of file
res/values/strings_cs.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Odkaz na Clearnet",
137 "close": "zavřít",
138 "coin_control": "Volba mincí (nepovinné)",
139 - "cold_or_recover_wallet": "Přidejte studenou peněženku nebo obnovte papírovou peněženku",
139 + "cold_or_recover_wallet": "Přidejte peněženku pouze pro čtení z Cupcake nebo studené peněženky nebo obnovte papírovou peněženku",
140 "color_theme": "Barevný motiv",
141 "commit_transaction_amount_fee": "Odeslat transakci\nČástka: ${amount}\nPoplatek: ${fee}",
142 "confirm": "Potvrdit",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Kontakty",
162 "contact_list_wallets": "Moje peněženky",
163 "contact_name": "Jméno kontaktu",
164 + "contact_name_exists": "Kontakt s tímto jménem již existuje. Vyberte prosím jiný název.",
165 "contact_support": "Kontaktovat podporu",
166 "continue_text": "Pokračovat",
167 "contract_warning": "Tato adresa smlouvy byla označena jako potenciálně podvodná. Zpracovejte prosím opatrně.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Vypršení a platnost",
298 "export_backup": "Exportovat zálohu",
299 "export_logs": "Vývozní protokoly",
300 + "export_outputs": "Vývozní výstupy",
301 "extra_id": "Extra ID:",
302 "extracted_address_content": "Prostředky budete posílat na\n${recipient_name}",
303 "failed_authentication": "Ověřování selhalo. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven od Cake Wallet",
339 "haven_app_wallet_text": "Úžasná peněženka pro Haven",
340 "help": "pomoc",
341 + "hidden_addresses": "Skryté adresy",
342 "hidden_balance": "Skrytý zůstatek",
343 + "hide": "Skrýt",
344 "hide_details": "Skrýt detaily",
345 "high_contrast_theme": "Téma s vysokým kontrastem",
346 "home_screen_settings": "Nastavení domovské obrazovky",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "DŮLEŽITÉ",
505 "prepaid_cards": "Předplacené karty",
506 "prevent_screenshots": "Zabránit vytváření snímků obrazovky a nahrávání obrazovky",
507 + "primary_address": "Primární adresa",
508 "privacy": "Soukromí",
509 "privacy_policy": "Zásady ochrany soukromí",
510 "privacy_settings": "Nastavení soukromí",
@@ -696,6 +701,7 @@
701 "share": "Podíl",
702 "share_address": "Sdílet adresu",
703 "shared_seed_wallet_groups": "Skupiny sdílených semen",
704 + "show": "Show",
705 "show_details": "Zobrazit detaily",
706 "show_keys": "Zobrazit seed/klíče",
707 "show_market_place": "Zobrazit trh",
@@ -942,6 +948,5 @@
948 "you_pay": "Zaplatíte",
949 "you_will_get": "Směnit na",
950 "you_will_send": "Směnit z",
945 - "yy": "YY",
946 - "contact_name_exists": "Kontakt s tímto jménem již existuje. Vyberte prosím jiný název."
947 -}
951 + "yy": "YY"
952 +}
\ No newline at end of file
res/values/strings_de.arb
+7 -1
@@ -136,7 +136,7 @@
136 "clearnet_link": "Clearnet-Link",
137 "close": "Schließen",
138 "coin_control": "Coin Control (optional)",
139 - "cold_or_recover_wallet": "Fügen Sie eine Cold Wallet hinzu oder stellen Sie eine Paper Wallet wieder her",
139 + "cold_or_recover_wallet": "Fügen Sie eine schreibgeschützte Brieftasche von Cupcake oder eine kalte Brieftasche hinzu oder erholen Sie sich eine Brieftasche",
140 "color_theme": "Farbthema",
141 "commit_transaction_amount_fee": "Transaktion absenden\nBetrag: ${amount}\nGebühr: ${fee}",
142 "confirm": "Bestätigen",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Kontakte",
162 "contact_list_wallets": "Meine Wallets",
163 "contact_name": "Name des Kontakts",
164 + "contact_name_exists": "Ein Kontakt mit diesem Namen besteht bereits. Bitte wählen Sie einen anderen Namen.",
165 "contact_support": "Support kontaktieren",
166 "continue_text": "Weiter",
167 "contract_warning": "Diese Vertragsadresse wurde als potenziell betrügerisch gekennzeichnet. Bitte verarbeiten Sie mit Vorsicht.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Ablauf und Gültigkeit",
298 "export_backup": "Sicherung exportieren",
299 "export_logs": "Exportprotokolle",
300 + "export_outputs": "Exportausgaben",
301 "extra_id": "Extra ID:",
302 "extracted_address_content": "Sie senden Geld an\n${recipient_name}",
303 "failed_authentication": "Authentifizierung fehlgeschlagen. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven von Cake Wallet",
339 "haven_app_wallet_text": "Eine großartige Wallet für Haven",
340 "help": "hilfe",
341 + "hidden_addresses": "Versteckte Adressen",
342 "hidden_balance": "Verstecktes Guthaben",
343 + "hide": "Verstecken",
344 "hide_details": "Details ausblenden",
345 "high_contrast_theme": "Kontrastreiches Thema",
346 "home_screen_settings": "Einstellungen für den Startbildschirm",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "WICHTIG",
506 "prepaid_cards": "Karten mit Guthaben",
507 "prevent_screenshots": "Verhindern Sie Screenshots und Bildschirmaufzeichnungen",
508 + "primary_address": "Primäradresse",
509 "privacy": "Datenschutz",
510 "privacy_policy": "Datenschutzrichtlinie",
511 "privacy_settings": "Datenschutzeinstellungen",
@@ -697,6 +702,7 @@
702 "share": "Teilen",
703 "share_address": "Adresse teilen ",
704 "shared_seed_wallet_groups": "Gemeinsame Walletsseed Gruppen",
705 + "show": "Zeigen",
706 "show_details": "Details anzeigen",
707 "show_keys": "Seed/Schlüssel anzeigen",
708 "show_market_place": "Marktplatz anzeigen",
res/values/strings_en.arb
+6 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Clearnet link",
137 "close": "Close",
138 "coin_control": "Coin control (optional)",
139 - "cold_or_recover_wallet": "Add a cold wallet or recover a paper wallet",
139 + "cold_or_recover_wallet": "Add a read-only wallet from Cupcake or a cold wallet or recover a paper wallet",
140 "color_theme": "Color theme",
141 "commit_transaction_amount_fee": "Commit transaction\nAmount: ${amount}\nFee: ${fee}",
142 "confirm": "Confirm",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Contacts",
162 "contact_list_wallets": "My Wallets",
163 "contact_name": "Contact Name",
164 + "contact_name_exists": "A contact with that name already exists. Please choose a different name.",
165 "contact_support": "Contact Support",
166 "continue_text": "Continue",
167 "contract_warning": "This contract address has been flagged as potentially fraudulent. Please process with caution.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Expiry and Validity",
298 "export_backup": "Export backup",
299 "export_logs": "Export logs",
300 + "export_outputs": "Export outputs",
301 "extra_id": "Extra ID:",
302 "extracted_address_content": "You will be sending funds to\n${recipient_name}",
303 "failed_authentication": "Failed authentication. ${state_error}",
@@ -502,6 +504,7 @@
504 "pre_seed_title": "IMPORTANT",
505 "prepaid_cards": "Prepaid Cards",
506 "prevent_screenshots": "Prevent screenshots and screen recording",
507 + "primary_address": "Primary Address",
508 "privacy": "Privacy",
509 "privacy_policy": "Privacy Policy",
510 "privacy_settings": "Privacy settings",
@@ -945,6 +948,5 @@
948 "you_pay": "You Pay",
949 "you_will_get": "Convert to",
950 "you_will_send": "Convert from",
948 - "yy": "YY",
949 - "contact_name_exists": "A contact with that name already exists. Please choose a different name."
950 -}
951 + "yy": "YY"
952 +}
\ No newline at end of file
res/values/strings_es.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "enlace Clearnet",
137 "close": "Cerca",
138 "coin_control": "Control de monedas (opcional)",
139 - "cold_or_recover_wallet": "Agrega una billetera fría o recupera una billetera de papel",
139 + "cold_or_recover_wallet": "Agregue una billetera de solo lectura de Cupcake o una billetera en frío o recupere una billetera de papel",
140 "color_theme": "Tema de color",
141 "commit_transaction_amount_fee": "Confirmar transacción\nCantidad: ${amount}\nCuota: ${fee}",
142 "confirm": "Confirmar",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Contactos",
162 "contact_list_wallets": "Mis billeteras",
163 "contact_name": "Nombre de contacto",
164 + "contact_name_exists": "Ya existe un contacto con ese nombre. Elija un nombre diferente.",
165 "contact_support": "Contactar con Soporte",
166 "continue_text": "Continuar",
167 "contract_warning": "Esta dirección de contrato ha sido marcada como potencialmente fraudulenta. Por favor, procese con precaución.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Vencimiento y validez",
298 "export_backup": "Exportar copia de seguridad",
299 "export_logs": "Registros de exportación",
300 + "export_outputs": "Exportaciones de exportación",
301 "extra_id": "ID adicional:",
302 "extracted_address_content": "Enviará fondos a\n${recipient_name}",
303 "failed_authentication": "Autenticación fallida. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Increíble billetera para Haven",
340 "help": "ayuda",
341 + "hidden_addresses": "Direcciones ocultas",
342 "hidden_balance": "Balance oculto",
343 + "hide": "Esconder",
344 "hide_details": "Ocultar detalles",
345 "high_contrast_theme": "Tema de alto contraste",
346 "home_screen_settings": "Configuración de la pantalla de inicio",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "IMPORTANTE",
506 "prepaid_cards": "Tajetas prepagadas",
507 "prevent_screenshots": "Evitar capturas de pantalla y grabación de pantalla",
508 + "primary_address": "Dirección principal",
509 "privacy": "Privacidad",
510 "privacy_policy": "Política de privacidad",
511 "privacy_settings": "Configuración de privacidad",
@@ -697,6 +702,7 @@
702 "share": "Compartir",
703 "share_address": "Compartir dirección",
704 "shared_seed_wallet_groups": "Grupos de billetera de semillas compartidas",
705 + "show": "Espectáculo",
706 "show_details": "Mostrar detalles",
707 "show_keys": "Mostrar semilla/claves",
708 "show_market_place": "Mostrar mercado",
@@ -943,6 +949,5 @@
949 "you_pay": "Tú pagas",
950 "you_will_get": "Convertir a",
951 "you_will_send": "Convertir de",
946 - "yy": "YY",
947 - "contact_name_exists": "Ya existe un contacto con ese nombre. Elija un nombre diferente."
948 -}
952 + "yy": "YY"
953 +}
\ No newline at end of file
res/values/strings_fr.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Lien Clearnet",
137 "close": "Fermer",
138 "coin_control": "Contrôle optionnel des pièces (coins)",
139 - "cold_or_recover_wallet": "Ajoutez un portefeuille froid (cold wallet) ou récupérez un portefeuille papier (paper wallet)",
139 + "cold_or_recover_wallet": "Ajoutez un portefeuille en lecture seule de Cupcake ou d'un portefeuille froid ou récupérez un portefeuille en papier",
140 "color_theme": "Thème",
141 "commit_transaction_amount_fee": "Valider la transaction\nMontant : ${amount}\nFrais : ${fee}",
142 "confirm": "Confirmer",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Contacts",
162 "contact_list_wallets": "Mes portefeuilles (wallets)",
163 "contact_name": "Nom de Contact",
164 + "contact_name_exists": "Un contact portant ce nom existe déjà. Veuillez choisir un autre nom.",
165 "contact_support": "Contacter l'assistance",
166 "continue_text": "Continuer",
167 "contract_warning": "Cette adresse contractuelle a été signalée comme potentiellement frauduleuse. Veuillez traiter avec prudence.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Expiration et validité",
298 "export_backup": "Exporter la sauvegarde",
299 "export_logs": "Journaux d'exportation",
300 + "export_outputs": "Exportation des sorties",
301 "extra_id": "ID supplémentaire :",
302 "extracted_address_content": "Vous allez envoyer des fonds à\n${recipient_name}",
303 "failed_authentication": "Échec d'authentification. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven par Cake Wallet",
339 "haven_app_wallet_text": "Super portefeuille (wallet) pour Haven",
340 "help": "aide",
341 + "hidden_addresses": "Adresses cachées",
342 "hidden_balance": "Solde Caché",
343 + "hide": "Cacher",
344 "hide_details": "Masquer les détails",
345 "high_contrast_theme": "Thème à contraste élevé",
346 "home_screen_settings": "Paramètres de l'écran d'accueil",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "IMPORTANT",
505 "prepaid_cards": "Cartes prépayées",
506 "prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran",
507 + "primary_address": "Adresse primaire",
508 "privacy": "Confidentialité",
509 "privacy_policy": "Politique de confidentialité",
510 "privacy_settings": "Paramètres de confidentialité",
@@ -696,6 +701,7 @@
701 "share": "Partager",
702 "share_address": "Partager l'adresse",
703 "shared_seed_wallet_groups": "Groupes de portefeuilles partagés",
704 + "show": "Montrer",
705 "show_details": "Afficher les détails",
706 "show_keys": "Visualiser la phrase secrète (seed) et les clefs",
707 "show_market_place": "Afficher la place de marché",
@@ -942,6 +948,5 @@
948 "you_pay": "Vous payez",
949 "you_will_get": "Convertir vers",
950 "you_will_send": "Convertir depuis",
945 - "yy": "AA",
946 - "contact_name_exists": "Un contact portant ce nom existe déjà. Veuillez choisir un autre nom."
947 -}
951 + "yy": "AA"
952 +}
\ No newline at end of file
res/values/strings_ha.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Lambar makomar kwayoyi",
137 "close": "Rufa",
138 "coin_control": "Sarrafa tsabar kuɗi (na zaɓi)",
139 - "cold_or_recover_wallet": "Samun kashi na baya ko samun kashi na kasa",
139 + "cold_or_recover_wallet": "Aara wani walat mai karanta-kawai Cupcake ko walat ɗin mai sanyi ko murmurewa takarda takarda",
140 "color_theme": "Jigon launi",
141 "commit_transaction_amount_fee": "Aikata ciniki\nAdadi: ${amount}\nKuda: ${fee}",
142 "confirm": "Tabbatar",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Lambobin sadarwa",
162 "contact_list_wallets": "Wallets dina",
163 "contact_name": "Sunan Tuntuɓi",
164 + "contact_name_exists": "An riga an sami lamba tare da wannan sunan. Da fatan za a zaɓi suna daban.",
165 "contact_support": "Tuntuɓi Support",
166 "continue_text": "Ci gaba",
167 "contract_warning": "An kafa wannan adireshin kwantaragin kwangilar yayin da yuwuwar zamba. Da fatan za a aiwatar da taka tsantsan.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Karewa da inganci",
298 "export_backup": "Ajiyayyen fitarwa",
299 "export_logs": "Injin fitarwa",
300 + "export_outputs": "Fitarwar fitarwa",
301 "extra_id": "Karin ID:",
302 "extracted_address_content": "Za ku aika da kudade zuwa\n${recipient_name}",
303 "failed_authentication": "Binne wajen shiga. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven da Cake Wallet",
339 "haven_app_wallet_text": "Aikace-aikacen e-wallet ga Haven",
340 "help": "taimako",
341 + "hidden_addresses": "Adireshin ɓoye",
342 "hidden_balance": "BOYE KUDI",
343 + "hide": "Ɓoye",
344 "hide_details": "Ɓoye cikakkun bayanai",
345 "high_contrast_theme": "Babban Jigon Kwatance",
346 "home_screen_settings": "Saitunan allo na gida",
@@ -502,6 +506,7 @@
506 "pre_seed_title": "MUHIMMANCI",
507 "prepaid_cards": "Katunan shirye-shirye",
508 "prevent_screenshots": "Fada lambobi da jarrabobi na kayan lambobi",
509 + "primary_address": "Adireshin farko",
510 "privacy": "Keɓantawa",
511 "privacy_policy": "takardar kebantawa",
512 "privacy_settings": "Saitunan sirri",
@@ -698,6 +703,7 @@
703 "share": "Raba",
704 "share_address": "Raba adireshin",
705 "shared_seed_wallet_groups": "Raba ƙungiya walat",
706 + "show": "Nuna",
707 "show_details": "Nuna Cikakkun bayanai",
708 "show_keys": "Nuna iri/maɓallai",
709 "show_market_place": "Nuna dan kasuwa",
@@ -944,6 +950,5 @@
950 "you_pay": "Ka Bayar",
951 "you_will_get": "Maida zuwa",
952 "you_will_send": "Maida daga",
947 - "yy": "YY",
948 - "contact_name_exists": "An riga an sami lamba tare da wannan sunan. Da fatan za a zaɓi suna daban."
949 -}
953 + "yy": "YY"
954 +}
\ No newline at end of file
res/values/strings_hi.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "क्लियरनेट लिंक",
137 "close": "बंद करना",
138 "coin_control": "सिक्का नियंत्रण (वैकल्पिक)",
139 - "cold_or_recover_wallet": "कोल्ड वॉलेट जोड़ें या पेपर वॉलेट पुनर्प्राप्त करें",
139 + "cold_or_recover_wallet": "Cupcake या एक कोल्ड वॉलेट से एक रीड-ओनली वॉलेट जोड़ें या एक पेपर वॉलेट को पुनर्प्राप्त करें",
140 "color_theme": "रंग विषय",
141 "commit_transaction_amount_fee": "लेन-देन करें\nरकम: ${amount}\nशुल्क: ${fee}",
142 "confirm": "की पुष्टि करें",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "संपर्क",
162 "contact_list_wallets": "मेरा बटुआ",
163 "contact_name": "संपर्क नाम",
164 + "contact_name_exists": "उस नाम का एक संपर्क पहले से मौजूद है. कृपया कोई भिन्न नाम चुनें.",
165 "contact_support": "सहायता से संपर्क करें",
166 "continue_text": "जारी रहना",
167 "contract_warning": "इस अनुबंध के पते को संभावित रूप से धोखाधड़ी के रूप में चिह्नित किया गया है। कृपया सावधानी के साथ प्रक्रिया करें।",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "समाप्ति और वैधता",
298 "export_backup": "निर्यात बैकअप",
299 "export_logs": "निर्यात लॉग",
300 + "export_outputs": "निर्यात आउटपुट",
301 "extra_id": "अतिरिक्त आईडी:",
302 "extracted_address_content": "आपको धनराशि भेजी जाएगी\n${recipient_name}",
303 "failed_authentication": "प्रमाणीकरण विफल. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "मदद करना",
341 + "hidden_addresses": "छिपे हुए पते",
342 "hidden_balance": "छिपा हुआ संतुलन",
343 + "hide": "छिपाना",
344 "hide_details": "विवरण छुपाएं",
345 "high_contrast_theme": "उच्च कंट्रास्ट थीम",
346 "home_screen_settings": "होम स्क्रीन सेटिंग्स",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "महत्वपूर्ण",
506 "prepaid_cards": "पूर्वदत्त कार्ड",
507 "prevent_screenshots": "स्क्रीनशॉट और स्क्रीन रिकॉर्डिंग रोकें",
508 + "primary_address": "प्राथमिक पता",
509 "privacy": "गोपनीयता",
510 "privacy_policy": "गोपनीयता नीति",
511 "privacy_settings": "गोपनीयता सेटिंग्स",
@@ -698,6 +703,7 @@
703 "share": "शेयर करना",
704 "share_address": "पता साझा करें",
705 "shared_seed_wallet_groups": "साझा बीज बटुए समूह",
706 + "show": "दिखाओ",
707 "show_details": "विवरण दिखाएं",
708 "show_keys": "बीज / कुंजियाँ दिखाएँ",
709 "show_market_place": "बाज़ार दिखाएँ",
@@ -944,6 +950,5 @@
950 "you_pay": "आप भुगतान करते हैं",
951 "you_will_get": "में बदलें",
952 "you_will_send": "से रूपांतरित करें",
947 - "yy": "वाईवाई",
948 - "contact_name_exists": "उस नाम का एक संपर्क पहले से मौजूद है. कृपया कोई भिन्न नाम चुनें."
949 -}
953 + "yy": "वाईवाई"
954 +}
\ No newline at end of file
res/values/strings_hr.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Clearnet veza",
137 "close": "Zatvoriti",
138 "coin_control": "Kontrola novca (nije obavezno)",
139 - "cold_or_recover_wallet": "Dodajte hladni novčanik ili povratite papirnati novčanik",
139 + "cold_or_recover_wallet": "Dodajte novčanik samo za čitanje od Cupcake ili hladnog novčanika ili oporavite papirni novčanik",
140 "color_theme": "Shema boja",
141 "commit_transaction_amount_fee": "Izvrši transakciju \nAmount: ${amount}\nFee: ${fee}",
142 "confirm": "Potvrdi",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Kontakti",
162 "contact_list_wallets": "Moji novčanici",
163 "contact_name": "Ime kontakta",
164 + "contact_name_exists": "Kontakt s tim imenom već postoji. Odaberite drugo ime.",
165 "contact_support": "Kontaktirajte podršku",
166 "continue_text": "Nastavak",
167 "contract_warning": "Ova adresa ugovora označena je kao potencijalno lažna. Molimo obradite s oprezom.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Istek i valjanost",
298 "export_backup": "Izvezi sigurnosnu kopiju",
299 "export_logs": "Izvozni trupci",
300 + "export_outputs": "Izvoz izlaza",
301 "extra_id": "Dodatni ID:",
302 "extracted_address_content": "Poslat ćete sredstva primatelju\n${recipient_name}",
303 "failed_authentication": "Autentifikacija neuspješna. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "pomozite",
341 + "hidden_addresses": "Skrivene adrese",
342 "hidden_balance": "Skriven iznos",
343 + "hide": "Sakriti",
344 "hide_details": "Sakrij pojedinosti",
345 "high_contrast_theme": "Tema visokog kontrasta",
346 "home_screen_settings": "Postavke početnog zaslona",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "VAŽNO",
505 "prepaid_cards": "Unaprijed plaćene kartice",
506 "prevent_screenshots": "Spriječite snimke zaslona i snimanje zaslona",
507 + "primary_address": "Primarna adresa",
508 "privacy": "Privatnost",
509 "privacy_policy": "Pravila privatnosti",
510 "privacy_settings": "Postavke privatnosti",
@@ -696,6 +701,7 @@
701 "share": "Udio",
702 "share_address": "Podijeli adresu",
703 "shared_seed_wallet_groups": "Zajedničke grupe za sjeme novčanika",
704 + "show": "Pokazati",
705 "show_details": "Prikaži pojedinosti",
706 "show_keys": "Prikaži pristupni izraz/ključ",
707 "show_market_place": "Prikaži tržište",
@@ -942,6 +948,5 @@
948 "you_pay": "Vi plaćate",
949 "you_will_get": "Razmijeni u",
950 "you_will_send": "Razmijeni iz",
945 - "yy": "GG",
946 - "contact_name_exists": "Kontakt s tim imenom već postoji. Odaberite drugo ime."
947 -}
951 + "yy": "GG"
952 +}
\ No newline at end of file
res/values/strings_hy.arb
+15 -1
@@ -136,7 +136,7 @@
136 "clearnet_link": "Բաց ցանցի հղում",
137 "close": "Փակել",
138 "coin_control": "Մետաղադրամի վերահսկում (ըստ ցանկության)",
139 - "cold_or_recover_wallet": "Ավելացնել սառը դրամապանակ կամ վերականգնել թղթային դրամապանակ",
139 + "cold_or_recover_wallet": "Cupcake կամ ցուրտ դրամապանակից ավելացնել միայն ընթերցված դրամապանակ կամ վերականգնել թղթի դրամապանակը",
140 "color_theme": "Գույների տեսք",
141 "commit_transaction_amount_fee": "Հաստատել գործարքը\nՍկզբնական գումար. ${amount}\nՄիջնորդավճար. ${fee}",
142 "confirm": "Հաստատել",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Կոնտակտներ",
162 "contact_list_wallets": "Իմ դրամապանակներ",
163 "contact_name": "Կոնտակտի անուն",
164 + "contact_name_exists": "Այդ անվանման հետ կապ կա արդեն: Խնդրում ենք ընտրել այլ անուն:",
165 "contact_support": "Հետադարձ կապ",
166 "continue_text": "Շարունակել",
167 "contract_warning": "Պայմանագրի այս հասցեն դրոշմել է որպես հնարավոր կեղծ: Խնդրում ենք զգուշությամբ մշակել:",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Վավերականություն և լրացում",
298 "export_backup": "Արտահանել կրկնօրինակը",
299 "export_logs": "Արտահանման տեղեկամատյաններ",
300 + "export_outputs": "Արտահանման արդյունքներ",
301 "extra_id": "Լրացուցիչ ID",
302 "extracted_address_content": "Դուք կուղարկեք գումար ${recipient_name}",
303 "failed_authentication": "Վավերացումը ձախողվեց. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven ծրագիր",
339 "haven_app_wallet_text": "Հիանալի հաշվեհամար Haven համար",
340 "help": "Օգնություն",
341 + "hidden_addresses": "Թաքնված հասցեներ",
342 "hidden_balance": "Թաքնված մնացորդ",
343 + "hide": "Թաքցնել",
344 "hide_details": "Թաքցնել մանրամասները",
345 "high_contrast_theme": "Բարձր հակադրության տեսք",
346 "home_screen_settings": "Գլխավոր էկրանի կարգավորումներ",
@@ -366,14 +370,22 @@
370 "ledger_error_wrong_app": "Խնդրում ենք համոզվել, որ դուք բացել եք ճիշտ ծրագիրը ձեր Ledger-ում",
371 "ledger_please_enable_bluetooth": "Խնդրում ենք միացնել Bluetooth-ը ձեր Ledger-ը հայտնաբերելու համար",
372 "light_theme": "Լուսավոր",
373 + "litecoin_enable_mweb_sync": "Միացնել MWEB սկան",
374 + "litecoin_mweb": "Մուեբ",
375 + "litecoin_mweb_always_scan": "Սահմանեք Mweb Միշտ սկանավորում",
376 "litecoin_mweb_description": "Mweb- ը նոր արձանագրություն է, որը բերում է ավելի արագ, ավելի էժան եւ ավելի մասնավոր գործարքներ դեպի LITECOIN",
377 "litecoin_mweb_dismiss": "Հեռացնել",
378 + "litecoin_mweb_display_card": "Show ույց տալ Mweb քարտը",
379 "litecoin_mweb_enable": "Միացնել Mweb- ը",
380 "litecoin_mweb_enable_later": "Կարող եք ընտրել Mweb- ը կրկին միացնել ցուցադրման պարամետրերը:",
381 "litecoin_mweb_logs": "Mweb տեղեկամատյաններ",
382 "litecoin_mweb_node": "Mweb հանգույց",
383 "litecoin_mweb_pegin": "Peg in",
384 "litecoin_mweb_pegout": "Հափշտակել",
385 + "litecoin_mweb_scanning": "Mweb սկանավորում",
386 + "litecoin_mweb_settings": "Mweb- ի պարամետրերը",
387 + "litecoin_mweb_warning": "Mweb- ի օգտագործումը սկզբում ներբեռնվի 600 ՄԲ տվյալներ եւ կարող է տեւել 30 րոպե, կախված ցանցի արագությունից: Այս նախնական տվյալները միայն մեկ անգամ ներբեռնելու են եւ հասանելի կլինեն բոլոր Litecoin դրամապանակների համար",
388 + "litecoin_what_is_mweb": "Ինչ է Mweb- ը:",
389 "live_fee_rates": "Ապակի վարձավճարներ API- ի միջոցով",
390 "load_more": "Բեռնել ավելին",
391 "loading_your_wallet": "Ձեր հաշվեհամարը բեռնում է",
@@ -492,6 +504,7 @@
504 "pre_seed_title": "ԿԱՐԵՎՈՐ",
505 "prepaid_cards": "Նախավճարային քարտեր",
506 "prevent_screenshots": "Կանխել էկրանի պատկերները և տեսագրությունը",
507 + "primary_address": "Առաջնային հասցե",
508 "privacy": "Գաղտնիություն",
509 "privacy_policy": "Գաղտնիության քաղաքականություն",
510 "privacy_settings": "Գաղտնիության կարգավորումներ",
@@ -688,6 +701,7 @@
701 "share": "Կիսվել",
702 "share_address": "Կիսվել հասցեով",
703 "shared_seed_wallet_groups": "Համօգտագործված սերմերի դրամապանակների խմբեր",
704 + "show": "Ցուցահանդես",
705 "show_details": "Ցուցադրել մանրամասներ",
706 "show_keys": "Ցուցադրել բանալիներ",
707 "show_market_place": "Ցուցադրել շուկան",
res/values/strings_id.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Tautan clearnet",
137 "close": "Menutup",
138 "coin_control": "Kontrol koin (opsional)",
139 - "cold_or_recover_wallet": "Tambahkan dompet dingin atau pulihkan dompet kertas",
139 + "cold_or_recover_wallet": "Tambahkan dompet hanya baca dari Cupcake atau dompet dingin atau memulihkan dompet kertas",
140 "color_theme": "Tema warna",
141 "commit_transaction_amount_fee": "Lakukan transaksi\nJumlah: ${amount}\nBiaya: ${fee}",
142 "confirm": "Konfirmasi",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Kontak",
162 "contact_list_wallets": "Dompet Saya",
163 "contact_name": "Nama Kontak",
164 + "contact_name_exists": "Kontak dengan nama tersebut sudah ada. Silakan pilih nama lain.",
165 "contact_support": "Hubungi Dukungan",
166 "continue_text": "Lanjutkan",
167 "contract_warning": "Alamat kontrak ini telah ditandai sebagai berpotensi curang. Silakan memproses dengan hati -hati.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Kedaluwarsa dan validitas",
298 "export_backup": "Ekspor cadangan",
299 "export_logs": "Log ekspor",
300 + "export_outputs": "Ekspor output",
301 "extra_id": "ID tambahan:",
302 "extracted_address_content": "Anda akan mengirim dana ke\n${recipient_name}",
303 "failed_authentication": "Otentikasi gagal. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven Oleh Cake Wallet",
339 "haven_app_wallet_text": "Dompet luar biasa untuk Haven",
340 "help": "bantuan",
341 + "hidden_addresses": "Alamat tersembunyi",
342 "hidden_balance": "Saldo Tersembunyi",
343 + "hide": "Bersembunyi",
344 "hide_details": "Sembunyikan Rincian",
345 "high_contrast_theme": "Tema Kontras Tinggi",
346 "home_screen_settings": "Pengaturan layar awal",
@@ -502,6 +506,7 @@
506 "pre_seed_title": "PENTING",
507 "prepaid_cards": "Kartu prabayar",
508 "prevent_screenshots": "Cegah tangkapan layar dan perekaman layar",
509 + "primary_address": "Alamat utama",
510 "privacy": "Privasi",
511 "privacy_policy": "Kebijakan Privasi",
512 "privacy_settings": "Pengaturan privasi",
@@ -699,6 +704,7 @@
704 "share": "Membagikan",
705 "share_address": "Bagikan alamat",
706 "shared_seed_wallet_groups": "Kelompok dompet benih bersama",
707 + "show": "Menunjukkan",
708 "show_details": "Tampilkan Rincian",
709 "show_keys": "Tampilkan seed/kunci",
710 "show_market_place": "Tampilkan Pasar",
@@ -945,6 +951,5 @@
951 "you_pay": "Anda Membayar",
952 "you_will_get": "Konversi ke",
953 "you_will_send": "Konversi dari",
948 - "yy": "YY",
949 - "contact_name_exists": "Kontak dengan nama tersebut sudah ada. Silakan pilih nama lain."
950 -}
954 + "yy": "YY"
955 +}
\ No newline at end of file
res/values/strings_it.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Collegamento Clearnet",
137 "close": "Chiudere",
138 "coin_control": "Controllo monete (opzionale)",
139 - "cold_or_recover_wallet": "Aggiungi un cold wallet o recupera un paper wallet",
139 + "cold_or_recover_wallet": "Aggiungi un portafoglio di sola lettura da Cupcake o un portafoglio freddo o recupera un portafoglio di carta",
140 "color_theme": "Colore tema",
141 "commit_transaction_amount_fee": "Invia transazione\nAmmontare: ${amount}\nCommissione: ${fee}",
142 "confirm": "Conferma",
@@ -162,6 +162,7 @@
162 "contact_list_contacts": "Contatti",
163 "contact_list_wallets": "I miei portafogli",
164 "contact_name": "Nome Contatto",
165 + "contact_name_exists": "Esiste già un contatto con quel nome. Scegli un nome diverso.",
166 "contact_support": "Contatta l'assistenza",
167 "continue_text": "Continua",
168 "contract_warning": "Questo indirizzo del contratto è stato contrassegnato come potenzialmente fraudolento. Si prega di elaborare con cautela.",
@@ -297,6 +298,7 @@
298 "expiry_and_validity": "Scadenza e validità",
299 "export_backup": "Esporta backup",
300 "export_logs": "Registri di esportazione",
301 + "export_outputs": "Output di esportazione",
302 "extra_id": "Extra ID:",
303 "extracted_address_content": "Invierai i tuoi fondi a\n${recipient_name}",
304 "failed_authentication": "Autenticazione fallita. ${state_error}",
@@ -337,7 +339,9 @@
339 "haven_app": "Haven by Cake Wallet",
340 "haven_app_wallet_text": "Portafoglio fantastico per Haven",
341 "help": "aiuto",
342 + "hidden_addresses": "Indirizzi nascosti",
343 "hidden_balance": "Saldo Nascosto",
344 + "hide": "Nascondere",
345 "hide_details": "Nascondi dettagli",
346 "high_contrast_theme": "Tema ad alto contrasto",
347 "home_screen_settings": "Impostazioni della schermata iniziale",
@@ -502,6 +506,7 @@
506 "pre_seed_title": "IMPORTANTE",
507 "prepaid_cards": "Carte prepagata",
508 "prevent_screenshots": "Impedisci screenshot e registrazione dello schermo",
509 + "primary_address": "Indirizzo primario",
510 "privacy": "Privacy",
511 "privacy_policy": "Informativa sulla privacy",
512 "privacy_settings": "Impostazioni privacy",
@@ -698,6 +703,7 @@
703 "share": "Condividere",
704 "share_address": "Condividi indirizzo",
705 "shared_seed_wallet_groups": "Gruppi di portafoglio di semi condivisi",
706 + "show": "Spettacolo",
707 "show_details": "Mostra dettagli",
708 "show_keys": "Mostra seme/chiavi",
709 "show_market_place": "Mostra mercato",
@@ -945,6 +951,5 @@
951 "you_pay": "Tu paghi",
952 "you_will_get": "Converti a",
953 "you_will_send": "Conveti da",
948 - "yy": "YY",
949 - "contact_name_exists": "Esiste già un contatto con quel nome. Scegli un nome diverso."
950 -}
954 + "yy": "YY"
955 +}
\ No newline at end of file
res/values/strings_ja.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "クリアネット リンク",
137 "close": "近い",
138 "coin_control": "コインコントロール(オプション)",
139 - "cold_or_recover_wallet": "コールド ウォレットを追加するか、ペーパー ウォレットを復元する",
139 + "cold_or_recover_wallet": "Cupcakeまたはコールドウォレットから読み取り専用ウォレットを追加するか、紙の財布を回収する",
140 "color_theme": "カラーテーマ",
141 "commit_transaction_amount_fee": "トランザクションをコミット\n量: ${amount}\n費用: ${fee}",
142 "confirm": "確認する",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "連絡先",
162 "contact_list_wallets": "マイウォレット",
163 "contact_name": "連絡先",
164 + "contact_name_exists": "その名前の連絡先はすでに存在します。別の名前を選択してください。",
165 "contact_support": "サポートに連絡する",
166 "continue_text": "持続する",
167 "contract_warning": "この契約住所は、潜在的に不正としてフラグが立てられています。注意して処理してください。",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "有効期限と有効性",
298 "export_backup": "バックアップのエクスポート",
299 "export_logs": "ログをエクスポートします",
300 + "export_outputs": "エクスポート出力",
301 "extra_id": "追加ID:",
302 "extracted_address_content": "に送金します\n${recipient_name}",
303 "failed_authentication": "認証失敗. ${state_error}",
@@ -337,7 +339,9 @@
339 "haven_app": "Haven by Cake Wallet",
340 "haven_app_wallet_text": "Awesome wallet for Haven",
341 "help": "ヘルプ",
342 + "hidden_addresses": "隠されたアドレス",
343 "hidden_balance": "隠れたバランス",
344 + "hide": "隠れる",
345 "hide_details": "詳細を非表示",
346 "high_contrast_theme": "ハイコントラストテーマ",
347 "home_screen_settings": "ホーム画面の設定",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "重要",
506 "prepaid_cards": "プリペイドカード",
507 "prevent_screenshots": "スクリーンショットと画面録画を防止する",
508 + "primary_address": "主なアドレス",
509 "privacy": "プライバシー",
510 "privacy_policy": "プライバシーポリシー",
511 "privacy_settings": "プライバシー設定",
@@ -697,6 +702,7 @@
702 "share": "共有",
703 "share_address": "住所を共有する",
704 "shared_seed_wallet_groups": "共有シードウォレットグループ",
705 + "show": "見せる",
706 "show_details": "詳細を表示",
707 "show_keys": "シード/キーを表示する",
708 "show_market_place": "マーケットプレイスを表示",
@@ -943,6 +949,5 @@
949 "you_pay": "あなたが支払う",
950 "you_will_get": "に変換",
951 "you_will_send": "から変換",
946 - "yy": "YY",
947 - "contact_name_exists": "その名前の連絡先はすでに存在します。別の名前を選択してください。"
948 -}
952 + "yy": "YY"
953 +}
\ No newline at end of file
res/values/strings_ko.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "클리어넷 링크",
137 "close": "닫다",
138 "coin_control": "코인 제어 (옵션)",
139 - "cold_or_recover_wallet": "콜드 지갑 추가 또는 종이 지갑 복구",
139 + "cold_or_recover_wallet": "Cupcake 또는 차가운 지갑에서 읽기 전용 지갑을 추가하거나 종이 지갑을 복구하십시오.",
140 "color_theme": "색상 테마",
141 "commit_transaction_amount_fee": "커밋 거래\n양: ${amount}\n보수: ${fee}",
142 "confirm": "확인",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "콘택트 렌즈",
162 "contact_list_wallets": "내 지갑",
163 "contact_name": "담당자 이름",
164 + "contact_name_exists": "해당 이름을 가진 연락처가 이미 존재합니다. 다른 이름을 선택하세요.",
165 "contact_support": "지원팀에 문의",
166 "continue_text": "잇다",
167 "contract_warning": "이 계약 주소는 잠재적으로 사기성으로 표시되었습니다. 주의해서 처리하십시오.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "만료와 타당성",
298 "export_backup": "백업 내보내기",
299 "export_logs": "내보내기 로그",
300 + "export_outputs": "내보내기 출력",
301 "extra_id": "추가 ID:",
302 "extracted_address_content": "당신은에 자금을 보낼 것입니다\n${recipient_name}",
303 "failed_authentication": "인증 실패. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "돕다",
341 + "hidden_addresses": "숨겨진 주소",
342 "hidden_balance": "숨겨진 균형",
343 + "hide": "숨다",
344 "hide_details": "세부 정보 숨기기",
345 "high_contrast_theme": "고대비 테마",
346 "home_screen_settings": "홈 화면 설정",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "중대한",
506 "prepaid_cards": "선불 카드",
507 "prevent_screenshots": "스크린샷 및 화면 녹화 방지",
508 + "primary_address": "기본 주소",
509 "privacy": "프라이버시",
510 "privacy_policy": "개인 정보 보호 정책",
511 "privacy_settings": "개인정보 설정",
@@ -697,6 +702,7 @@
702 "share": "공유하다",
703 "share_address": "주소 공유",
704 "shared_seed_wallet_groups": "공유 종자 지갑 그룹",
705 + "show": "보여주다",
706 "show_details": "세부정보 표시",
707 "show_keys": "시드 / 키 표시",
708 "show_market_place": "마켓플레이스 표시",
@@ -944,6 +950,5 @@
950 "you_will_get": "로 변환하다",
951 "you_will_send": "다음에서 변환",
952 "YY": "YY",
947 - "yy": "YY",
948 - "contact_name_exists": "해당 이름을 가진 연락처가 이미 존재합니다. 다른 이름을 선택하세요."
949 -}
953 + "yy": "YY"
954 +}
\ No newline at end of file
res/values/strings_my.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Clearnet လင့်ခ်",
137 "close": "အနီးကပ်",
138 "coin_control": "အကြွေစေ့ထိန်းချုပ်မှု (ချန်လှပ်ထားနိုင်သည်)",
139 - "cold_or_recover_wallet": "အေးသောပိုက်ဆံအိတ်ထည့်ပါ သို့မဟုတ် စက္ကူပိုက်ဆံအိတ်ကို ပြန်ယူပါ။",
139 + "cold_or_recover_wallet": "Cupcake သို့မဟုတ်အအေးပိုက်ဆံအိတ်မှဖတ်ရန်သာပိုက်ဆံအိတ်တစ်ခုထည့်ပါသို့မဟုတ်စက္ကူပိုက်ဆံအိတ်ကိုပြန်လည်ရယူပါ",
140 "color_theme": "အရောင်အပြင်အဆင်",
141 "commit_transaction_amount_fee": "ငွေလွှဲခြင်း\nပမာဏ- ${amount}\nအခကြေးငွေ- ${fee}",
142 "confirm": "အတည်ပြုပါ။",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "အဆက်အသွယ်များ",
162 "contact_list_wallets": "ကျွန်ုပ်၏ ပိုက်ဆံအိတ်များ",
163 "contact_name": "ဆက်သွယ်ရန်အမည်",
164 + "contact_name_exists": "ထိုအမည်နှင့် အဆက်အသွယ်တစ်ခု ရှိနှင့်ပြီးဖြစ်သည်။ အခြားအမည်တစ်ခုကို ရွေးပါ။",
165 "contact_support": "ပံ့ပိုးကူညီမှုထံ ဆက်သွယ်ပါ။",
166 "continue_text": "ဆက်လက်",
167 "contract_warning": "ဒီစာချုပ်လိပ်စာအလားအလာအလားအလာအလားအလာအလံများကိုအလံလွှင့်တင်ခဲ့သည်။ ကျေးဇူးပြုပြီးသတိဖြင့်လုပ်ငန်းစဉ်။",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "သက်တမ်းကုန်ဆုံးခြင်းနှင့်တရားဝင်မှု",
298 "export_backup": "အရန်ကူးထုတ်ရန်",
299 "export_logs": "ပို့ကုန်မှတ်တမ်းများ",
300 + "export_outputs": "ပို့ကုန်ထုတ်ကုန်များ",
301 "extra_id": "အပို ID-",
302 "extracted_address_content": "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်",
303 "failed_authentication": "အထောက်အထားစိစစ်ခြင်း မအောင်မြင်ပါ။. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "ဟေးဗင် ကိတ် ဝေါလက်",
339 "haven_app_wallet_text": "ဟေဗင်အတွက် အံ့ဩစရာကောင်းတဲ့ ပိုက်ဆံအုံး",
340 "help": "ကူညီပါ",
341 + "hidden_addresses": "လျှို့ဝှက်လိပ်စာများ",
342 "hidden_balance": "Hidden Balance",
343 + "hide": "သားရေ",
344 "hide_details": "အသေးစိတ်ကို ဝှက်ပါ။",
345 "high_contrast_theme": "အလင်းအမှောင် မြင့်မားသော အပြင်အဆင်",
346 "home_screen_settings": "ပင်မစခရင် ဆက်တင်များ",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "အရေးကြီးသည်။",
505 "prepaid_cards": "ကြိုတင်ငွေဖြည့်ကဒ်များ",
506 "prevent_screenshots": "ဖန်သားပြင်ဓာတ်ပုံများနှင့် မျက်နှာပြင်ရိုက်ကူးခြင်းကို တားဆီးပါ။",
507 + "primary_address": "အဓိကလိပ်စာ",
508 "privacy": "ကိုယ်ရေးကိုယ်တာ",
509 "privacy_policy": "ကိုယ်ရေးအချက်အလက်မူဝါဒ",
510 "privacy_settings": "Privacy settings တွေကို",
@@ -696,6 +701,7 @@
701 "share": "မျှဝေပါ။",
702 "share_address": "လိပ်စာမျှဝေပါ။",
703 "shared_seed_wallet_groups": "shared မျိုးစေ့ပိုက်ဆံအိတ်အုပ်စုများ",
704 + "show": "ပြသ",
705 "show_details": "အသေးစိတ်ပြ",
706 "show_keys": "မျိုးစေ့ /သော့များကို ပြပါ။",
707 "show_market_place": "စျေးကွက်ကိုပြသပါ။",
@@ -942,6 +948,5 @@
948 "you_pay": "သင်ပေးချေပါ။",
949 "you_will_get": "သို့ပြောင်းပါ။",
950 "you_will_send": "မှပြောင်းပါ။",
945 - "yy": "YY",
946 - "contact_name_exists": "ထိုအမည်နှင့် အဆက်အသွယ်တစ်ခု ရှိနှင့်ပြီးဖြစ်သည်။ အခြားအမည်တစ်ခုကို ရွေးပါ။"
947 -}
951 + "yy": "YY"
952 +}
\ No newline at end of file
res/values/strings_nl.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Clearnet-link",
137 "close": "Dichtbij",
138 "coin_control": "Muntcontrole (optioneel)",
139 - "cold_or_recover_wallet": "Voeg een cold wallet toe of herstel een paper wallet",
139 + "cold_or_recover_wallet": "Voeg een alleen-lezen portemonnee toe van Cupcake of een koude portemonnee of herstel een papieren portemonnee",
140 "color_theme": "Kleur thema",
141 "commit_transaction_amount_fee": "Verricht transactie\nBedrag: ${amount}\nhonorarium: ${fee}",
142 "confirm": "Bevestigen",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Contacten",
162 "contact_list_wallets": "Mijn portefeuilles",
163 "contact_name": "Contactnaam",
164 + "contact_name_exists": "Er bestaat al een contact met die naam. Kies een andere naam.",
165 "contact_support": "Contact opnemen met ondersteuning",
166 "continue_text": "Doorgaan met",
167 "contract_warning": "Dit contractadres is gemarkeerd als mogelijk frauduleus. Verwerk met voorzichtigheid.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Vervallen en geldigheid",
298 "export_backup": "Back-up exporteren",
299 "export_logs": "Exporteer logboeken",
300 + "export_outputs": "Exportuitgangen exporteren",
301 "extra_id": "Extra ID:",
302 "extracted_address_content": "U stuurt geld naar\n${recipient_name}",
303 "failed_authentication": "Mislukte authenticatie. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "helpen",
341 + "hidden_addresses": "Verborgen adressen",
342 "hidden_balance": "Verborgen balans",
343 + "hide": "Verbergen",
344 "hide_details": "Details verbergen",
345 "high_contrast_theme": "Thema met hoog contrast",
346 "home_screen_settings": "Instellingen voor het startscherm",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "BELANGRIJK",
505 "prepaid_cards": "Prepaid-kaarten",
506 "prevent_screenshots": "Voorkom screenshots en schermopname",
507 + "primary_address": "Primair adres",
508 "privacy": "Privacy",
509 "privacy_policy": "Privacybeleid",
510 "privacy_settings": "Privacy-instellingen",
@@ -696,6 +701,7 @@
701 "share": "Deel",
702 "share_address": "Deel adres",
703 "shared_seed_wallet_groups": "Gedeelde zaadportelgroepen",
704 + "show": "Show",
705 "show_details": "Toon details",
706 "show_keys": "Toon zaad/sleutels",
707 "show_market_place": "Toon Marktplaats",
@@ -943,6 +949,5 @@
949 "you_pay": "U betaalt",
950 "you_will_get": "Converteren naar",
951 "you_will_send": "Converteren van",
946 - "yy": "JJ",
947 - "contact_name_exists": "Er bestaat al een contact met die naam. Kies een andere naam."
948 -}
952 + "yy": "JJ"
953 +}
\ No newline at end of file
res/values/strings_pl.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "łącze Clearnet",
137 "close": "Zamknąć",
138 "coin_control": "Kontrola monet (opcjonalnie)",
139 - "cold_or_recover_wallet": "Dodaj zimny portfel lub odzyskaj portfel papierowy",
139 + "cold_or_recover_wallet": "Dodaj portfel tylko do odczytu od Cupcake lub zimnego portfela lub odzyskaj papierowy portfel",
140 "color_theme": "Motyw kolorystyczny",
141 "commit_transaction_amount_fee": "Zatwierdź transakcję\nIlość: ${amount}\nOpłata: ${fee}",
142 "confirm": "Potwierdzać",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Łączność",
162 "contact_list_wallets": "Moje portfele",
163 "contact_name": "Nazwa Kontaktu",
164 + "contact_name_exists": "Kontakt o tej nazwie już istnieje. Proszę wybrać inną nazwę.",
165 "contact_support": "Skontaktuj się z pomocą techniczną",
166 "continue_text": "Dalej",
167 "contract_warning": "Ten adres umowy został oznaczony jako potencjalnie nieuczciwy. Prosimy o ostrożność.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Wygaśnięcie i ważność",
298 "export_backup": "Eksportuj kopię zapasową",
299 "export_logs": "Dzienniki eksportu",
300 + "export_outputs": "Wyjścia eksportowe",
301 "extra_id": "Dodatkowy ID:",
302 "extracted_address_content": "Wysyłasz środki na\n${recipient_name}",
303 "failed_authentication": "Nieudane uwierzytelnienie. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "pomoc",
341 + "hidden_addresses": "Ukryte adresy",
342 "hidden_balance": "Ukryte saldo",
343 + "hide": "Ukrywać",
344 "hide_details": "Ukryj szczegóły",
345 "high_contrast_theme": "Motyw o wysokim kontraście",
346 "home_screen_settings": "Ustawienia ekranu głównego",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "WAŻNY",
505 "prepaid_cards": "Karty przedpłacone",
506 "prevent_screenshots": "Zapobiegaj zrzutom ekranu i nagrywaniu ekranu",
507 + "primary_address": "Adres podstawowy",
508 "privacy": "Prywatność",
509 "privacy_policy": "Polityka prywatności",
510 "privacy_settings": "Ustawienia prywatności",
@@ -696,6 +701,7 @@
701 "share": "Udział",
702 "share_address": "Udostępnij adres",
703 "shared_seed_wallet_groups": "Wspólne grupy portfeli nasion",
704 + "show": "Pokazywać",
705 "show_details": "Pokaż szczegóły",
706 "show_keys": "Pokaż seed/klucze",
707 "show_market_place": "Pokaż rynek",
@@ -942,6 +948,5 @@
948 "you_pay": "Płacisz",
949 "you_will_get": "Konwertuj na",
950 "you_will_send": "Konwertuj z",
945 - "yy": "RR",
946 - "contact_name_exists": "Kontakt o tej nazwie już istnieje. Proszę wybrać inną nazwę."
947 -}
951 + "yy": "RR"
952 +}
\ No newline at end of file
res/values/strings_pt.arb
+8 -2
@@ -136,7 +136,7 @@
136 "clearnet_link": "link clear net",
137 "close": "Fechar",
138 "coin_control": "Controle de moedas (opcional)",
139 - "cold_or_recover_wallet": "Adicione uma cold wallet ou recupere uma paper wallet",
139 + "cold_or_recover_wallet": "Adicione uma carteira somente leitura de Cupcake ou uma carteira fria ou recupere uma carteira de papel",
140 "color_theme": "Tema de cor",
141 "commit_transaction_amount_fee": "Confirmar transação\nQuantia: ${amount}\nTaxa: ${fee}",
142 "confirm": "Confirmar",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Contatos",
162 "contact_list_wallets": "minhas carteiras",
163 "contact_name": "Nome do contato",
164 + "contact_name_exists": "Um contato com esse nome já existe. Escolha um nome diferente.",
165 "contact_support": "Contatar Suporte",
166 "continue_text": "Continuar",
167 "contract_warning": "Este endereço do contrato foi sinalizado como potencialmente fraudulento. Por favor, processe com cautela.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Expiração e validade",
298 "export_backup": "Backup de exportação",
299 "export_logs": "Exportar logs",
300 + "export_outputs": "Saídas de exportação",
301 "extra_id": "ID extra:",
302 "extracted_address_content": "Você enviará fundos para\n${recipient_name}",
303 "failed_authentication": "Falha na autenticação. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "ajuda",
341 + "hidden_addresses": "Endereços ocultos",
342 "hidden_balance": "Saldo escondido",
343 + "hide": "Esconder",
344 "hide_details": "Ocultar detalhes",
345 "high_contrast_theme": "Tema de alto contraste",
346 "home_screen_settings": "Configurações da tela inicial",
@@ -502,6 +506,7 @@
506 "pre_seed_title": "IMPORTANTE",
507 "prepaid_cards": "Cartões pré-pagos",
508 "prevent_screenshots": "Evite capturas de tela e gravação de tela",
509 + "primary_address": "Endereço primário",
510 "privacy": "Privacidade",
511 "privacy_policy": "Política de privacidade",
512 "privacy_settings": "Configurações de privacidade",
@@ -698,6 +703,7 @@
703 "share": "Compartilhar",
704 "share_address": "Compartilhar endereço",
705 "shared_seed_wallet_groups": "Grupos de carteira de sementes compartilhados",
706 + "show": "Mostrar",
707 "show_details": "Mostrar detalhes",
708 "show_keys": "Mostrar semente/chaves",
709 "show_market_place": "Mostrar mercado",
@@ -946,4 +952,4 @@
952 "you_will_get": "Converter para",
953 "you_will_send": "Converter de",
954 "yy": "aa"
949 -}
955 +}
\ No newline at end of file
res/values/strings_ru.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Клирнет ссылка",
137 "close": "Закрывать",
138 "coin_control": "Контроль монет (необязательно)",
139 - "cold_or_recover_wallet": "Добавьте холодный кошелек или восстановите бумажный кошелек",
139 + "cold_or_recover_wallet": "Добавить кошелек только для чтения из Cupcake или холодный кошелек или восстановить бумажный кошелек",
140 "color_theme": "Цветовая тема",
141 "commit_transaction_amount_fee": "Подтвердить транзакцию \nСумма: ${amount}\nКомиссия: ${fee}",
142 "confirm": "Подтвердить",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Контакты",
162 "contact_list_wallets": "Мои кошельки",
163 "contact_name": "Имя контакта",
164 + "contact_name_exists": "Контакт с таким именем уже существует. Пожалуйста, выберите другое имя.",
165 "contact_support": "Связаться со службой поддержки",
166 "continue_text": "Продолжить",
167 "contract_warning": "Этот адрес контракта был отмечен как потенциально мошеннический. Пожалуйста, обработайтесь с осторожностью.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Истечение и достоверность",
298 "export_backup": "Экспорт резервной копии",
299 "export_logs": "Экспортные журналы",
300 + "export_outputs": "Экспортные выходы",
301 "extra_id": "Дополнительный ID:",
302 "extracted_address_content": "Вы будете отправлять средства\n${recipient_name}",
303 "failed_authentication": "Ошибка аутентификации. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "помощь",
341 + "hidden_addresses": "Скрытые адреса",
342 "hidden_balance": "Скрытый баланс",
343 + "hide": "Скрывать",
344 "hide_details": "Скрыть детали",
345 "high_contrast_theme": "Высококонтрастная тема",
346 "home_screen_settings": "Настройки главного экрана",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "ВАЖНО",
506 "prepaid_cards": "Предоплаченные карты",
507 "prevent_screenshots": "Предотвратить скриншоты и запись экрана",
508 + "primary_address": "Первичный адрес",
509 "privacy": "Конфиденциальность",
510 "privacy_policy": "Политика конфиденциальности",
511 "privacy_settings": "Настройки конфиденциальности",
@@ -697,6 +702,7 @@
702 "share": "Делиться",
703 "share_address": "Поделиться адресом",
704 "shared_seed_wallet_groups": "Общие группы кошелька семян",
705 + "show": "Показывать",
706 "show_details": "Показать детали",
707 "show_keys": "Показать мнемоническую фразу/ключи",
708 "show_market_place": "Показать торговую площадку",
@@ -943,6 +949,5 @@
949 "you_pay": "Вы платите",
950 "you_will_get": "Конвертировать в",
951 "you_will_send": "Конвертировать из",
946 - "yy": "ГГ",
947 - "contact_name_exists": "Контакт с таким именем уже существует. Пожалуйста, выберите другое имя."
948 -}
952 + "yy": "ГГ"
953 +}
\ No newline at end of file
res/values/strings_th.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "ลิงค์เคลียร์เน็ต",
137 "close": "ปิด",
138 "coin_control": "การควบคุมเหรียญ (ตัวเลือก)",
139 - "cold_or_recover_wallet": "เพิ่มกระเป๋าเงินเย็นหรือกู้คืนกระเป๋าเงินกระดาษ",
139 + "cold_or_recover_wallet": "เพิ่มกระเป๋าเงินแบบอ่านอย่างเดียวจาก Cupcake หรือกระเป๋าเงินเย็นหรือกู้คืนกระเป๋ากระดาษ",
140 "color_theme": "ธีมสี",
141 "commit_transaction_amount_fee": "ยืนยันธุรกรรม\nจำนวน: ${amount}\nค่าธรรมเนียม: ${fee}",
142 "confirm": "ยืนยัน",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "ติดต่อ",
162 "contact_list_wallets": "กระเป๋าเงินของฉัน",
163 "contact_name": "ชื่อผู้ติดต่อ",
164 + "contact_name_exists": "มีผู้ติดต่อชื่อนั้นอยู่แล้ว โปรดเลือกชื่ออื่น",
165 "contact_support": "ติดต่อฝ่ายสนับสนุน",
166 "continue_text": "ดำเนินการต่อ",
167 "contract_warning": "ที่อยู่สัญญานี้ได้รับการตั้งค่าสถานะว่าเป็นการฉ้อโกง กรุณาดำเนินการด้วยความระมัดระวัง",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "หมดอายุและถูกต้อง",
298 "export_backup": "ส่งออกข้อมูลสำรอง",
299 "export_logs": "บันทึกการส่งออก",
300 + "export_outputs": "เอาต์พุตส่งออก",
301 "extra_id": "ไอดีเพิ่มเติม:",
302 "extracted_address_content": "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}",
303 "failed_authentication": "การยืนยันสิทธิ์ล้มเหลว ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven ของ Cake Wallet",
339 "haven_app_wallet_text": "กระเป๋าสตางค์ที่สวยงามสำหรับ Haven",
340 "help": "ช่วยเหลือ",
341 + "hidden_addresses": "ที่อยู่ที่ซ่อนอยู่",
342 "hidden_balance": "ยอดคงเหลือซ่อนอยู่",
343 + "hide": "ซ่อน",
344 "hide_details": "ซ่อนรายละเอียด",
345 "high_contrast_theme": "ธีมความคมชัดสูง",
346 "home_screen_settings": "การตั้งค่าหน้าจอหลัก",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "สำคัญ",
505 "prepaid_cards": "บัตรเติมเงิน",
506 "prevent_screenshots": "ป้องกันภาพหน้าจอและการบันทึกหน้าจอ",
507 + "primary_address": "ที่อยู่ปฐมภูมิ",
508 "privacy": "ความเป็นส่วนตัว",
509 "privacy_policy": "นโยบายความเป็นส่วนตัว",
510 "privacy_settings": "การตั้งค่าความเป็นส่วนตัว",
@@ -696,6 +701,7 @@
701 "share": "แบ่งปัน",
702 "share_address": "แชร์ที่อยู่",
703 "shared_seed_wallet_groups": "กลุ่มกระเป๋าเงินที่ใช้ร่วมกัน",
704 + "show": "แสดง",
705 "show_details": "แสดงรายละเอียด",
706 "show_keys": "แสดงซีด/คีย์",
707 "show_market_place": "แสดงตลาดกลาง",
@@ -942,6 +948,5 @@
948 "you_pay": "คุณจ่าย",
949 "you_will_get": "แปลงเป็น",
950 "you_will_send": "แปลงจาก",
945 - "yy": "ปี",
946 - "contact_name_exists": "มีผู้ติดต่อชื่อนั้นอยู่แล้ว โปรดเลือกชื่ออื่น"
947 -}
951 + "yy": "ปี"
952 +}
\ No newline at end of file
res/values/strings_tl.arb
+8 -2
@@ -136,7 +136,7 @@
136 "clearnet_link": "Link ng Clearnet",
137 "close": "Isara",
138 "coin_control": "Coin control (opsyonal)",
139 - "cold_or_recover_wallet": "Magdagdag ng isang cold wallet o mabawi ang isang paper wallet",
139 + "cold_or_recover_wallet": "Magdagdag ng isang basahin lamang na pitaka mula sa Cupcake o isang malamig na pitaka o mabawi ang isang wallet ng papel",
140 "color_theme": "Color theme",
141 "commit_transaction_amount_fee": "Gumawa ng transaksyon\nHalaga: ${amount}\nFee: ${fee}",
142 "confirm": "Kumpirmahin",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Mga Contact",
162 "contact_list_wallets": "Mga Wallet Ko",
163 "contact_name": "Pangalan ng Contact",
164 + "contact_name_exists": "Ang isang pakikipag -ugnay sa pangalang iyon ay mayroon na. Mangyaring pumili ng ibang pangalan.",
165 "contact_support": "Makipag-ugnay sa Suporta",
166 "continue_text": "Magpatuloy",
167 "contract_warning": "Ang address ng kontrata na ito ay na -flag bilang potensyal na mapanlinlang. Mangyaring iproseso nang may pag -iingat.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Pag-expire at Bisa",
298 "export_backup": "I-export ang backup",
299 "export_logs": "Mga log ng pag -export",
300 + "export_outputs": "Mga output ng pag -export",
301 "extra_id": "Dagdag na ID:",
302 "extracted_address_content": "Magpapadala ka ng pondo sa\n${recipient_name}",
303 "failed_authentication": "Nabigo ang pagpapatunay. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Kahanga-hangang wallet para sa Haven",
340 "help": "Tulong",
341 + "hidden_addresses": "Nakatagong mga address",
342 "hidden_balance": "Nakatagong Balanse",
343 + "hide": "Itago",
344 "hide_details": "Itago ang mga detalye",
345 "high_contrast_theme": "High Contrast Theme",
346 "home_screen_settings": "Mga setting ng home screen",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "Mahalaga",
505 "prepaid_cards": "Mga Prepaid Card",
506 "prevent_screenshots": "Maiwasan ang mga screenshot at pag -record ng screen",
507 + "primary_address": "Pangunahing address",
508 "privacy": "Privacy",
509 "privacy_policy": "Patakaran sa Pagkapribado",
510 "privacy_settings": "Settings para sa pagsasa-pribado",
@@ -696,6 +701,7 @@
701 "share": "Ibahagi",
702 "share_address": "Ibahagi ang address",
703 "shared_seed_wallet_groups": "Ibinahaging mga pangkat ng pitaka ng binhi",
704 + "show": "Ipakita",
705 "show_details": "Ipakita ang mga detalye",
706 "show_keys": "Ipakita ang mga seed/key",
707 "show_market_place": "Ipakita ang Marketplace",
@@ -943,4 +949,4 @@
949 "you_will_get": "I-convert sa",
950 "you_will_send": "I-convert mula sa",
951 "yy": "YY"
946 -}
952 +}
\ No newline at end of file
res/values/strings_tr.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Net bağlantı",
137 "close": "Kapalı",
138 "coin_control": "Koin kontrolü (isteğe bağlı)",
139 - "cold_or_recover_wallet": "Soğuk bir cüzdan ekleyin veya bir kağıt cüzdanı kurtarın",
139 + "cold_or_recover_wallet": "Cupcake veya soğuk bir cüzdandan salt okunur bir cüzdan ekleyin veya bir kağıt cüzdanı kurtar",
140 "color_theme": "Renk teması",
141 "commit_transaction_amount_fee": "Transferi gerçekleştir\nMiktar: ${amount}\nKomisyon: ${fee}",
142 "confirm": "Onayla",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Rehberim",
162 "contact_list_wallets": "Cüzdanlarım",
163 "contact_name": "Kişi ismi",
164 + "contact_name_exists": "Bu isimde bir kişi zaten mevcut. Lütfen farklı bir ad seçin.",
165 "contact_support": "Destek ile İletişime Geç",
166 "continue_text": "Devam et",
167 "contract_warning": "Bu sözleşme adresi potansiyel olarak hileli olarak işaretlenmiştir. Lütfen dikkatle işleyin.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Sona erme ve geçerlilik",
298 "export_backup": "Yedeği dışa aktar",
299 "export_logs": "Dışa aktarma günlükleri",
300 + "export_outputs": "İhracat çıktıları",
301 "extra_id": "Ekstra ID:",
302 "extracted_address_content": "Parayı buraya gönderceksin:\n${recipient_name}",
303 "failed_authentication": "Doğrulama başarısız oldu. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Cake Wallet tarafından Haven",
339 "haven_app_wallet_text": "Haven için harika cüzdan ",
340 "help": "yardım",
341 + "hidden_addresses": "Gizli adresler",
342 "hidden_balance": "Gizli Bakiye",
343 + "hide": "Saklamak",
344 "hide_details": "Detayları Gizle",
345 "high_contrast_theme": "Yüksek Kontrastlı Tema",
346 "home_screen_settings": "Ana ekran ayarları",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "UYARI",
505 "prepaid_cards": "Ön ödemeli kartlar",
506 "prevent_screenshots": "Ekran görüntülerini ve ekran kaydını önleyin",
507 + "primary_address": "Birincil adres",
508 "privacy": "Gizlilik",
509 "privacy_policy": "Gizlilik Politikası",
510 "privacy_settings": "Gizlilik ayarları",
@@ -696,6 +701,7 @@
701 "share": "Paylaşmak",
702 "share_address": "Adresi paylaş",
703 "shared_seed_wallet_groups": "Paylaşılan tohum cüzdan grupları",
704 + "show": "Göstermek",
705 "show_details": "Detayları Göster",
706 "show_keys": "Tohumları/anahtarları göster",
707 "show_market_place": "Pazar Yerini Göster",
@@ -942,6 +948,5 @@
948 "you_pay": "Şu kadar ödeyeceksin: ",
949 "you_will_get": "Biçimine dönüştür:",
950 "you_will_send": "Biçiminden dönüştür:",
945 - "yy": "YY",
946 - "contact_name_exists": "Bu isimde bir kişi zaten mevcut. Lütfen farklı bir ad seçin."
947 -}
951 + "yy": "YY"
952 +}
\ No newline at end of file
res/values/strings_uk.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Посилання Clearnet",
137 "close": "Закрити",
138 "coin_control": "Контроль монет (необов’язково)",
139 - "cold_or_recover_wallet": "Додайте холодний гаманець або відновіть паперовий гаманець",
139 + "cold_or_recover_wallet": "Додайте гаманець лише для читання від Cupcake або холодного гаманця або відновіть паперовий гаманець",
140 "color_theme": "Кольорова тема",
141 "commit_transaction_amount_fee": "Підтвердити транзакцію \nСума: ${amount}\nКомісія: ${fee}",
142 "confirm": "Підтвердити",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Контакти",
162 "contact_list_wallets": "Мої гаманці",
163 "contact_name": "Ім'я контакту",
164 + "contact_name_exists": "Контакт із такою назвою вже існує. Виберіть інше ім'я.",
165 "contact_support": "Звернутися до служби підтримки",
166 "continue_text": "Продовжити",
167 "contract_warning": "Ця адреса контракту була позначена як потенційно шахрайська. Будь ласка, обробляйте обережно.",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "Закінчення та обгрунтованість",
298 "export_backup": "Експортувати резервну копію",
299 "export_logs": "Експортні журнали",
300 + "export_outputs": "Експортні результати",
301 "extra_id": "Додатковий ID:",
302 "extracted_address_content": "Ви будете відправляти кошти\n${recipient_name}",
303 "failed_authentication": "Помилка аутентифікації. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "допомога",
341 + "hidden_addresses": "Приховані адреси",
342 "hidden_balance": "Прихований баланс",
343 + "hide": "Сховати",
344 "hide_details": "Приховати деталі",
345 "high_contrast_theme": "Тема високої контрастності",
346 "home_screen_settings": "Налаштування головного екрана",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "ВАЖЛИВО",
505 "prepaid_cards": "Передплачені картки",
506 "prevent_screenshots": "Запобігати знімкам екрана та запису екрана",
507 + "primary_address": "Первинна адреса",
508 "privacy": "Конфіденційність",
509 "privacy_policy": "Політика конфіденційності",
510 "privacy_settings": "Налаштування конфіденційності",
@@ -697,6 +702,7 @@
702 "share": "Поділіться",
703 "share_address": "Поділитися адресою",
704 "shared_seed_wallet_groups": "Спільні групи насіннєвих гаманців",
705 + "show": "Показувати",
706 "show_details": "Показати деталі",
707 "show_keys": "Показати мнемонічну фразу/ключі",
708 "show_market_place": "Відображати маркетплейс",
@@ -943,6 +949,5 @@
949 "you_pay": "Ви платите",
950 "you_will_get": "Конвертувати в",
951 "you_will_send": "Конвертувати з",
946 - "yy": "YY",
947 - "contact_name_exists": "Контакт із такою назвою вже існує. Виберіть інше ім'я."
948 -}
952 + "yy": "YY"
953 +}
\ No newline at end of file
res/values/strings_ur.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "کلیرنیٹ لنک",
137 "close": "بند کریں",
138 "coin_control": "سکے کنٹرول (اختیاری)",
139 - "cold_or_recover_wallet": "ٹھنڈا پرس ڈالیں یا کاغذ کا پرس بازیافت کریں",
139 + "cold_or_recover_wallet": "Cupcake یا سرد بٹوے سے صرف ایک پڑھنے والا پرس شامل کریں یا کاغذ کا پرس بازیافت کریں",
140 "color_theme": "رنگین تھیم",
141 "commit_transaction_amount_fee": "لین دین کا ارتکاب کریں\\nرقم: ${amount}\\nفیس: ${fee}",
142 "confirm": "تصدیق کریں۔",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "رابطے",
162 "contact_list_wallets": "میرے بٹوے",
163 "contact_name": "رابطے کا نام",
164 + "contact_name_exists": " ۔ﮟﯾﺮﮐ ﺐﺨﺘﻨﻣ ﻡﺎﻧ ﻒﻠﺘﺨﻣ ﮏﯾﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ۔ﮯﮨ ﺩﻮﺟﻮﻣ ﮯﺳ ﮯﻠﮩﭘ ﮧﻄﺑﺍﺭ ﮏﯾﺍ ﮫﺗﺎﺳ ﮯﮐ ﻡﺎﻧ ﺱﺍ",
165 "contact_support": "سپورٹ سے رابطہ کریں۔",
166 "continue_text": "جاری رہے",
167 "contract_warning": "اس معاہدے کے پتے کو ممکنہ طور پر جعلی قرار دیا گیا ہے۔ براہ کرم احتیاط کے ساتھ کارروائی کریں۔",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "میعاد ختم اور صداقت",
298 "export_backup": "بیک اپ برآمد کریں۔",
299 "export_logs": "نوشتہ جات برآمد کریں",
300 + "export_outputs": "برآمد کے نتائج",
301 "extra_id": "اضافی ID:",
302 "extracted_address_content": "آپ فنڈز بھیج رہے ہوں گے\n${recipient_name}",
303 "failed_authentication": "ناکام تصدیق۔ ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven از Cake والیٹ",
339 "haven_app_wallet_text": "Havek کے لیے زبردست پرس",
340 "help": "مدد",
341 + "hidden_addresses": "پوشیدہ پتے",
342 "hidden_balance": "پوشیدہ بیلنس",
343 + "hide": "چھپائیں",
344 "hide_details": "تفصیلات چھپائیں۔",
345 "high_contrast_theme": "ہائی کنٹراسٹ تھیم",
346 "home_screen_settings": "ہوم اسکرین کی ترتیبات",
@@ -502,6 +506,7 @@
506 "pre_seed_title": "اہم",
507 "prepaid_cards": "پری پیڈ کارڈز",
508 "prevent_screenshots": "اسکرین شاٹس اور اسکرین ریکارڈنگ کو روکیں۔",
509 + "primary_address": "بنیادی پتہ",
510 "privacy": "رازداری",
511 "privacy_policy": "رازداری کی پالیسی",
512 "privacy_settings": "رازداری کی ترتیبات",
@@ -698,6 +703,7 @@
703 "share": "بانٹیں",
704 "share_address": "پتہ شیئر کریں۔",
705 "shared_seed_wallet_groups": "مشترکہ بیج پرس گروپ",
706 + "show": "دکھائیں",
707 "show_details": "تفصیلات دکھائیں",
708 "show_keys": "بیج / چابیاں دکھائیں۔",
709 "show_market_place": "بازار دکھائیں۔",
@@ -944,6 +950,5 @@
950 "you_pay": "تم ادا کرو",
951 "you_will_get": "میں تبدیل کریں۔",
952 "you_will_send": "سے تبدیل کریں۔",
947 - "yy": "YY",
948 - "contact_name_exists": " ۔ﮟﯾﺮﮐ ﺐﺨﺘﻨﻣ ﻡﺎﻧ ﻒﻠﺘﺨﻣ ﮏﯾﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ۔ﮯﮨ ﺩﻮﺟﻮﻣ ﮯﺳ ﮯﻠﮩﭘ ﮧﻄﺑﺍﺭ ﮏﯾﺍ ﮫﺗﺎﺳ ﮯﮐ ﻡﺎﻧ ﺱﺍ"
949 -}
953 + "yy": "YY"
954 +}
\ No newline at end of file
res/values/strings_vi.arb
+15 -1
@@ -136,7 +136,7 @@
136 "clearnet_link": "Liên kết Clearnet",
137 "close": "Đóng",
138 "coin_control": "Kiểm soát đồng xu (tùy chọn)",
139 - "cold_or_recover_wallet": "Thêm ví lạnh hoặc khôi phục ví giấy",
139 + "cold_or_recover_wallet": "Thêm ví chỉ đọc từ Cupcake hoặc ví lạnh hoặc thu hồi ví giấy",
140 "color_theme": "Chủ đề màu sắc",
141 "commit_transaction_amount_fee": "Cam kết giao dịch\nSố tiền: ${amount}\nPhí: ${fee}",
142 "confirm": "Xác nhận",
@@ -162,6 +162,7 @@
162 "contact_list_contacts": "Danh bạ",
163 "contact_list_wallets": "Ví của tôi",
164 "contact_name": "Tên liên hệ",
165 + "contact_name_exists": "Một liên hệ với cái tên đó đã tồn tại. Vui lòng chọn một tên khác.",
166 "contact_support": "Liên hệ Hỗ trợ",
167 "continue_text": "Tiếp tục",
168 "contract_warning": "Địa chỉ hợp đồng này đã được gắn cờ là có khả năng lừa đảo. Vui lòng xử lý một cách thận trọng.",
@@ -297,6 +298,7 @@
298 "expiry_and_validity": "Hạn và hiệu lực",
299 "export_backup": "Xuất sao lưu",
300 "export_logs": "Nhật ký xuất khẩu",
301 + "export_outputs": "Đầu ra xuất khẩu",
302 "extra_id": "ID bổ sung:",
303 "extracted_address_content": "Bạn sẽ gửi tiền cho\n${recipient_name}",
304 "failed_authentication": "Xác thực không thành công. ${state_error}",
@@ -337,7 +339,9 @@
339 "haven_app": "Haven bởi Cake Wallet",
340 "haven_app_wallet_text": "Ví tuyệt vời cho Haven",
341 "help": "Trợ giúp",
342 + "hidden_addresses": "Địa chỉ ẩn",
343 "hidden_balance": "Số dư ẩn",
344 + "hide": "Trốn",
345 "hide_details": "Ẩn chi tiết",
346 "high_contrast_theme": "Chủ đề độ tương phản cao",
347 "home_screen_settings": "Cài đặt màn hình chính",
@@ -367,14 +371,22 @@
371 "ledger_error_wrong_app": "Vui lòng đảm bảo bạn đã mở đúng ứng dụng trên Ledger của mình",
372 "ledger_please_enable_bluetooth": "Vui lòng bật Bluetooth để phát hiện Ledger của bạn",
373 "light_theme": "Chủ đề sáng",
374 + "litecoin_enable_mweb_sync": "Bật quét MWEB",
375 + "litecoin_mweb": "Mweb",
376 + "litecoin_mweb_always_scan": "Đặt MWEB luôn quét",
377 "litecoin_mweb_description": "MWEB là một giao thức mới mang lại các giao dịch nhanh hơn, rẻ hơn và riêng tư hơn cho Litecoin",
378 "litecoin_mweb_dismiss": "Miễn nhiệm",
379 + "litecoin_mweb_display_card": "Hiển thị thẻ MWEB",
380 "litecoin_mweb_enable": "Bật MWEB",
381 "litecoin_mweb_enable_later": "Bạn có thể chọn bật lại MWEB trong cài đặt hiển thị.",
382 "litecoin_mweb_logs": "Nhật ký MWEB",
383 "litecoin_mweb_node": "Nút MWEB",
384 "litecoin_mweb_pegin": "Chốt vào",
385 "litecoin_mweb_pegout": "Chốt ra",
386 + "litecoin_mweb_scanning": "Quét MWEB",
387 + "litecoin_mweb_settings": "Cài đặt MWEB",
388 + "litecoin_mweb_warning": "Sử dụng MWEB ban đầu sẽ tải xuống ~ 600MB dữ liệu và có thể mất tới 30 phút tùy thuộc vào tốc độ mạng. Dữ liệu ban đầu này sẽ chỉ tải xuống một lần và có sẵn cho tất cả các ví Litecoin",
389 + "litecoin_what_is_mweb": "MWEB là gì?",
390 "live_fee_rates": "Tỷ lệ phí hiện tại qua API",
391 "load_more": "Tải thêm",
392 "loading_your_wallet": "Đang tải ví của bạn",
@@ -493,6 +505,7 @@
505 "pre_seed_title": "QUAN TRỌNG",
506 "prepaid_cards": "Thẻ trả trước",
507 "prevent_screenshots": "Ngăn chặn ảnh chụp màn hình và ghi hình màn hình",
508 + "primary_address": "Địa chỉ chính",
509 "privacy": "Quyền riêng tư",
510 "privacy_policy": "Chính sách quyền riêng tư",
511 "privacy_settings": "Cài đặt quyền riêng tư",
@@ -689,6 +702,7 @@
702 "share": "Chia sẻ",
703 "share_address": "Chia sẻ địa chỉ",
704 "shared_seed_wallet_groups": "Nhóm ví hạt được chia sẻ",
705 + "show": "Trình diễn",
706 "show_details": "Hiển thị chi tiết",
707 "show_keys": "Hiển thị hạt giống/khóa",
708 "show_market_place": "Hiển thị Thị trường",
res/values/strings_yo.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "Kọja ilọ oke",
137 "close": "sunmo",
138 "coin_control": "Ìdarí owó ẹyọ (ìyàn nìyí)",
139 - "cold_or_recover_wallet": "Fi owo aisan tabi yiyewo owo iwe iwe",
139 + "cold_or_recover_wallet": "Ṣafikun apamọwọ kika-nikan lati Cupcake tabi apamọwọ tutu tabi gba owo apamọwọ iwe kan",
140 "color_theme": "Àwọn ààtò àwọ̀",
141 "commit_transaction_amount_fee": "Jẹ́rìí sí àránṣẹ́\nOwó: ${amount}\nIye àfikún: ${fee}",
142 "confirm": "Jẹ́rìísí",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "Àwọn olùbásọ̀rọ̀",
162 "contact_list_wallets": "Àwọn àpamọ́wọ́ mi",
163 "contact_name": "Orúkọ olùbásọ̀rọ̀",
164 + "contact_name_exists": "Olubasọrọ pẹlu orukọ yẹn ti wa tẹlẹ. Jọwọ yan orukọ ti o yatọ.",
165 "contact_support": "Bá ìranlọ́wọ́ sọ̀rọ̀",
166 "continue_text": "Tẹ̀síwájú",
167 "contract_warning": "Adirẹsi adehun adehun yii ti samisi bi arekereke. Jọwọ ṣe ilana pẹlu iṣọra.",
@@ -297,6 +298,7 @@
298 "expiry_and_validity": "Ipari ati idaniloju",
299 "export_backup": "Sún ẹ̀dà nípamọ́ síta",
300 "export_logs": "Wọle si okeere",
301 + "export_outputs": "Agbohunlu okeere",
302 "extra_id": "Àmì ìdánimọ̀ tó fikún:",
303 "extracted_address_content": "Ẹ máa máa fi owó ránṣẹ́ sí\n${recipient_name}",
304 "failed_authentication": "Ìfẹ̀rílàdí pipòfo. ${state_error}",
@@ -337,7 +339,9 @@
339 "haven_app": "Haven latí ọwọ́ Cake Wallet",
340 "haven_app_wallet_text": "Àpamọ́wọ́ Haven wà pa",
341 "help": "ìranlọ́wọ́",
342 + "hidden_addresses": "Awọn adirẹsi ti o farapamọ",
343 "hidden_balance": "Ìyókù owó dídé",
344 + "hide": "Pamọ",
345 "hide_details": "Dé ìsọfúnni kékeré",
346 "high_contrast_theme": "Akori Iyatọ giga",
347 "home_screen_settings": "Awọn eto iboju ile",
@@ -501,6 +505,7 @@
505 "pre_seed_title": "Ó TI ṢE PÀTÀKÌ",
506 "prepaid_cards": "Awọn kaadi ti a ti sanwo",
507 "prevent_screenshots": "Pese asapọ ti awọn ẹrọ eto aṣa",
508 + "primary_address": "Adirẹsi akọkọ",
509 "privacy": "Ìdáwà",
510 "privacy_policy": "Òfin Aládàáni",
511 "privacy_settings": "Ààtò àdáni",
@@ -697,6 +702,7 @@
702 "share": "Pinpin",
703 "share_address": "Pín àdírẹ́sì",
704 "shared_seed_wallet_groups": "Awọn ẹgbẹ ti a pin irugbin",
705 + "show": "Fihan",
706 "show_details": "Fi ìsọfúnni kékeré hàn",
707 "show_keys": "Wo hóró / àwọn kọ́kọ́rọ́",
708 "show_market_place": "Wa Sopọ Pataki",
@@ -943,6 +949,5 @@
949 "you_pay": "Ẹ sàn",
950 "you_will_get": "Ṣe pàṣípààrọ̀ sí",
951 "you_will_send": "Ṣe pàṣípààrọ̀ láti",
946 - "yy": "Ọd",
947 - "contact_name_exists": "Olubasọrọ pẹlu orukọ yẹn ti wa tẹlẹ. Jọwọ yan orukọ ti o yatọ."
948 -}
952 + "yy": "Ọd"
953 +}
\ No newline at end of file
res/values/strings_zh.arb
+9 -4
@@ -136,7 +136,7 @@
136 "clearnet_link": "明网链接",
137 "close": "关闭",
138 "coin_control": "硬幣控制(可選)",
139 - "cold_or_recover_wallet": "添加冷钱包或恢复纸钱包",
139 + "cold_or_recover_wallet": "从Cupcake或冷钱包中添加只读的钱包或恢复纸钱包",
140 "color_theme": "主题",
141 "commit_transaction_amount_fee": "提交交易\n金额: ${amount}\n手续费: ${fee}",
142 "confirm": "确认",
@@ -161,6 +161,7 @@
161 "contact_list_contacts": "联系人",
162 "contact_list_wallets": "我的钱包",
163 "contact_name": "联系人姓名",
164 + "contact_name_exists": "已存在具有该名称的联系人。请选择不同的名称。",
165 "contact_support": "联系支持",
166 "continue_text": "继续",
167 "contract_warning": "该合同地址已被标记为潜在的欺诈性。请谨慎处理。",
@@ -296,6 +297,7 @@
297 "expiry_and_validity": "到期和有效性",
298 "export_backup": "导出备份",
299 "export_logs": "导出日志",
300 + "export_outputs": "导出输出",
301 "extra_id": "额外ID:",
302 "extracted_address_content": "您将汇款至\n${recipient_name}",
303 "failed_authentication": "身份验证失败. ${state_error}",
@@ -336,7 +338,9 @@
338 "haven_app": "Haven by Cake Wallet",
339 "haven_app_wallet_text": "Awesome wallet for Haven",
340 "help": "帮助",
341 + "hidden_addresses": "隐藏的地址",
342 "hidden_balance": "隐藏余额",
343 + "hide": "隐藏",
344 "hide_details": "隐藏细节",
345 "high_contrast_theme": "高对比度主题",
346 "home_screen_settings": "主屏幕设置",
@@ -500,6 +504,7 @@
504 "pre_seed_title": "重要",
505 "prepaid_cards": "预付费卡",
506 "prevent_screenshots": "防止截屏和录屏",
507 + "primary_address": "主要地址",
508 "privacy": "隐私",
509 "privacy_policy": "隐私政策",
510 "privacy_settings": "隐私设置",
@@ -696,6 +701,7 @@
701 "share": "分享",
702 "share_address": "分享地址",
703 "shared_seed_wallet_groups": "共享种子钱包组",
704 + "show": "展示",
705 "show_details": "显示详细信息",
706 "show_keys": "显示种子/密钥",
707 "show_market_place": "显示市场",
@@ -942,6 +948,5 @@
948 "you_pay": "你付钱",
949 "you_will_get": "转换到",
950 "you_will_send": "转换自",
945 - "yy": "YY",
946 - "contact_name_exists": "已存在具有该名称的联系人。请选择不同的名称。"
947 -}
951 + "yy": "YY"
952 +}
\ No newline at end of file
scripts/macos/gen_common.sh
+2 -2
@@ -9,7 +9,7 @@ gen_podspec() {
9 DEFAULT_FILE_PATH="${CW_PLUGIN_DIR}/${DEFAULT_FILENAME}"
10 rm -f $DEFAULT_FILE_PATH
11 cp $BASE_FILE_PATH $DEFAULT_FILE_PATH
12 - sed -i '' "s/#___VALID_ARCHS___#/${ARCH}/g" $DEFAULT_FILE_PATH
12 + gsed -i "s/#___VALID_ARCHS___#/${ARCH}/g" $DEFAULT_FILE_PATH
13 }
14
15 gen_project() {
@@ -17,7 +17,7 @@ gen_project() {
17 CW_DIR="`pwd`/../../macos/Runner.xcodeproj"
18 DEFAULT_FILENAME="project.pbxproj"
19 DEFAULT_FILE_PATH="${CW_DIR}/${DEFAULT_FILENAME}"
20 - sed -i '' "s/ARCHS =.*/ARCHS = \"${ARCH}\";/g" $DEFAULT_FILE_PATH
20 + gsed -i "s/ARCHS =.*/ARCHS = \"${ARCH}\";/g" $DEFAULT_FILE_PATH
21 }
22
23 gen() {
tool/configure.dart
+8
@@ -276,6 +276,7 @@ import 'package:cw_core/get_height_by_date.dart';
276 import 'package:cw_core/monero_amount_format.dart';
277 import 'package:cw_core/monero_transaction_priority.dart';
278 import 'package:cw_monero/monero_unspent.dart';
279 +import 'package:cw_monero/api/account_list.dart';
280 import 'package:cw_monero/monero_wallet_service.dart';
281 import 'package:cw_monero/api/wallet_manager.dart';
282 import 'package:cw_monero/monero_wallet.dart';
@@ -379,6 +380,12 @@ abstract class Monero {
380
381 Future<int> getCurrentHeight();
382
383 + Future<bool> commitTransactionUR(Object wallet, String ur);
384 +
385 + String exportOutputsUR(Object wallet, bool all);
386 +
387 + bool importKeyImagesUR(Object wallet, String ur);
388 +
389 WalletCredentials createMoneroRestoreWalletFromKeysCredentials({
390 required String name,
391 required String spendKey,
@@ -398,6 +405,7 @@ abstract class Monero {
405 int formatterMoneroParseAmount({required String amount});
406 Account getCurrentAccount(Object wallet);
407 void monerocCheck();
408 + bool isViewOnly();
409 void setCurrentAccount(Object wallet, int id, String label, String? balance);
410 void onStartup();
411 int getTransactionInfoAccountId(TransactionInfo tx);
windows/flutter/generated_plugins.cmake
-1
@@ -13,7 +13,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
13 )
14
15 list(APPEND FLUTTER_FFI_PLUGIN_LIST
16 - sp_scanner
16 )
17
18 set(PLUGIN_BUNDLED_LIBRARIES)