CW-829 Solana Enhancements (#1858)

* feat: Solana enhancements with rent handling for accounts

* fix: Add exception classes with handled error messages to ensure proper error handling process

---------

Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
This commit is contained in:
David Adegoke 2024-12-14 00:31:10 +01:00 committed by GitHub
parent 9a60b0146f
commit c620d7f486
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 206 additions and 18 deletions

View file

@ -1,12 +1,13 @@
import 'dart:async';
import 'dart:convert';
import 'dart:math';
import 'dart:math' as math;
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/node.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:cw_solana/pending_solana_transaction.dart';
import 'package:cw_solana/solana_balance.dart';
import 'package:cw_solana/solana_exceptions.dart';
import 'package:cw_solana/solana_transaction_model.dart';
import 'package:http/http.dart' as http;
import 'package:solana/dto.dart';
@ -180,7 +181,7 @@ class SolanaWalletClient {
bool isOutgoingTx = transfer.source == publicKey.toBase58();
double amount = (double.tryParse(transfer.amount) ?? 0.0) /
pow(10, splTokenDecimal ?? 9);
math.pow(10, splTokenDecimal ?? 9);
transactions.add(
SolanaTransactionModel(
@ -276,6 +277,7 @@ class SolanaWalletClient {
required String destinationAddress,
required Ed25519HDKeyPair ownerKeypair,
required bool isSendAll,
required double solBalance,
String? tokenMint,
List<String> references = const [],
}) async {
@ -290,6 +292,7 @@ class SolanaWalletClient {
ownerKeypair: ownerKeypair,
commitment: commitment,
isSendAll: isSendAll,
solBalance: solBalance,
);
return pendingNativeTokenTransaction;
} else {
@ -301,6 +304,7 @@ class SolanaWalletClient {
destinationAddress: destinationAddress,
ownerKeypair: ownerKeypair,
commitment: commitment,
solBalance: solBalance,
);
return pendingSPLTokenTransaction;
}
@ -353,6 +357,23 @@ class SolanaWalletClient {
return fee;
}
Future<bool> hasSufficientFundsLeftForRent({
required double inputAmount,
required double solBalance,
required double fee,
}) async {
final rent =
await _client!.getMinimumBalanceForMintRentExemption(commitment: Commitment.confirmed);
final rentInSol = (rent / lamportsPerSol).toDouble();
final remnant = solBalance - (inputAmount + fee);
if (remnant > rentInSol) return true;
return false;
}
Future<PendingSolanaTransaction> _signNativeTokenTransaction({
required String tokenTitle,
required int tokenDecimals,
@ -361,6 +382,7 @@ class SolanaWalletClient {
required Ed25519HDKeyPair ownerKeypair,
required Commitment commitment,
required bool isSendAll,
required double solBalance,
}) async {
// Convert SOL to lamport
int lamports = (inputAmount * lamportsPerSol).toInt();
@ -378,6 +400,16 @@ class SolanaWalletClient {
commitment,
);
bool hasSufficientFundsLeft = await hasSufficientFundsLeftForRent(
inputAmount: inputAmount,
fee: fee,
solBalance: solBalance,
);
if (!hasSufficientFundsLeft) {
throw SolanaSignNativeTokenTransactionRentException();
}
SignedTx signedTx;
if (isSendAll) {
final feeInLamports = (fee * lamportsPerSol).toInt();
@ -425,6 +457,7 @@ class SolanaWalletClient {
required String destinationAddress,
required Ed25519HDKeyPair ownerKeypair,
required Commitment commitment,
required double solBalance,
}) async {
final destinationOwner = Ed25519HDPublicKey.fromBase58(destinationAddress);
final mint = Ed25519HDPublicKey.fromBase58(tokenMint);
@ -447,7 +480,7 @@ class SolanaWalletClient {
// Throw an appropriate exception if the sender has no associated
// token account
if (associatedSenderAccount == null) {
throw NoAssociatedTokenAccountException(ownerKeypair.address, mint.toBase58());
throw SolanaNoAssociatedTokenAccountException(ownerKeypair.address, mint.toBase58());
}
try {
@ -457,11 +490,11 @@ class SolanaWalletClient {
funder: ownerKeypair,
);
} catch (e) {
throw Exception('Insufficient SOL balance to complete this transaction: ${e.toString()}');
throw SolanaCreateAssociatedTokenAccountException(e.toString());
}
// Input by the user
final amount = (inputAmount * pow(10, tokenDecimals)).toInt();
final amount = (inputAmount * math.pow(10, tokenDecimals)).toInt();
final instruction = TokenInstruction.transfer(
source: Ed25519HDPublicKey.fromBase58(associatedSenderAccount.pubkey),
@ -483,6 +516,16 @@ class SolanaWalletClient {
commitment,
);
bool hasSufficientFundsLeft = await hasSufficientFundsLeftForRent(
inputAmount: inputAmount,
fee: fee,
solBalance: solBalance,
);
if (!hasSufficientFundsLeft) {
throw SolanaSignSPLTokenTransactionRentException();
}
final signedTx = await _signTransactionInternal(
message: message,
signers: signers,

View file

@ -19,3 +19,20 @@ class SolanaTransactionWrongBalanceException implements Exception {
@override
String toString() => exceptionMessage;
}
class SolanaSignNativeTokenTransactionRentException implements Exception {}
class SolanaCreateAssociatedTokenAccountException implements Exception {
final String exceptionMessage;
SolanaCreateAssociatedTokenAccountException(this.exceptionMessage);
}
class SolanaSignSPLTokenTransactionRentException implements Exception {}
class SolanaNoAssociatedTokenAccountException implements Exception {
const SolanaNoAssociatedTokenAccountException(this.account, this.mint);
final String account;
final String mint;
}

View file

@ -228,6 +228,8 @@ abstract class SolanaWalletBase
final walletBalanceForCurrency = balance[transactionCurrency]!.balance;
final solBalance = balance[CryptoCurrency.sol]!.balance;
double totalAmount = 0.0;
bool isSendAll = false;
@ -279,6 +281,7 @@ abstract class SolanaWalletBase
? solCredentials.outputs.first.extractedAddress!
: solCredentials.outputs.first.address,
isSendAll: isSendAll,
solBalance: solBalance,
);
return pendingSolanaTransaction;

View file

@ -1,4 +1,3 @@
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/contact.dart';
import 'package:cake_wallet/entities/evm_transaction_error_fees_handler.dart';
import 'package:cake_wallet/entities/priority_for_wallet_type.dart';
@ -14,7 +13,6 @@ import 'package:cake_wallet/polygon/polygon.dart';
import 'package:cake_wallet/reactions/wallet_connect.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/solana/solana.dart';
import 'package:cake_wallet/src/screens/ur/animated_ur_page.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/tron/tron.dart';
import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart';
@ -29,6 +27,7 @@ import 'package:cw_core/unspent_coin_type.dart';
import 'package:cake_wallet/view_model/send/output.dart';
import 'package:cake_wallet/view_model/send/send_template_view_model.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:cw_solana/solana_exceptions.dart';
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
@ -427,7 +426,7 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
//
// state = FailureState(errorMsg);
// } else {
state = FailureState(translateErrorMessage(e, wallet.type, wallet.currency));
state = FailureState(translateErrorMessage(e, wallet.type, wallet.currency));
// }
}
return null;
@ -487,10 +486,11 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
try {
state = TransactionCommitting();
if (pendingTransaction!.shouldCommitUR()) {
final urstr = await pendingTransaction!.commitUR();
final result = await Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: urstr);
final result =
await Navigator.of(context).pushNamed(Routes.urqrAnimatedPage, arguments: urstr);
if (result == null) {
state = FailureState("Canceled by user");
return;
@ -507,12 +507,9 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
final descriptionKey = '${pendingTransaction!.id}_${wallet.walletAddresses.primaryAddress}';
_settingsStore.shouldSaveRecipientAddress
? await transactionDescriptionBox.add(TransactionDescription(
id: descriptionKey,
recipientAddress: address,
transactionNote: note))
: await transactionDescriptionBox.add(TransactionDescription(
id: descriptionKey,
transactionNote: note));
id: descriptionKey, recipientAddress: address, transactionNote: note))
: await transactionDescriptionBox
.add(TransactionDescription(id: descriptionKey, transactionNote: note));
}
state = TransactionCommitted();
@ -674,10 +671,26 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
lamportsNeeded != null ? ((lamportsNeeded + 5000) / lamportsPerSol) : 0.0;
return S.current.insufficient_lamports(solValueNeeded.toString());
} else {
printV("No match found.");
return S.current.insufficient_lamport_for_tx;
}
}
if (error is SolanaSignNativeTokenTransactionRentException) {
return S.current.solana_sign_native_transaction_rent_exception;
}
if (error is SolanaCreateAssociatedTokenAccountException) {
return S.current.solana_create_associated_token_account_exception;
}
if (error is SolanaSignSPLTokenTransactionRentException) {
return S.current.solana_sign_spl_token_transaction_rent_exception;
}
if (error is SolanaNoAssociatedTokenAccountException) {
return S.current.solana_no_associated_token_account_exception;
}
if (errorMessage.contains('insufficient funds for rent')) {
return S.current.insufficientFundsForRentError;
}

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "إعدادات المدفوعات الصامتة",
"single_seed_wallets_group": "محافظ بذرة واحدة",
"slidable": "قابل للانزلاق",
"solana_create_associated_token_account_exception": "خطأ في إنشاء حساب رمز المرتبط بعنوان المستلم.",
"solana_no_associated_token_account_exception": "لا يوجد حساب مميز مرتبط بهذا العنوان.",
"solana_sign_native_transaction_rent_exception": "لا يمكن إكمال المعاملة. غادر SOL غير كاف للإيجار بعد المعاملة. يرجى أن تصل إلى رصيد SOL أو تقليل كمية SOL التي ترسلها.",
"solana_sign_spl_token_transaction_rent_exception": "لا يمكن إكمال المعاملة. غادر SOL غير كاف للإيجار بعد المعاملة. يرجى أن تصل إلى توازن سولك.",
"sort_by": "ترتيب حسب",
"spend_key_private": "مفتاح الإنفاق (خاص)",
"spend_key_public": "مفتاح الإنفاق (عام)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Настройки за безшумни плащания",
"single_seed_wallets_group": "Портфейли с единични семена",
"slidable": "Плъзгащ се",
"solana_create_associated_token_account_exception": "Грешка Създаване на свързана сметка за жетони за адреса на получател.",
"solana_no_associated_token_account_exception": "Няма свързана сметка за този адрес.",
"solana_sign_native_transaction_rent_exception": "Транзакцията не може да бъде завършена. Недостатъчен сол оставен под наем след транзакция. Любезно допълнете баланса си на SOL или намалете количеството SOL, което изпращате.",
"solana_sign_spl_token_transaction_rent_exception": "Транзакцията не може да бъде завършена. Недостатъчен сол оставен под наем след транзакция. Любезно допълнете баланса си на SOL.",
"sort_by": "Сортирай по",
"spend_key_private": "Spend key (таен)",
"spend_key_public": "Spend key (публичен)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Nastavení tichých plateb",
"single_seed_wallets_group": "Jednorázové peněženky",
"slidable": "Posuvné",
"solana_create_associated_token_account_exception": "Vytvoření chyby přidruženého účtu tokenů pro adresu příjmu.",
"solana_no_associated_token_account_exception": "Pro tuto adresu není přidružen žádný přidružený token.",
"solana_sign_native_transaction_rent_exception": "Transakce nelze dokončit. Po transakci nedostatek Sol odešel k pronájmu. Laskavě doplňte rovnováhu SOL nebo snižte množství SOL, které odesíláte.",
"solana_sign_spl_token_transaction_rent_exception": "Transakce nelze dokončit. Po transakci nedostatek Sol odešel k pronájmu. Laskavě doplňte rovnováhu SOL.",
"sort_by": "Seřazeno podle",
"spend_key_private": "Klíč pro platby (soukromý)",
"spend_key_public": "Klíč pro platby (veřejný)",

View file

@ -502,8 +502,8 @@
"placeholder_transactions": "Ihre Transaktionen werden hier angezeigt",
"please_fill_totp": "Bitte geben Sie den 8-stelligen Code ein, der auf Ihrem anderen Gerät vorhanden ist",
"please_make_selection": "Bitte treffen Sie unten eine Auswahl zum Erstellen oder Wiederherstellen Ihrer Wallet.",
"Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
"please_reference_document": "Bitte verweisen Sie auf die folgenden Dokumente, um weitere Informationen zu erhalten.",
"Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
"please_select": "Bitte auswählen:",
"please_select_backup_file": "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.",
"please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Knoten zu verbinden",
@ -742,6 +742,10 @@
"silent_payments_settings": "Einstellungen für stille Zahlungen",
"single_seed_wallets_group": "Einzelne Wallets",
"slidable": "Verschiebbar",
"solana_create_associated_token_account_exception": "Fehler beim Erstellen des zugehörigen Token -Kontos für die Empfängeradresse.",
"solana_no_associated_token_account_exception": "Für diese Adresse ist kein Token -Konto zugeordnet.",
"solana_sign_native_transaction_rent_exception": "Transaktion kann nicht abgeschlossen werden. Unzureichende Sol ließen nach der Transaktion zur Miete gelassen. Bitte geben Sie Ihre SOL -Balance auf oder reduzieren Sie die Menge an SOL, die Sie senden.",
"solana_sign_spl_token_transaction_rent_exception": "Transaktion kann nicht abgeschlossen werden. Unzureichende Sol ließen nach der Transaktion zur Miete gelassen. Bitte geben Sie Ihre SOL -Balance auf.",
"sort_by": "Sortiere nach",
"spend_key_private": "Spend Key (geheim)",
"spend_key_public": "Spend Key (öffentlich)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Silent Payments settings",
"single_seed_wallets_group": "Single Seed Wallets",
"slidable": "Slidable",
"solana_create_associated_token_account_exception": "Error creating associated token account for receipient address.",
"solana_no_associated_token_account_exception": "There is no associated token account for this address.",
"solana_sign_native_transaction_rent_exception": "Transaction cannot be completed. Insufficient SOL left for rent after transaction. Kindly top up your SOL balance or reduce the amount of SOL you are sending.",
"solana_sign_spl_token_transaction_rent_exception": "Transaction cannot be completed. Insufficient SOL left for rent after transaction. Kindly top up your SOL balance.",
"sort_by": "Sort by",
"spend_key_private": "Spend key (private)",
"spend_key_public": "Spend key (public)",

View file

@ -742,6 +742,10 @@
"silent_payments_settings": "Configuración de pagos silenciosos",
"single_seed_wallets_group": "Billeteras de semillas individuales",
"slidable": "deslizable",
"solana_create_associated_token_account_exception": "Error a crear una cuenta de token asociada para la dirección recibida.",
"solana_no_associated_token_account_exception": "No hay una cuenta de token asociada para esta dirección.",
"solana_sign_native_transaction_rent_exception": "La transacción no se puede completar. Sol insuficiente que queda en alquiler después de la transacción. Por favor, supere su saldo de sol o reduzca la cantidad de sol que está enviando.",
"solana_sign_spl_token_transaction_rent_exception": "La transacción no se puede completar. Sol insuficiente que queda en alquiler después de la transacción. Por favor, supere su balance de sol.",
"sort_by": "Ordenar por",
"spend_key_private": "Llave de gasto (privada)",
"spend_key_public": "Llave de gasto (pública)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Paramètres de paiement silencieux",
"single_seed_wallets_group": "Portefeuilles de semences simples",
"slidable": "Glissable",
"solana_create_associated_token_account_exception": "Création d'erreur Création de jetons associés pour l'adresse détenue.",
"solana_no_associated_token_account_exception": "Il n'y a pas de compte de jeton associé pour cette adresse.",
"solana_sign_native_transaction_rent_exception": "La transaction ne peut pas être terminée. Sol insuffisant laissé à la location après la transaction. Veuillez compléter votre solde SOL ou réduire la quantité de Sol que vous envoyez.",
"solana_sign_spl_token_transaction_rent_exception": "La transaction ne peut pas être terminée. Sol insuffisant laissé à la location après la transaction. Veuillez compléter votre solde de Sol.",
"sort_by": "Trier par",
"spend_key_private": "Clef de dépense (spend key) (privée)",
"spend_key_public": "Clef de dépense (spend key) (publique)",

View file

@ -743,6 +743,10 @@
"silent_payments_settings": "Saitunan Silent",
"single_seed_wallets_group": "Guaro",
"slidable": "Mai iya zamewa",
"solana_create_associated_token_account_exception": "Kuskuren ƙirƙirar asusun Asusun da aka danganta don Adireshin karɓar karɓa.",
"solana_no_associated_token_account_exception": "Babu wani haɗin yanar gizo mai alaƙa don wannan adireshin.",
"solana_sign_native_transaction_rent_exception": "Ma'amala ba za a iya kammala ba. Rashin cancanta na Sol ya bar haya bayan ma'amala. Da kyau a saman ma'auni na Solku ko rage adadin Sol da kuke aikawa.",
"solana_sign_spl_token_transaction_rent_exception": "Ma'amala ba za a iya kammala ba. Rashin cancanta na Sol ya bar haya bayan ma'amala. Da kyau sama da ma'auni na Sol.",
"sort_by": "Kasa",
"spend_key_private": "makullin biya (maɓallin kalmar sirri)",
"spend_key_public": "makullin biya (maɓallin jama'a)",

View file

@ -743,6 +743,10 @@
"silent_payments_settings": "मूक भुगतान सेटिंग्स",
"single_seed_wallets_group": "एकल बीज बटुए",
"slidable": "फिसलने लायक",
"solana_create_associated_token_account_exception": "रसीद पते के लिए संबद्ध टोकन खाता बनाने में त्रुटि।",
"solana_no_associated_token_account_exception": "इस पते के लिए कोई जुड़ा हुआ टोकन खाता नहीं है।",
"solana_sign_native_transaction_rent_exception": "लेन -देन पूरा नहीं किया जा सकता है। अपर्याप्त सोल लेनदेन के बाद किराए के लिए छोड़ दिया। कृपया अपने सोल बैलेंस को टॉप करें या आपके द्वारा भेजे जा रहे सोल की मात्रा को कम करें।",
"solana_sign_spl_token_transaction_rent_exception": "लेन -देन पूरा नहीं किया जा सकता है। अपर्याप्त सोल लेनदेन के बाद किराए के लिए छोड़ दिया। कृपया अपने सोल बैलेंस को ऊपर रखें।",
"sort_by": "इसके अनुसार क्रमबद्ध करें",
"spend_key_private": "खर्च करना (निजी)",
"spend_key_public": "खर्च करना (जनता)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Postavke tihih plaćanja",
"single_seed_wallets_group": "Jednostruki novčanici",
"slidable": "Klizna",
"solana_create_associated_token_account_exception": "Pogreška u stvaranju povezanog token računa za adresu primanja.",
"solana_no_associated_token_account_exception": "Za ovu adresu ne postoji povezani token račun.",
"solana_sign_native_transaction_rent_exception": "Transakcija se ne može završiti. Nedovoljno sol ostao je za najam nakon transakcije. Ljubazno nadopunite svoj SOL saldo ili smanjite količinu SOL -a koju šaljete.",
"solana_sign_spl_token_transaction_rent_exception": "Transakcija se ne može završiti. Nedovoljno sol ostao je za najam nakon transakcije. Ljubazno nadopunite svoju sol ravnotežu.",
"sort_by": "Poredaj po",
"spend_key_private": "Spend key (privatni)",
"spend_key_public": "Spend key (javni)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Լուռ Վճարումներ Կարգավորումներ",
"single_seed_wallets_group": "Մեկ սերմերի դրամապանակներ",
"slidable": "Սահելի",
"solana_create_associated_token_account_exception": "Recesient Advent- ի համար հարակից նշանների հաշիվ ստեղծելու սխալ:",
"solana_no_associated_token_account_exception": "Այս հասցեի համար կապված նշանների հաշիվ չկա:",
"solana_sign_native_transaction_rent_exception": "Գործարքը հնարավոր չէ լրացնել: Անբավարար սոլը գործարքից հետո վարձով է մնացել: Սիրով վերացրեք ձեր SOL հավասարակշռությունը կամ նվազեցրեք ձեր ուղարկած սոլի քանակը:",
"solana_sign_spl_token_transaction_rent_exception": "Գործարքը հնարավոր չէ լրացնել: Անբավարար սոլը գործարքից հետո վարձով է մնացել: Սիրով վերացրեք ձեր SOL հավասարակշռությունը:",
"sort_by": "Դասավորել ըստ",
"spend_key_private": "Վճարման բանալի (գախտնի)",
"spend_key_public": "Վճարման բանալի (հանրային)",

View file

@ -744,6 +744,10 @@
"silent_payments_settings": "Pengaturan pembayaran diam",
"single_seed_wallets_group": "Dompet biji tunggal",
"slidable": "Dapat digeser",
"solana_create_associated_token_account_exception": "Kesalahan Membuat Akun Token Terkait untuk Alamat Penerima.",
"solana_no_associated_token_account_exception": "Tidak ada akun token terkait untuk alamat ini.",
"solana_sign_native_transaction_rent_exception": "Transaksi tidak dapat diselesaikan. SOL yang tidak mencukupi pergi untuk disewa setelah transaksi. Mohon tambah saldo SOL Anda atau kurangi jumlah SOL yang Anda kirim.",
"solana_sign_spl_token_transaction_rent_exception": "Transaksi tidak dapat diselesaikan. SOL yang tidak mencukupi pergi untuk disewa setelah transaksi. Mohon tambah saldo SOL Anda.",
"sort_by": "Sortir dengan",
"spend_key_private": "Kunci pengeluaran (privat)",
"spend_key_public": "Kunci pengeluaran (publik)",

View file

@ -743,6 +743,10 @@
"silent_payments_settings": "Impostazioni di pagamenti silenziosi",
"single_seed_wallets_group": "Portafogli singoli",
"slidable": "Scorrevole",
"solana_create_associated_token_account_exception": "Errore Creazione di account token associato per l'indirizzo dei ricevimenti.",
"solana_no_associated_token_account_exception": "Non esiste un account token associato per questo indirizzo.",
"solana_sign_native_transaction_rent_exception": "La transazione non può essere completata. Sol insufficiente lasciato in affitto dopo la transazione. Si prega di ricaricare il saldo SOL o ridurre la quantità di sol che stai inviando.",
"solana_sign_spl_token_transaction_rent_exception": "La transazione non può essere completata. Sol insufficiente lasciato in affitto dopo la transazione. Si prega di ricaricare il tuo equilibrio sol.",
"sort_by": "Ordina per",
"spend_key_private": "Chiave di spesa (privata)",
"spend_key_public": "Chiave di spesa (pubblica)",

View file

@ -742,6 +742,10 @@
"silent_payments_settings": "サイレントペイメント設定",
"single_seed_wallets_group": "シングルシードウォレット",
"slidable": "スライド可能",
"solana_create_associated_token_account_exception": "関連するトークンの作成エラー受信アドレスのアカウント。",
"solana_no_associated_token_account_exception": "このアドレスに関連付けられたトークンアカウントはありません。",
"solana_sign_native_transaction_rent_exception": "トランザクションは完了できません。取引後にレンタルのために残された不十分なソル。ソルバランスを補充するか、送信するソルの量を減らしてください。",
"solana_sign_spl_token_transaction_rent_exception": "トランザクションは完了できません。取引後にレンタルのために残された不十分なソル。ソルバランスを補充してください。",
"sort_by": "並び替え",
"spend_key_private": "キーを使う (プライベート)",
"spend_key_public": "キーを使う (パブリック)",

View file

@ -742,6 +742,10 @@
"silent_payments_settings": "조용한 지불 설정",
"single_seed_wallets_group": "단일 씨앗 지갑",
"slidable": "슬라이딩 가능",
"solana_create_associated_token_account_exception": "오류 생성 관련 토큰 계정 수령자 주소에 대한 계정.",
"solana_no_associated_token_account_exception": "이 주소에는 관련 토큰 계정이 없습니다.",
"solana_sign_native_transaction_rent_exception": "거래는 완료 될 수 없습니다. 거래 후 SOL이 임대료로 남았습니다. SOL 밸런스를 친절하게 위로 올리거나 보내는 솔의 양을 줄입니다.",
"solana_sign_spl_token_transaction_rent_exception": "거래는 완료 될 수 없습니다. 거래 후 SOL이 임대료로 남았습니다. SOL 균형을 친절하게 위에 올리십시오.",
"sort_by": "정렬 기준",
"spend_key_private": "지출 키 (은밀한)",
"spend_key_public": "지출 키 (공공의)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "အသံတိတ်ငွေပေးချေမှုဆက်တင်များ",
"single_seed_wallets_group": "တစ်ခုတည်းမျိုးစေ့ပိုက်ဆံအိတ်",
"slidable": "လျှောချနိုင်သည်။",
"solana_create_associated_token_account_exception": "Encipient Token အကောင့်ကိုလက်ခံသည့်လိပ်စာအတွက်အကောင့်များဖန်တီးခြင်းအတွက်အမှားအယွင်းများဖန်တီးခြင်း။",
"solana_no_associated_token_account_exception": "ဒီလိပ်စာအတွက်မပေါင်းသင်းတဲ့လက်ခဏာသက်သေအကောင့်မရှိဘူး။",
"solana_sign_native_transaction_rent_exception": "ငွေပေးငွေယူကိုမပြီးစီးနိုင်ပါ။ ငွေပေးငွေယူပြီးနောက်ငှားရန် Sol မလုံလောက်ပါ။ ကြင်နာစွာသင်၏ SOR ချိန်ခွင်လျှာကိုငွေဖြည့်ပါသို့မဟုတ်သင်ပို့နေသည့်ပမာဏကိုလျှော့ချပါ။",
"solana_sign_spl_token_transaction_rent_exception": "ငွေပေးငွေယူကိုမပြီးစီးနိုင်ပါ။ ငွေပေးငွေယူပြီးနောက်ငှားရန် Sol မလုံလောက်ပါ။ ကြင်နာစွာသင်၏ s ကိုချိန်ခွင်လျှာကိုတက်ပါ။",
"sort_by": "အလိုက်စဥ်သည်",
"spend_key_private": "သော့သုံးရန် (သီးသန့်)",
"spend_key_public": "သုံးစွဲရန်သော့ (အများပြည်သူ)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Stille betalingsinstellingen",
"single_seed_wallets_group": "Enkele zaadportefeuilles",
"slidable": "Verschuifbaar",
"solana_create_associated_token_account_exception": "Fout bij het maken van een geassocieerd tokenaccount voor ontvangingsadres.",
"solana_no_associated_token_account_exception": "Er is geen bijbehorende tokenaccount voor dit adres.",
"solana_sign_native_transaction_rent_exception": "Transactie kan niet worden voltooid. Onvoldoende Sol vertrok naar huur na transactie. Vul uw SOL -balans aan of verminder de hoeveelheid SOL die u verzendt.",
"solana_sign_spl_token_transaction_rent_exception": "Transactie kan niet worden voltooid. Onvoldoende Sol vertrok naar huur na transactie. Vul uw SOL -balans op.",
"sort_by": "Sorteer op",
"spend_key_private": "Sleutel uitgeven (privaat)",
"spend_key_public": "Sleutel uitgeven (openbaar)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Ustawienia o cichej płatności",
"single_seed_wallets_group": "Pojedyncze portfele nasion",
"slidable": "Przesuwne",
"solana_create_associated_token_account_exception": "Błąd tworzenia powiązanego konta tokena dla adresu wpływającego.",
"solana_no_associated_token_account_exception": "Nie ma powiązanego konta tokena dla tego adresu.",
"solana_sign_native_transaction_rent_exception": "Transakcji nie można zakończyć. Niewystarczający SOL w lewo do czynszu po transakcji. Uprzejmie uzupełnij saldo Sol lub zmniejsz ilość wysyłanej przez Ciebie rozwiązania.",
"solana_sign_spl_token_transaction_rent_exception": "Transakcji nie można zakończyć. Niewystarczający SOL w lewo do czynszu po transakcji. Uprzejmie uzupełnij saldo Sol.",
"sort_by": "Sortuj według",
"spend_key_private": "Klucz prywatny",
"spend_key_public": "Klucz publiczny",

View file

@ -743,6 +743,10 @@
"silent_payments_settings": "Configurações de pagamentos silenciosos",
"single_seed_wallets_group": "Carteiras de sementes únicas",
"slidable": "Deslizável",
"solana_create_associated_token_account_exception": "Erro a criação de um token associado Conta do endereço de recebimento.",
"solana_no_associated_token_account_exception": "Não existe uma conta de token associada para este endereço.",
"solana_sign_native_transaction_rent_exception": "A transação não pode ser concluída. Sol insuficiente deixou para alugar após a transação. Por favor, complete seu saldo sol ou reduza a quantidade de sol que você está enviando.",
"solana_sign_spl_token_transaction_rent_exception": "A transação não pode ser concluída. Sol insuficiente deixou para alugar após a transação. Por favor, complete seu equilíbrio sol.",
"sort_by": "Ordenar por",
"spend_key_private": "Chave de gastos (privada)",
"spend_key_public": "Chave de gastos (pública)",

View file

@ -742,6 +742,10 @@
"silent_payments_settings": "Silent Payments Settings",
"single_seed_wallets_group": "Одиночные кошельки",
"slidable": "Скользящий",
"solana_create_associated_token_account_exception": "Ошибка создания ассоциированной учетной записи для адреса для адреса.",
"solana_no_associated_token_account_exception": "Для этого адреса нет связанной учетной записи токена.",
"solana_sign_native_transaction_rent_exception": "Сделка не может быть завершена. Недостаточный соль ушел в аренду после транзакции. Пожалуйста, поместите свой баланс Sol или уменьшите количество Sol, которое вы отправляете.",
"solana_sign_spl_token_transaction_rent_exception": "Сделка не может быть завершена. Недостаточный соль ушел в аренду после транзакции. Пожалуйста, пополните свой баланс Sol.",
"sort_by": "Сортировать по",
"spend_key_private": "Приватный ключ траты",
"spend_key_public": "Публичный ключ траты",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "การตั้งค่าการชำระเงินแบบเงียบ",
"single_seed_wallets_group": "กระเป๋าเงินเดียว",
"slidable": "เลื่อนได้",
"solana_create_associated_token_account_exception": "ข้อผิดพลาดในการสร้างบัญชีโทเค็นที่เกี่ยวข้องสำหรับที่อยู่รับ",
"solana_no_associated_token_account_exception": "ไม่มีบัญชีโทเค็นที่เกี่ยวข้องสำหรับที่อยู่นี้",
"solana_sign_native_transaction_rent_exception": "การทำธุรกรรมไม่สามารถเสร็จสิ้นได้ SOL ไม่เพียงพอเหลือให้เช่าหลังการทำธุรกรรม กรุณาเติมยอดคงเหลือโซลของคุณหรือลดจำนวนโซลที่คุณกำลังส่ง",
"solana_sign_spl_token_transaction_rent_exception": "การทำธุรกรรมไม่สามารถเสร็จสิ้นได้ SOL ไม่เพียงพอเหลือให้เช่าหลังการทำธุรกรรม กรุณาเติมยอดสมดุลโซลของคุณ",
"sort_by": "เรียงตาม",
"spend_key_private": "คีย์จ่าย (ส่วนตัว)",
"spend_key_public": "คีย์จ่าย (สาธารณะ)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Mga setting ng tahimik na pagbabayad",
"single_seed_wallets_group": "Solong mga pitaka ng binhi",
"slidable": "Slidable",
"solana_create_associated_token_account_exception": "Error sa paglikha ng nauugnay na token account para sa resibo address.",
"solana_no_associated_token_account_exception": "Walang nauugnay na token account para sa address na ito.",
"solana_sign_native_transaction_rent_exception": "Hindi makumpleto ang transaksyon. Hindi sapat na SOL na naiwan para sa upa pagkatapos ng transaksyon. Mabuting itaas ang iyong balanse sa sol o bawasan ang dami ng sol na iyong ipinapadala.",
"solana_sign_spl_token_transaction_rent_exception": "Hindi makumpleto ang transaksyon. Hindi sapat na SOL na naiwan para sa upa pagkatapos ng transaksyon. Mabuting itaas ang iyong balanse sa sol.",
"sort_by": "Pag-uri-uriin sa pamamagitan ng",
"spend_key_private": "Spend key (private)",
"spend_key_public": "Spend key (public)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "Sessiz Ödeme Ayarları",
"single_seed_wallets_group": "Tek tohum cüzdanları",
"slidable": "kaydırılabilir",
"solana_create_associated_token_account_exception": "ALIPITIENT ADRESİ İÇİN BAŞLANGIÇ HESABI oluşturma Hata.",
"solana_no_associated_token_account_exception": "Bu adres için ilişkili belirteç hesabı yoktur.",
"solana_sign_native_transaction_rent_exception": "İşlem tamamlanamaz. Yetersiz Sol işlemden sonra kira için kaldı. Lütfen sol bakiyenizi doldurun veya gönderdiğiniz Sol miktarını azaltın.",
"solana_sign_spl_token_transaction_rent_exception": "İşlem tamamlanamaz. Yetersiz Sol işlemden sonra kira için kaldı. Lütfen sol bakiyenizi doldurun.",
"sort_by": "Göre sırala",
"spend_key_private": "Harcama anahtarı (özel)",
"spend_key_public": "Harcama anahtarı (genel)",

View file

@ -742,6 +742,10 @@
"silent_payments_settings": "Налаштування мовчазних платежів",
"single_seed_wallets_group": "Поодинокі насінні гаманці",
"slidable": "Розсувний",
"solana_create_associated_token_account_exception": "Помилка створення пов’язаного облікового запису Token для адреси приймання.",
"solana_no_associated_token_account_exception": "Для цієї адреси немає пов’язаного облікового запису маркера.",
"solana_sign_native_transaction_rent_exception": "Транзакція не може бути завершена. Недостатня SOL залишила оренду після транзакції. Будь ласка, поповніть свій баланс SOL або зменшіть кількість SOL, який ви надсилаєте.",
"solana_sign_spl_token_transaction_rent_exception": "Транзакція не може бути завершена. Недостатня SOL залишила оренду після транзакції. Будь ласка, наповніть свій баланс SOL.",
"sort_by": "Сортувати за",
"spend_key_private": "Приватний ключ витрати",
"spend_key_public": "Публічний ключ витрати",

View file

@ -743,6 +743,10 @@
"silent_payments_settings": "خاموش ادائیگی کی ترتیبات",
"single_seed_wallets_group": "سنگل بیج کے بٹوے",
"slidable": "سلائیڈ ایبل",
"solana_create_associated_token_account_exception": "وصول کنندہ ایڈریس کے لئے وابستہ ٹوکن اکاؤنٹ بنانے میں غلطی۔",
"solana_no_associated_token_account_exception": "اس پتے کے لئے کوئی وابستہ ٹوکن اکاؤنٹ نہیں ہے۔",
"solana_sign_native_transaction_rent_exception": "لین دین مکمل نہیں کیا جاسکتا۔ ٹرانزیکشن کے بعد کرایہ کے لئے ناکافی SOL چھوڑ دیا گیا ہے۔ برائے مہربانی اپنے سول توازن کو اوپر کریں یا آپ بھیج رہے ہیں اس کی مقدار کو کم کریں۔",
"solana_sign_spl_token_transaction_rent_exception": "لین دین مکمل نہیں کیا جاسکتا۔ ٹرانزیکشن کے بعد کرایہ کے لئے ناکافی SOL چھوڑ دیا گیا ہے۔ برائے مہربانی اپنے سول توازن کو اوپر رکھیں۔",
"sort_by": "ترتیب دیں",
"spend_key_private": "خرچ کی کلید (نجی)",
"spend_key_public": "خرچ کی کلید (عوامی)",

View file

@ -740,6 +740,10 @@
"silent_payments_settings": "Cài đặt thanh toán im lặng",
"single_seed_wallets_group": "Ví hạt đơn",
"slidable": "Có thể kéo",
"solana_create_associated_token_account_exception": "Lỗi Tạo tài khoản mã thông báo liên quan cho địa chỉ biên lai.",
"solana_no_associated_token_account_exception": "Không có tài khoản mã thông báo liên quan cho địa chỉ này.",
"solana_sign_native_transaction_rent_exception": "Giao dịch không thể được hoàn thành. Không đủ Sol còn lại cho thuê sau khi giao dịch. Vui lòng tăng số dư Sol của bạn hoặc giảm số lượng sol bạn đang gửi.",
"solana_sign_spl_token_transaction_rent_exception": "Giao dịch không thể được hoàn thành. Không đủ Sol còn lại cho thuê sau khi giao dịch. Vui lòng lên cân bằng sol của bạn.",
"sort_by": "Sắp xếp theo",
"spend_key_private": "Khóa chi tiêu (riêng tư)",
"spend_key_public": "Khóa chi tiêu (công khai)",

View file

@ -742,6 +742,10 @@
"silent_payments_settings": "Awọn eto isanwo ti o dakẹ",
"single_seed_wallets_group": "Awọn Wowei Awọn gige",
"slidable": "Slidable",
"solana_create_associated_token_account_exception": "Aṣiṣe ṣiṣẹda akọọlẹ token ti o ni ibatan fun adirẹsi gbigba.",
"solana_no_associated_token_account_exception": "Ko si iroyin token ti o ni ibatan fun adirẹsi yii.",
"solana_sign_native_transaction_rent_exception": "Idunadura ko le pari. Solusi ti ko to ju fun iyalo lẹhin idunadura. Jowo oke iwọntunwọnsi rẹ tabi dinku iye sol ti o firanṣẹ.",
"solana_sign_spl_token_transaction_rent_exception": "Idunadura ko le pari. Solusi ti ko to ju fun iyalo lẹhin idunadura. Sanra si oke ni iwọntunwọnsi Sol rẹ.",
"sort_by": "Sa pelu",
"spend_key_private": "Kọ́kọ́rọ́ sísan (àdáni)",
"spend_key_public": "Kọ́kọ́rọ́ sísan (kò àdáni)",

View file

@ -741,6 +741,10 @@
"silent_payments_settings": "无声付款设置",
"single_seed_wallets_group": "单个种子钱包",
"slidable": "可滑动",
"solana_create_associated_token_account_exception": "错误创建有关接收地址的关联令牌帐户。",
"solana_no_associated_token_account_exception": "该地址没有关联的令牌帐户。",
"solana_sign_native_transaction_rent_exception": "交易无法完成。交易后剩下的溶胶不足。请增强您的溶胶余额或减少您发送的SOL的量。",
"solana_sign_spl_token_transaction_rent_exception": "交易无法完成。交易后剩下的溶胶不足。请增强您的溶液余额。",
"sort_by": "排序方式",
"spend_key_private": "Spend 密钥 (私钥)",
"spend_key_public": "Spend 密钥 (公钥)",