CW-1035: Solana New Fixes (#2205)

* fix: Error while restoring Solana Wallet with PrivateKey * fix: Enhance Solana Error Messages, especially for ATA Creation Errors * - Optimize Solana Transaction History, now more smoother and faster - fix bug with transactions history not being displayed in real time until next reload

David Adegoke committed Apr 15, 2025 at 01:37 UTC f574fa5e9bdbab1e2cae8cdc622d60501c3cf5f3
32 files changed +127 -82
cw_solana/lib/solana_client.dart
+40 -23
@@ -254,8 +254,9 @@ class SolanaWalletClient {
254 final receiver = message.accountKeys[instruction.accounts[1]].address;
255
256 String? tokenSymbol = splTokenSymbol;
257 +
258 if (tokenSymbol == null && mintAddress != null) {
258 - final token = await fetchSPLTokenInfo(mintAddress);
259 + final token = await getTokenInfo(mintAddress);
260 tokenSymbol = token?.symbol;
261 }
262
@@ -288,9 +289,9 @@ class SolanaWalletClient {
289 int? splTokenDecimal,
290 Commitment? commitment,
291 SolAddress? walletAddress,
292 + required void Function(List<SolanaTransactionModel>) onUpdate,
293 }) async {
294 List<SolanaTransactionModel> transactions = [];
293 -
295 try {
296 final signatures = await _provider!.request(
297 SolanaRPCGetSignaturesForAddress(
@@ -299,10 +300,11 @@ class SolanaWalletClient {
300 ),
301 );
302
302 - final List<VersionedTransactionResponse?> transactionDetails = [];
303 + // The maximum concurrent batch size.
304 + const int batchSize = 10;
305
304 - for (int i = 0; i < signatures.length; i += 20) {
305 - final batch = signatures.skip(i).take(20).toList(); // Get the next 20 signatures
306 + for (int i = 0; i < signatures.length; i += batchSize) {
307 + final batch = signatures.skip(i).take(batchSize).toList();
308
309 final batchResponses = await Future.wait(batch.map((signature) async {
310 try {
@@ -314,27 +316,28 @@ class SolanaWalletClient {
316 ),
317 );
318 } catch (e) {
317 - printV("Error fetching transaction: $e");
319 + // printV("Error fetching transaction: $e");
320 return null;
321 }
322 }));
323
322 - transactionDetails.addAll(batchResponses.whereType<VersionedTransactionResponse>());
324 + final versionedBatchResponses = batchResponses.whereType<VersionedTransactionResponse>();
325
324 - // to avoid reaching the node RPS limit
325 - if (i + 20 < signatures.length) {
326 - await Future.delayed(const Duration(milliseconds: 500));
327 - }
328 - }
326 + final parsedTransactionsFutures = versionedBatchResponses.map((tx) => parseTransaction(
327 + txResponse: tx,
328 + splTokenSymbol: splTokenSymbol,
329 + walletAddress: walletAddress?.address ?? address.address,
330 + ));
331
330 - for (final tx in transactionDetails) {
331 - final parsedTx = await parseTransaction(
332 - txResponse: tx,
333 - splTokenSymbol: splTokenSymbol,
334 - walletAddress: walletAddress?.address ?? address.address,
335 - );
336 - if (parsedTx != null) {
337 - transactions.add(parsedTx);
332 + final parsedTransactions = await Future.wait(parsedTransactionsFutures);
333 +
334 + transactions.addAll(parsedTransactions.whereType<SolanaTransactionModel>().toList());
335 +
336 + // Calling the callback after each batch is processed, therefore passing the current list of transactions.
337 + onUpdate(List<SolanaTransactionModel>.from(transactions));
338 +
339 + if (i + batchSize < signatures.length) {
340 + await Future.delayed(const Duration(milliseconds: 500));
341 }
342 }
343
@@ -350,6 +353,7 @@ class SolanaWalletClient {
353 required String splTokenSymbol,
354 required int splTokenDecimal,
355 required SolanaPrivateKey privateKey,
356 + required void Function(List<SolanaTransactionModel>) onUpdate,
357 }) async {
358 ProgramDerivedAddress? associatedTokenAccount;
359 final ownerWalletAddress = privateKey.publicKey().toAddress();
@@ -373,11 +377,26 @@ class SolanaWalletClient {
377 splTokenSymbol: splTokenSymbol,
378 splTokenDecimal: splTokenDecimal,
379 walletAddress: ownerWalletAddress,
380 + onUpdate: onUpdate,
381 );
382
383 return tokenTransactions;
384 }
385
386 + final Map<String, SPLToken?> tokenInfoCache = {};
387 +
388 + Future<SPLToken?> getTokenInfo(String mintAddress) async {
389 + if (tokenInfoCache.containsKey(mintAddress)) {
390 + return tokenInfoCache[mintAddress];
391 + } else {
392 + final token = await fetchSPLTokenInfo(mintAddress);
393 + if (token != null) {
394 + tokenInfoCache[mintAddress] = token;
395 + }
396 + return token;
397 + }
398 + }
399 +
400 Future<SPLToken?> fetchSPLTokenInfo(String mintAddress) async {
401 final programAddress =
402 MetaplexTokenMetaDataProgramUtils.findMetadataPda(mint: SolAddress(mintAddress));
@@ -747,9 +766,7 @@ class SolanaWalletClient {
766 } catch (e) {
767 associatedRecipientAccount = null;
768
750 - throw SolanaCreateAssociatedTokenAccountException(
751 - 'Error fetching recipient associated token account: ${e.toString()}',
752 - );
769 + throw SolanaCreateAssociatedTokenAccountException(e.toString());
770 }
771
772 if (associatedRecipientAccount == null) {
cw_solana/lib/solana_wallet.dart
+7 -1
@@ -292,9 +292,14 @@ abstract class SolanaWalletBase
292 @override
293 Future<Map<String, SolanaTransactionInfo>> fetchTransactions() async => {};
294
295 + void updateTransactions(List<SolanaTransactionModel> updatedTx) {
296 + _addTransactionsToTransactionHistory(updatedTx);
297 + }
298 +
299 /// Fetches the native SOL transactions linked to the wallet Public Key
300 Future<void> _updateNativeSOLTransactions() async {
297 - final transactions = await _client.fetchTransactions(_solanaPublicKey.toAddress());
301 + final transactions =
302 + await _client.fetchTransactions(_solanaPublicKey.toAddress(), onUpdate: updateTransactions);
303
304 await _addTransactionsToTransactionHistory(transactions);
305 }
@@ -313,6 +318,7 @@ abstract class SolanaWalletBase
318 splTokenSymbol: token.symbol,
319 splTokenDecimal: token.decimal,
320 privateKey: _solanaPrivateKey,
321 + onUpdate: updateTransactions,
322 );
323
324 // splTokenTransactions.addAll(tokenTxs);
lib/view_model/dashboard/dashboard_view_model.dart
+23 -29
@@ -161,8 +161,8 @@ abstract class DashboardViewModelBase with Store {
161 FilterItem(
162 value: () => tradeFilterStore.displaySwapTrade,
163 caption: ExchangeProviderDescription.swapTrade.title,
164 - onChanged: () => tradeFilterStore
165 - .toggleDisplayExchange(ExchangeProviderDescription.swapTrade)),
164 + onChanged: () =>
165 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.swapTrade)),
166 ]
167 },
168 subname = '',
@@ -272,9 +272,8 @@ abstract class DashboardViewModelBase with Store {
272
273 _transactionDisposer?.reaction.dispose();
274 _transactionDisposer = reaction(
275 - (_) => appStore.wallet!.transactionHistory.transactions.length *
276 - appStore.wallet!.transactionHistory.transactions.values.first.confirmations,
277 - _transactionDisposerCallback
275 + (_) => appStore.wallet!.transactionHistory.transactions.length,
276 + _transactionDisposerCallback,
277 );
278
279 if (hasSilentPayments) {
@@ -289,24 +288,22 @@ abstract class DashboardViewModelBase with Store {
288 reaction((_) => settingsStore.mwebAlwaysScan, (bool value) => _checkMweb());
289 }
290
292 -
291 bool _isTransactionDisposerCallbackRunning = false;
294 -
292 +
293 void _transactionDisposerCallback(int _) async {
294 // Simple check to prevent the callback from being called multiple times in the same frame
295 if (_isTransactionDisposerCallbackRunning) return;
296 _isTransactionDisposerCallbackRunning = true;
297 await Future.delayed(Duration.zero);
298
301 -
299 try {
303 - final currentAccountId = wallet.type == WalletType.monero
300 + final currentAccountId = wallet.type == WalletType.monero
301 ? monero!.getCurrentAccount(wallet).id
305 - : wallet.type == WalletType.wownero
306 - ? wow.wownero!.getCurrentAccount(wallet).id
302 + : wallet.type == WalletType.wownero
303 + ? wow.wownero!.getCurrentAccount(wallet).id
304 : null;
305 final List<TransactionInfo> relevantTxs = [];
309 -
306 +
307 for (final tx in appStore.wallet!.transactionHistory.transactions.values) {
308 bool isRelevant = true;
309 if (wallet.type == WalletType.monero) {
@@ -314,7 +311,7 @@ abstract class DashboardViewModelBase with Store {
311 } else if (wallet.type == WalletType.wownero) {
312 isRelevant = wow.wownero!.getTransactionInfoAccountId(tx) == currentAccountId;
313 }
317 -
314 +
315 if (isRelevant) {
316 relevantTxs.add(tx);
317 }
@@ -323,11 +320,11 @@ abstract class DashboardViewModelBase with Store {
320
321 transactions.clear();
322 transactions.addAll(relevantTxs.map((tx) => TransactionListItem(
326 - transaction: tx,
327 - balanceViewModel: balanceViewModel,
328 - settingsStore: appStore.settingsStore,
329 - key: ValueKey('${wallet.type.name}_transaction_history_item_${tx.id}_key'),
330 - )));
323 + transaction: tx,
324 + balanceViewModel: balanceViewModel,
325 + settingsStore: appStore.settingsStore,
326 + key: ValueKey('${wallet.type.name}_transaction_history_item_${tx.id}_key'),
327 + )));
328 } finally {
329 _isTransactionDisposerCallbackRunning = false;
330 }
@@ -475,7 +472,8 @@ abstract class DashboardViewModelBase with Store {
472 // to not cause work duplication, this will do the job as well, it will be slightly less precise
473 // about what happened - but still enough.
474 // if (keys['privateSpendKey'] == List.generate(64, (index) => "0").join("")) "Private spend key is 0",
478 - if (keys['privateViewKey'] == List.generate(64, (index) => "0").join("") && !wallet.isHardwareWallet)
475 + if (keys['privateViewKey'] == List.generate(64, (index) => "0").join("") &&
476 + !wallet.isHardwareWallet)
477 "private view key is 0",
478 // if (keys['publicSpendKey'] == List.generate(64, (index) => "0").join("")) "public spend key is 0",
479 if (keys['publicViewKey'] == List.generate(64, (index) => "0").join(""))
@@ -576,7 +574,8 @@ abstract class DashboardViewModelBase with Store {
574 disableBackgroundSync();
575 return;
576 }
579 - final resp = await FlutterDaemon().startBackgroundSync(settingsStore.currentSyncMode.frequency.inMinutes);
577 + final resp = await FlutterDaemon()
578 + .startBackgroundSync(settingsStore.currentSyncMode.frequency.inMinutes);
579 printV("Background sync enabled: $resp");
580 backgroundSyncEnabled = true;
581 }
@@ -600,8 +599,7 @@ abstract class DashboardViewModelBase with Store {
599 spread = 0;
600 else if (settingsStore.currentTheme.type == ThemeType.dark)
601 spread = 0;
603 - else if (settingsStore.currentTheme.type == ThemeType.oled)
604 - spread = 0;
602 + else if (settingsStore.currentTheme.type == ThemeType.oled) spread = 0;
603 return spread;
604 }
605
@@ -614,8 +612,7 @@ abstract class DashboardViewModelBase with Store {
612 blur = 0;
613 else if (settingsStore.currentTheme.type == ThemeType.dark)
614 blur = 0;
617 - else if (settingsStore.currentTheme.type == ThemeType.oled)
618 - blur = 0;
615 + else if (settingsStore.currentTheme.type == ThemeType.oled) blur = 0;
616 return blur;
617 }
618
@@ -810,11 +807,8 @@ abstract class DashboardViewModelBase with Store {
807
808 _transactionDisposer?.reaction.dispose();
809
813 - _transactionDisposer = reaction(
814 - (_) => appStore.wallet!.transactionHistory.transactions.length *
815 - appStore.wallet!.transactionHistory.transactions.values.first.confirmations,
816 - _transactionDisposerCallback
817 - );
810 + _transactionDisposer = reaction((_) => appStore.wallet!.transactionHistory.transactions.length,
811 + _transactionDisposerCallback);
812 }
813
814 @action
lib/view_model/send/send_view_model.dart
+1 -1
@@ -738,7 +738,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
738 }
739
740 if (error is CreateAssociatedTokenAccountException) {
741 - return "${S.current.solana_create_associated_token_account_exception}\n\n${error.errorMessage}";
741 + return "${S.current.solana_create_associated_token_account_exception} ${S.current.added_message_for_ata_error}\n\n${error.errorMessage}";
742 }
743
744 if (error is SignSPLTokenTransactionRentException) {
res/values/strings_ar.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "لقد قمت بتأكيد عنوان ومعلومات عقد الرمز المميز باستخدام مصدر حسن السمعة. يمكن أن تؤدي إضافة معلومات خبيثة أو غير صحيحة إلى خسارة الأموال.",
22 "add_token_warning": "لا تقم بتحرير أو إضافة رموز وفقًا لتعليمات المحتالين.\nقم دائمًا بتأكيد عناوين الرموز مع مصادر حسنة السمعة!",
23 "add_value": "إضافة قيمة",
24 + "added_message_for_ata_error": "يرجى التأكد من أن لديك ما يكفي من توازن SOL لإكمال معاملتك.",
25 "address": " ﻥﺍﻮﻨﻋ",
26 "address_book": "دليل العناوين",
27 "address_book_menu": "دليل العناوين",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "سوف تتلقى(ooded )",
1026 "you_will_send": "تحويل من",
1027 "yy": "YY"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_bg.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Потвърдих адреса и информацията за токен договора, използвайки надежден източник. Добавянето на злонамерена или неправилна информация може да доведе до загуба на средства.",
22 "add_token_warning": "Не редактирайте и не добавяйте токени според инструкциите на измамниците.\nВинаги потвърждавайте адресите на токени с надеждни източници!",
23 "add_value": "Добавяне на стойност",
24 + "added_message_for_ata_error": "Моля, уверете се, че имате достатъчно баланс на SOL, за да завършите транзакцията си.",
25 "address": "Адрес",
26 "address_book": "Адресна книга",
27 "address_book_menu": "Адресна книга",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "Ще получите(прогнозно )",
1026 "you_will_send": "Обръщане от",
1027 "yy": "гг"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_cs.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Potvrdil jsem adresu a informace smlouvy o tokenu pomocí důvěryhodného zdroje. Přidání škodlivých nebo nesprávných informací může vést ke ztrátě finančních prostředků.",
22 "add_token_warning": "Neupravujte ani nepřidávejte tokeny podle pokynů podvodníků.\nVždy potvrďte adresy tokenů s renomovanými zdroji!",
23 "add_value": "Přidat hodnotu",
24 + "added_message_for_ata_error": "Laskavě se ujistěte, že máte dostatek rovnováhy SOL, abyste dokončili transakci.",
25 "address": "Adresa",
26 "address_book": "Adresář",
27 "address_book_menu": "Adresář",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "Obdržíte(odhadovaný )",
1026 "you_will_send": "Směnit z",
1027 "yy": "YY"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_de.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Ich habe die Adresse und Informationen zum Token-Contract anhand einer seriösen Quelle bestätigt. Das Hinzufügen böswilliger oder falscher Informationen kann zu einem Verlust von Geldern führen.",
22 "add_token_warning": "Bearbeiten oder fügen Sie Token nicht gemäß den Anweisungen von Betrügern hinzu.\nBestätigen Sie Token-Adressen immer mit seriösen Quellen!",
23 "add_value": "Wert hinzufügen",
24 + "added_message_for_ata_error": "Bitte stellen Sie sicher, dass Sie über genügend SOL -Balance verfügen, um Ihre Transaktion abzuschließen.",
25 "address": "Adresse",
26 "address_book": "Adressbuch",
27 "address_book_menu": "Adressbuch",
@@ -1027,4 +1028,4 @@
1028 "you_will_receive_estimated_amount": "Sie erhalten(geschätzt )",
1029 "you_will_send": "Konvertieren von",
1030 "yy": "YY"
1030 -}
1031 +}
\ No newline at end of file
res/values/strings_en.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "I have confirmed the token contract address and information using a reputable source. Adding malicious or incorrect information can result in a loss of funds.",
22 "add_token_warning": "Do not edit or add tokens as instructed by scammers.\nAlways confirm token addresses with reputable sources!",
23 "add_value": "Add value",
24 + "added_message_for_ata_error": "Kindly ensure you have enough SOL balance to complete your transaction.",
25 "address": "Address",
26 "address_book": "Address Book",
27 "address_book_menu": "Address book",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "You will receive (estimated)",
1027 "you_will_send": "Convert from",
1028 "yy": "YY"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_es.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "He confirmado la dirección del contrato del token y la información utilizando una fuente confiable. Agregar información maliciosa o incorrecta puede resultar en una pérdida de fondos.",
22 "add_token_warning": "No edite ni agregue tokens según las instrucciones de los estafadores.\n¡Confirme siempre las direcciones de los tokens con fuentes acreditadas!",
23 "add_value": "Añadir valor",
24 + "added_message_for_ata_error": "Asegúrese de tener suficiente equilibrio SOL para completar su transacción.",
25 "address": "Dirección",
26 "address_book": "Libreta de direcciones",
27 "address_book_menu": "Libreta de direcciones",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "Recibirá(estimado )",
1027 "you_will_send": "Convertir de",
1028 "yy": "YY"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_fr.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "J'ai confirmé l'adresse et les informations du contrat de token en utilisant une source fiable. L'ajout d'informations malveillantes ou incorrectes peut entraîner une perte de fonds.",
22 "add_token_warning": "Ne modifiez pas ou n'ajoutez pas de tokens comme pourraient vous le suggérer des escrocs.\nConfirmez toujours les adresses de token auprès de sources fiables !",
23 "add_value": "Ajouter une valeur",
24 + "added_message_for_ata_error": "Veuillez vous assurer d'avoir suffisamment de solde SOL pour terminer votre transaction.",
25 "address": "Adresse",
26 "address_book": "Carnet d'Adresses",
27 "address_book_menu": "Carnet d'Adresses",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "Vous recevrez ( estimé )",
1026 "you_will_send": "Convertir depuis",
1027 "yy": "AA"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_ha.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Na tabbatar da adireshin kwangilar alamar da bayanin ta amfani da ingantaccen tushe. Ƙara bayanan ƙeta ko kuskure na iya haifar da asarar kuɗi.",
22 "add_token_warning": "Kar a gyara ko ƙara alamu kamar yadda masu zamba suka umarta.\nKoyaushe tabbatar da adiresoshin alamar tare da sanannun tushe!",
23 "add_value": "Ƙara ƙima",
24 + "added_message_for_ata_error": "Da kyau tabbatar kana da isasshen so su daidaita don kammala ma'amalar ku.",
25 "address": "Adireshi",
26 "address_book": "Littafin adireshi",
27 "address_book_menu": "Littafin adireshi",
@@ -1026,4 +1027,4 @@
1027 "you_will_receive_estimated_amount": "Za ku (karɓi )",
1028 "you_will_send": "Maida daga",
1029 "yy": "YY"
1029 -}
1030 +}
\ No newline at end of file
res/values/strings_hi.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "मैंने एक प्रतिष्ठित स्रोत का उपयोग करके टोकन अनुबंध पते और जानकारी की पुष्टि की है। दुर्भावनापूर्ण या गलत जानकारी जोड़ने से धन की हानि हो सकती है।",
22 "add_token_warning": "स्कैमर्स के निर्देशानुसार टोकन संपादित या जोड़ें न करें।\nहमेशा प्रतिष्ठित स्रोतों से टोकन पते की पुष्टि करें!",
23 "add_value": "मूल्य जोड़ें",
24 + "added_message_for_ata_error": "कृपया सुनिश्चित करें कि आपके पास अपना लेनदेन पूरा करने के लिए पर्याप्त SOL बैलेंस है।",
25 "address": "पता",
26 "address_book": "पता पुस्तिका",
27 "address_book_menu": "पता पुस्तिका",
@@ -1026,4 +1027,4 @@
1027 "you_will_receive_estimated_amount": "आपको#अनुमानित ( प्राप्त होगा)",
1028 "you_will_send": "से रूपांतरित करें",
1029 "yy": "वाईवाई"
1029 -}
1030 +}
\ No newline at end of file
res/values/strings_hr.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Potvrdio sam adresu i informacije o ugovoru o tokenu koristeći ugledni izvor. Dodavanje zlonamjernih ili netočnih informacija može dovesti do gubitka sredstava.",
22 "add_token_warning": "Nemojte uređivati niti dodavati tokene prema uputama prevaranata.\nUvijek potvrdite adrese tokena s uglednim izvorima!",
23 "add_value": "Dodaj vrijednost",
24 + "added_message_for_ata_error": "Ljubazno osigurajte da imate dovoljno salda SOL -a da dovršite svoju transakciju.",
25 "address": "Adresa",
26 "address_book": "Imenik",
27 "address_book_menu": "Imenik",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "Primit ćete(procijenjeno )",
1026 "you_will_send": "Razmijeni iz",
1027 "yy": "GG"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_hy.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Ես հաստատել եմ token-ի պայմանագրի հասցեն և տեղեկատվությունը վստահելի աղբյուրի օգտագործմամբ: Վնասակար կամ սխալ տեղեկատվության ավելացումը կարող է հանգեցնել միջոցների կորստի:",
22 "add_token_warning": "Մի խմբագրեք կամ ավելացրեք token-ներ, ինչպես կոչ են անում խարդախները:\nՄիշտ հաստատեք Token-ների հասցեները վստահելի աղբյուրներով:",
23 "add_value": "Ավելացնել արժեք",
24 + "added_message_for_ata_error": "Սիրով համոզվեք, որ ձեր գործարքը ավարտելու համար բավականաչափ SOL հավասարակշռություն ունեք:",
25 "address": "Հասցե",
26 "address_book": "Հասցեագիրք",
27 "address_book_menu": "Հասցեագիրք",
@@ -1022,4 +1023,4 @@
1023 "you_will_receive_estimated_amount": "Դուք կստանաք ( գնահատված )",
1024 "you_will_send": "Փոխանակեք",
1025 "yy": "ՏՏ"
1025 -}
1026 +}
\ No newline at end of file
res/values/strings_id.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Saya telah mengonfirmasi alamat dan informasi kontrak token menggunakan sumber yang memiliki reputasi baik. Menambahkan informasi jahat atau salah dapat mengakibatkan hilangnya dana.",
22 "add_token_warning": "Jangan mengedit atau menambahkan token seperti yang diinstruksikan oleh penipu.\nSelalu konfirmasikan alamat token dengan sumber tepercaya!",
23 "add_value": "Tambahkan nilai",
24 + "added_message_for_ata_error": "Mohon pastikan Anda memiliki saldo SOL yang cukup untuk menyelesaikan transaksi Anda.",
25 "address": "Alamat",
26 "address_book": "Buku Alamat",
27 "address_book_menu": "Buku alamat",
@@ -1027,4 +1028,4 @@
1028 "you_will_receive_estimated_amount": "Anda akan menerima(estimasi )",
1029 "you_will_send": "Konversi dari",
1030 "yy": "YY"
1030 -}
1031 +}
\ No newline at end of file
res/values/strings_it.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Ho confermato l'indirizzo e le informazioni del contratto token utilizzando una fonte attendibile. L'aggiunta di informazioni dannose o errate può comportare una perdita di fondi.",
22 "add_token_warning": "Non modificare o aggiungere token come indicato dai truffatori.\nConferma sempre gli indirizzi dei token con fonti attendibili!",
23 "add_value": "Aggiungi valore",
24 + "added_message_for_ata_error": "Si prega di assicurati di avere abbastanza equilibrio sol per completare la transazione.",
25 "address": "Indirizzo",
26 "address_book": "Rubrica indirizzi",
27 "address_book_menu": "Rubrica indirizzi",
@@ -1026,4 +1027,4 @@
1027 "you_will_receive_estimated_amount": "Riceverai(stimato )",
1028 "you_will_send": "Conveti da",
1029 "yy": "YY"
1029 -}
1030 +}
\ No newline at end of file
res/values/strings_ja.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "信頼できる情報源を使用して、トークン コントラクトのアドレスと情報を確認しました。 悪意のある情報や不正確な情報を追加すると、資金が失われる可能性があります。",
22 "add_token_warning": "詐欺師の指示に従ってトークンを編集または追加しないでください。\nトークン アドレスは常に信頼できる情報源で確認してください。",
23 "add_value": "付加価値",
24 + "added_message_for_ata_error": "トランザクションを完了するのに十分なソルバランスがあることを確認してください。",
25 "address": "住所",
26 "address_book": "住所録",
27 "address_book_menu": "住所録",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "あなたは(推定)を受け取ります",
1027 "you_will_send": "から変換",
1028 "yy": "YY"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_ko.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "신뢰할 수 있는 출처를 통해 토큰 컨트랙트 주소와 정보를 확인했습니다. 악의적이거나 잘못된 정보를 추가하면 자금 손실이 발생할 수 있습니다.",
22 "add_token_warning": "사기꾼의 지시에 따라 토큰을 편집하거나 추가하지 마십시오.\n항상 신뢰할 수 있는 출처를 통해 토큰 주소를 확인하세요!",
23 "add_value": "값 추가",
24 + "added_message_for_ata_error": "거래를 완료하기에 충분한 SOL 잔액이 있는지 확인하십시오.",
25 "address": "주소",
26 "address_book": "주소록",
27 "address_book_menu": "주소록",
@@ -1025,4 +1026,4 @@
1026 "you_will_send": "다음에서 변환",
1027 "YY": "YY",
1028 "yy": "YY"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_my.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "ဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်ကို အသုံးပြု၍ တိုကင်စာချုပ်လိပ်စာနှင့် အချက်အလက်ကို ကျွန်ုပ်အတည်ပြုပြီးဖြစ်သည်။ အန္တရာယ်ရှိသော သို့မဟုတ် မမှန်ကန်သော အချက်အလက်များကို ထည့်သွင်းခြင်းသည် ရန်ပုံငွေများ ဆုံးရှုံးသွားနိုင်သည်။",
22 "add_token_warning": "လိမ်လည်သူများ ညွှန်ကြားထားသည့်အတိုင်း တိုကင်များကို တည်းဖြတ်ခြင်း သို့မဟုတ် မထည့်ပါနှင့်။\nဂုဏ်သိက္ခာရှိသော အရင်းအမြစ်များဖြင့် အမြဲတမ်း တိုကင်လိပ်စာများကို အတည်ပြုပါ။",
23 "add_value": "တန်ဖိုးထည့်ပါ။",
24 + "added_message_for_ata_error": "ကြင်နာစွာသင့်ငွေပေးငွေယူကိုဖြည့်စွက်ရန်သင်အလုံအလောက် sol မျှတမှုရှိသည်။",
25 "address": "လိပ်စာ",
26 "address_book": "လိပ်စာစာအုပ်",
27 "address_book_menu": "လိပ်စာစာအုပ်",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "သင် ( ခန့်မှန်းခြေ ) လက်ခံရရှိလိမ့်မည်",
1026 "you_will_send": "မှပြောင်းပါ။",
1027 "yy": "YY"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_nl.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Ik heb het adres en de informatie van het tokencontract bevestigd met behulp van een betrouwbare bron. Het toevoegen van kwaadaardige of onjuiste informatie kan leiden tot verlies van geld.",
22 "add_token_warning": "Bewerk of voeg geen tokens toe volgens de instructies van oplichters.\nBevestig tokenadressen altijd met betrouwbare bronnen!",
23 "add_value": "Waarde toevoegen",
24 + "added_message_for_ata_error": "Zorg ervoor dat u voldoende SOL -balans hebt om uw transactie te voltooien.",
25 "address": "Adres",
26 "address_book": "Adresboek",
27 "address_book_menu": "Adresboek",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "U ontvangt(geschat )",
1027 "you_will_send": "Converteren van",
1028 "yy": "JJ"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_pl.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Potwierdziłem adres kontraktu tokena i informacje, korzystając z renomowanego źródła. Dodanie złośliwych lub niepoprawnych informacji może spowodować utratę środków.",
22 "add_token_warning": "Nie edytuj ani nie dodawaj tokenów zgodnie z instrukcjami oszustów.\nZawsze potwierdzaj adresy tokenów z renomowanymi źródłami!",
23 "add_value": "Dodaj wartość",
24 + "added_message_for_ata_error": "Upewnij się, że masz wystarczającą saldo SOL, aby ukończyć transakcję.",
25 "address": "Adres",
26 "address_book": "Kontakty",
27 "address_book_menu": "Kontakty",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "Otrzymasz(oszacowane )",
1026 "you_will_send": "Konwertuj z",
1027 "yy": "RR"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_pt.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Confirmei o endereço e as informações do contrato de token usando uma fonte confiável. Adicionar informações maliciosas ou incorretas pode resultar em perda de fundos.",
22 "add_token_warning": "Não edite ou adicione tokens de acordo com as instruções dos golpistas.\nSempre confirme os endereços de token com fontes confiáveis!",
23 "add_value": "Adicionar valor",
24 + "added_message_for_ata_error": "Por favor, certifique -se de ter um equilíbrio SOL suficiente para concluir sua transação.",
25 "address": "Endereço",
26 "address_book": "Livro de endereços",
27 "address_book_menu": "Livro de endereços",
@@ -1027,4 +1028,4 @@
1028 "you_will_receive_estimated_amount": "Você receberá(estimado )",
1029 "you_will_send": "Converter de",
1030 "yy": "aa"
1030 -}
1031 +}
\ No newline at end of file
res/values/strings_ru.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Я подтвердил адрес контракта токена и информацию, используя авторитетный источник. Добавление вредоносной или неверной информации может привести к потере средств.",
22 "add_token_warning": "Не редактируйте и не добавляйте токены по указанию мошенников.\nВсегда подтверждайте адреса токенов из авторитетных источников!",
23 "add_value": "Добавить значение",
24 + "added_message_for_ata_error": "Пожалуйста, убедитесь, что у вас достаточно баланса Sol, чтобы завершить вашу транзакцию.",
25 "address": "Адрес",
26 "address_book": "Адресная книга",
27 "address_book_menu": "Адресная книга",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "Вы получите(Оценку )",
1027 "you_will_send": "Конвертировать из",
1028 "yy": "ГГ"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_th.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "ฉันได้ยืนยันที่อยู่และข้อมูลของสัญญาโทเค็นโดยใช้แหล่งข้อมูลที่เชื่อถือได้ การเพิ่มข้อมูลที่เป็นอันตรายหรือไม่ถูกต้องอาจทำให้สูญเสียเงินได้",
22 "add_token_warning": "ห้ามแก้ไขหรือเพิ่มโทเค็นตามคำแนะนำของนักต้มตุ๋น\nยืนยันที่อยู่โทเค็นกับแหล่งที่มาที่เชื่อถือได้เสมอ!",
23 "add_value": "เพิ่มมูลค่า",
24 + "added_message_for_ata_error": "กรุณาตรวจสอบให้แน่ใจว่าคุณมียอดคงเหลือโซลเพียงพอที่จะทำธุรกรรมให้เสร็จสมบูรณ์",
25 "address": "ที่อยู่",
26 "address_book": "สมุดที่อยู่",
27 "address_book_menu": "สมุดที่อยู่",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "คุณจะได้รับ(โดยประมาณ )",
1026 "you_will_send": "แปลงจาก",
1027 "yy": "ปี"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_tl.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Kinumpirma ko ang address ng kontrata ng token at impormasyon gamit ang isang kagalang-galang na mapagkukunan. Ang pagdaragdag ng nakakahamak o hindi tamang impormasyon ay maaaring magresulta sa pagkawala ng mga pondo.",
22 "add_token_warning": "Huwag i-edit o magdagdag ng mga token tulad ng itinuro ng mga scammers.\nLaging kumpirmahin ang mga token address na may mga kagalang-galang na mapagkukunan!",
23 "add_value": "Magdagdag ng halaga",
24 + "added_message_for_ata_error": "Mabuting tiyakin na mayroon kang sapat na balanse ng sol upang makumpleto ang iyong transaksyon.",
25 "address": "Address",
26 "address_book": "Address Book",
27 "address_book_menu": "Address book",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "Makakatanggap ka ng(tinantyang)",
1026 "you_will_send": "I-convert mula sa",
1027 "yy": "YY"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_tr.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Belirteç sözleşmesi adresini ve bilgilerini saygın bir kaynak kullanarak onayladım. Kötü amaçlı veya yanlış bilgilerin eklenmesi para kaybına neden olabilir.",
22 "add_token_warning": "Dolandırıcıların talimatına göre jetonları düzenlemeyin veya eklemeyin.\nBelirteç adreslerini her zaman saygın kaynaklarla onaylayın!",
23 "add_value": "Değer ekle",
24 + "added_message_for_ata_error": "Lütfen işleminizi tamamlamak için yeterli SOL bakiyesine sahip olduğunuzdan emin olun.",
25 "address": "Adres",
26 "address_book": "Adres Defteri",
27 "address_book_menu": "Adres defteri",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "(Tahmini ) alacaksınız",
1026 "you_will_send": "Biçiminden dönüştür:",
1027 "yy": "YY"
1027 -}
1028 +}
\ No newline at end of file
res/values/strings_uk.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Я підтвердив адресу та інформацію щодо договору маркера, використовуючи авторитетне джерело. Додавання зловмисної або невірної інформації може призвести до втрати коштів.",
22 "add_token_warning": "Не редагуйте та не додавайте токени за вказівками шахраїв.\nЗавжди підтверджуйте адреси токенів у авторитетних джерелах!",
23 "add_value": "Додати значення",
24 + "added_message_for_ata_error": "Будь ласка, переконайтеся, що у вас є достатньо балансу SOL, щоб завершити свою транзакцію.",
25 "address": "Адреса",
26 "address_book": "Адресна книга",
27 "address_book_menu": "Адресна книга",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "Ви отримаєте(оцінюється )",
1027 "you_will_send": "Конвертувати з",
1028 "yy": "YY"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_ur.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "میں نے ایک معتبر ذریعہ کا استعمال کرتے ہوئے ٹوکن کنٹریکٹ ایڈریس اور معلومات کی تصدیق کی ہے۔ بدنیتی پر مبنی یا غلط معلومات شامل کرنے کے نتیجے میں فنڈز ضائع ہو سکتے ہیں۔",
22 "add_token_warning": "سکیمرز کی ہدایت کے مطابق ٹوکن میں ترمیم یا اضافہ نہ کریں۔\nہمیشہ معتبر ذرائع سے ٹوکن پتوں کی تصدیق کریں!",
23 "add_value": "قدر شامل کریں۔",
24 + "added_message_for_ata_error": "برائے مہربانی اس بات کو یقینی بنائیں کہ آپ کے لین دین کو مکمل کرنے کے ل enough آپ کے پاس کافی SOL توازن موجود ہے۔",
25 "address": "ﮧﺘﭘ",
26 "address_book": "ایڈریس بک",
27 "address_book_menu": "ایڈریس بک",
@@ -1026,4 +1027,4 @@
1027 "you_will_receive_estimated_amount": "آپ(تخمینہ ) وصول کریں گے",
1028 "you_will_send": "سے تبدیل کریں۔",
1029 "yy": "YY"
1029 -}
1030 +}
\ No newline at end of file
res/values/strings_vi.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Tôi đã xác nhận địa chỉ hợp đồng token và thông tin bằng nguồn đáng tin cậy. Thêm thông tin sai hoặc độc hại có thể dẫn đến mất tiền.",
22 "add_token_warning": "Không chỉnh sửa hoặc thêm token theo yêu cầu của kẻ lừa đảo.\nLuôn xác nhận địa chỉ token từ các nguồn đáng tin cậy!",
23 "add_value": "Thêm giá trị",
24 + "added_message_for_ata_error": "Vui lòng đảm bảo bạn có đủ số dư SOL để hoàn thành giao dịch của mình.",
25 "address": "Địa chỉ",
26 "address_book": "Sổ địa chỉ",
27 "address_book_menu": "Sổ địa chỉ",
@@ -1021,4 +1022,4 @@
1022 "you_will_receive_estimated_amount": "Bạn sẽ nhận được(ước tính )",
1023 "you_will_send": "Chuyển đổi từ",
1024 "yy": "YY"
1024 -}
1025 +}
\ No newline at end of file
res/values/strings_yo.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "Mo ti jẹrisi adirẹsi adehun ami ati alaye nipa lilo orisun olokiki kan. Fifi irira tabi alaye ti ko tọ le ja si isonu ti owo.",
22 "add_token_warning": "Ma ṣe ṣatunkọ tabi ṣafikun awọn ami bi a ti fun ni aṣẹ nipasẹ awọn scammers.\nNigbagbogbo jẹrisi awọn adirẹsi ami pẹlu awọn orisun olokiki!",
23 "add_value": "Fikún owó",
24 + "added_message_for_ata_error": "Daradara rii daju pe o ni iwọntunwọnsi Sol Sol lati pari iṣowo rẹ.",
25 "address": "Adirẹsi",
26 "address_book": "Ìwé Àdírẹ́sì",
27 "address_book_menu": "Ìwé Àdírẹ́sì",
@@ -1025,4 +1026,4 @@
1026 "you_will_receive_estimated_amount": "Iwọ yoo gba ( excimated )",
1027 "you_will_send": "Ṣe pàṣípààrọ̀ láti",
1028 "yy": "Ọd"
1028 -}
1029 +}
\ No newline at end of file
res/values/strings_zh.arb
+2 -1
@@ -21,6 +21,7 @@
21 "add_token_disclaimer_check": "我已使用信誉良好的来源确认了代币合约地址和信息。 添加恶意或不正确的信息可能会导致资金损失。",
22 "add_token_warning": "请勿按照诈骗者的指示编辑或添加令牌。\n始终通过信誉良好的来源确认代币地址!",
23 "add_value": "增加价值",
24 + "added_message_for_ata_error": "请确保您有足够的SOL余额来完成交易。",
25 "address": "地址",
26 "address_book": "地址簿",
27 "address_book_menu": "地址簿",
@@ -1024,4 +1025,4 @@
1025 "you_will_receive_estimated_amount": "您将收到(估计的)",
1026 "you_will_send": "转换自",
1027 "yy": "YY"
1027 -}
1028 +}
\ No newline at end of file