CW-615-Add-Check-For-Contract-Address (#1387)
* feat: Check if address is a valid Externally Owned Address * feat: Check if the EVM address received when exchanging tokens is a valid EOA address * move the contract address check to be only in the case of ThorChain [skip ci] * some enhancements * feat: Implement check for contract address for inputAddress when exchanging to ETH * fix: Remove previous implementation and clean up current implementation for the check for contract address * chore: Remove unneed space * chore: Remove unneed space --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
Adegoke David committed
Apr 25, 2024 at 02:14 UTC
2ac81250c24ebe84610242ac62591a3e063d974f
30 files changed
+146
-18
lib/core/create_trade_result.dart
new
+9
@@ -0,0 +1,9 @@
1
+class CreateTradeResult {
2
+ bool result;
3
+ String? errorMessage;
4
+
5
+ CreateTradeResult({
6
+ required this.result,
7
+ this.errorMessage,
8
+ });
9
+}
lib/view_model/exchange/exchange_view_model.dart
+105
-15
@@ -3,8 +3,20 @@ import 'dart:collection';
3
import 'dart:convert';
4
5
import 'package:bitcoin_base/bitcoin_base.dart';
6
-import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
6
+import 'package:cake_wallet/core/create_trade_result.dart';
7
+import 'package:cw_core/crypto_currency.dart';
8
+import 'package:cw_core/sync_status.dart';
9
+import 'package:cw_core/transaction_priority.dart';
10
+import 'package:cw_core/wallet_type.dart';
11
+import 'package:hive/hive.dart';
12
+import 'package:http/http.dart' as http;
13
+import 'package:intl/intl.dart';
14
+import 'package:mobx/mobx.dart';
15
+import 'package:shared_preferences/shared_preferences.dart';
16
+
17
+import 'package:cake_wallet/.secrets.g.dart' as secrets;
18
import 'package:cake_wallet/bitcoin/bitcoin.dart';
19
+import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
20
import 'package:cake_wallet/core/wallet_change_listener_view_model.dart';
21
import 'package:cake_wallet/entities/exchange_api_mode.dart';
22
import 'package:cake_wallet/entities/preferences_key.dart';
@@ -33,14 +45,6 @@ import 'package:cake_wallet/store/settings_store.dart';
45
import 'package:cake_wallet/store/templates/exchange_template_store.dart';
46
import 'package:cake_wallet/utils/feature_flag.dart';
47
import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart';
36
-import 'package:cw_core/crypto_currency.dart';
37
-import 'package:cw_core/sync_status.dart';
38
-import 'package:cw_core/transaction_priority.dart';
39
-import 'package:cw_core/wallet_type.dart';
40
-import 'package:hive/hive.dart';
41
-import 'package:intl/intl.dart';
42
-import 'package:mobx/mobx.dart';
43
-import 'package:shared_preferences/shared_preferences.dart';
48
49
part 'exchange_view_model.g.dart';
50
@@ -516,10 +520,12 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
520
trade.walletId = wallet.id;
521
trade.fromWalletAddress = wallet.walletAddresses.address;
522
519
- if (!isCanCreateTrade(trade)) {
523
+ final canCreateTrade = await isCanCreateTrade(trade);
524
+ if (!canCreateTrade.result) {
525
tradeState = TradeIsCreatedFailure(
521
- title: S.current.trade_not_created,
522
- error: S.current.thorchain_taproot_address_not_supported);
526
+ title: S.current.trade_not_created,
527
+ error: canCreateTrade.errorMessage ?? '',
528
+ );
529
return;
530
}
531
@@ -776,16 +782,100 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
782
783
int get receiveMaxDigits => receiveCurrency.decimals;
784
779
- bool isCanCreateTrade(Trade trade) {
785
+ Future<CreateTradeResult> isCanCreateTrade(Trade trade) async {
786
if (trade.provider == ExchangeProviderDescription.thorChain) {
787
final payoutAddress = trade.payoutAddress ?? '';
788
final fromWalletAddress = trade.fromWalletAddress ?? '';
789
final tapRootPattern = RegExp(P2trAddress.regex.pattern);
790
791
if (tapRootPattern.hasMatch(payoutAddress) || tapRootPattern.hasMatch(fromWalletAddress)) {
786
- return false;
792
+ return CreateTradeResult(
793
+ result: false,
794
+ errorMessage: S.current.thorchain_taproot_address_not_supported,
795
+ );
796
+ }
797
+
798
+ final currenciesToCheckPattern = RegExp('0x[0-9a-zA-Z]');
799
+
800
+ // Perform checks for payOutAddress
801
+ final isPayOutAddressAccordingToPattern = currenciesToCheckPattern.hasMatch(payoutAddress);
802
+
803
+ if (isPayOutAddressAccordingToPattern) {
804
+ final isPayOutAddressEOA = await _isExternallyOwnedAccountAddress(payoutAddress);
805
+
806
+ return CreateTradeResult(
807
+ result: isPayOutAddressEOA,
808
+ errorMessage:
809
+ !isPayOutAddressEOA ? S.current.thorchain_contract_address_not_supported : null,
810
+ );
811
+ }
812
+
813
+ // Perform checks for fromWalletAddress
814
+ final isFromWalletAddressAddressAccordingToPattern =
815
+ currenciesToCheckPattern.hasMatch(fromWalletAddress);
816
+
817
+ if (isFromWalletAddressAddressAccordingToPattern) {
818
+ final isFromWalletAddressEOA = await _isExternallyOwnedAccountAddress(fromWalletAddress);
819
+
820
+ return CreateTradeResult(
821
+ result: isFromWalletAddressEOA,
822
+ errorMessage:
823
+ !isFromWalletAddressEOA ? S.current.thorchain_contract_address_not_supported : null,
824
+ );
825
}
826
}
789
- return true;
827
+ return CreateTradeResult(result: true);
828
+ }
829
+
830
+ String _normalizeReceiveCurrency(CryptoCurrency receiveCurrency) {
831
+ switch (receiveCurrency) {
832
+ case CryptoCurrency.eth:
833
+ return 'eth';
834
+ case CryptoCurrency.maticpoly:
835
+ return 'polygon';
836
+ default:
837
+ return receiveCurrency.tag ?? '';
838
+ }
839
+ }
840
+
841
+ Future<bool> _isExternallyOwnedAccountAddress(String receivingAddress) async {
842
+ final normalizedReceiveCurrency = _normalizeReceiveCurrency(receiveCurrency);
843
+
844
+ final isEOAAddress = !(await _isContractAddress(normalizedReceiveCurrency, receivingAddress));
845
+ return isEOAAddress;
846
+ }
847
+
848
+ Future<bool> _isContractAddress(String chainName, String contractAddress) async {
849
+ final httpClient = http.Client();
850
+
851
+ final uri = Uri.https(
852
+ 'deep-index.moralis.io',
853
+ '/api/v2.2/erc20/metadata',
854
+ {
855
+ "chain": chainName,
856
+ "addresses": contractAddress,
857
+ },
858
+ );
859
+
860
+ try {
861
+ final response = await httpClient.get(
862
+ uri,
863
+ headers: {
864
+ "Accept": "application/json",
865
+ "X-API-Key": secrets.moralisApiKey,
866
+ },
867
+ );
868
+
869
+ final decodedResponse = jsonDecode(response.body)[0] as Map<String, dynamic>;
870
+
871
+ final name = decodedResponse['name'] as String?;
872
+
873
+ bool isContractAddress = name!.isNotEmpty;
874
+
875
+ return isContractAddress;
876
+ } catch (e) {
877
+ print(e);
878
+ return false;
879
+ }
880
}
881
}
lib/view_model/send/send_view_model.dart
+4
-2
@@ -324,14 +324,16 @@ abstract class SendViewModelBase extends WalletChangeListenerViewModel with Stor
324
Future<PendingTransaction?> createTransaction({ExchangeProvider? provider}) async {
325
try {
326
state = IsExecutingState();
327
+
328
pendingTransaction = await wallet.createTransaction(_credentials());
329
if (provider is ThorChainExchangeProvider) {
330
final outputCount = pendingTransaction?.outputCount ?? 0;
331
if (outputCount > 10) {
331
- throw Exception("ThorChain does not support more than 10 outputs");
332
+ throw Exception("THORChain does not support more than 10 outputs");
333
}
334
+
335
if (_hasTaprootInput(pendingTransaction)) {
334
- throw Exception("ThorChain does not support Taproot addresses");
336
+ throw Exception("THORChain does not support Taproot addresses");
337
}
338
}
339
state = ExecutedSuccessfullyState();
res/values/strings_ar.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "اسم القالب",
661
"third_intro_content": "يعيش Yats خارج Cake Wallet أيضًا. يمكن استبدال أي عنوان محفظة على وجه الأرض بـ Yat!",
662
"third_intro_title": "يتماشي Yat بلطف مع الآخرين",
663
+ "thorchain_contract_address_not_supported": "لا يدعم Thorchain الإرسال إلى عنوان العقد",
664
"thorchain_taproot_address_not_supported": "لا يدعم مزود Thorchain عناوين Taproot. يرجى تغيير العنوان أو تحديد مزود مختلف.",
665
"time": "${minutes}د ${seconds}س",
666
"tip": "بقشيش:",
res/values/strings_bg.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Име на шаблон",
661
"third_intro_content": "Yats също живее извън Cake Wallet. Всеки адрес на портфейл може да бъде заменен с Yat!",
662
"third_intro_title": "Yat добре се сработва с други",
663
+ "thorchain_contract_address_not_supported": "Thorchain не подкрепя изпращането до адрес на договор",
664
"thorchain_taproot_address_not_supported": "Доставчикът на Thorchain не поддържа адреси на TapRoot. Моля, променете адреса или изберете друг доставчик.",
665
"time": "${minutes} мин ${seconds} сек",
666
"tip": "Tip:",
res/values/strings_cs.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Název šablony",
661
"third_intro_content": "Yat existuje i mimo Cake Wallet. Jakákoliv adresa peněženky na světě může být nahrazena Yatem!",
662
"third_intro_title": "Yat dobře spolupracuje s ostatními",
663
+ "thorchain_contract_address_not_supported": "Thorchain nepodporuje odeslání na adresu smlouvy",
664
"thorchain_taproot_address_not_supported": "Poskytovatel Thorchain nepodporuje adresy Taproot. Změňte adresu nebo vyberte jiného poskytovatele.",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "Spropitné:",
res/values/strings_de.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "Vorlagenname",
662
"third_intro_content": "Yats leben auch außerhalb von Cake Wallet. Jede Wallet-Adresse auf der Welt kann durch ein Yat ersetzt werden!",
663
"third_intro_title": "Yat spielt gut mit anderen",
664
+ "thorchain_contract_address_not_supported": "Thorchain unterstützt das Senden an eine Vertragsadresse nicht",
665
"thorchain_taproot_address_not_supported": "Der Thorchain -Anbieter unterstützt keine Taproot -Adressen. Bitte ändern Sie die Adresse oder wählen Sie einen anderen Anbieter aus.",
666
"time": "${minutes}m ${seconds}s",
667
"tip": "Hinweis:",
res/values/strings_en.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Template Name",
661
"third_intro_content": "Yats live outside of Cake Wallet, too. Any wallet address on earth can be replaced with a Yat!",
662
"third_intro_title": "Yat plays nicely with others",
663
+ "thorchain_contract_address_not_supported": "THORChain does not support sending to a contract address",
664
"thorchain_taproot_address_not_supported": "The ThorChain provider does not support Taproot addresses. Please change the address or select a different provider.",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "Tip:",
res/values/strings_es.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "Nombre de la plantilla",
662
"third_intro_content": "Los Yats también viven fuera de Cake Wallet. Cualquier dirección de billetera en la tierra se puede reemplazar con un Yat!",
663
"third_intro_title": "Yat juega muy bien con otras",
664
+ "thorchain_contract_address_not_supported": "Thorchain no admite enviar a una dirección de contrato",
665
"thorchain_taproot_address_not_supported": "El proveedor de Thorchain no admite las direcciones de Taproot. Cambie la dirección o seleccione un proveedor diferente.",
666
"time": "${minutes}m ${seconds}s",
667
"tip": "Consejo:",
res/values/strings_fr.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Nom du modèle",
661
"third_intro_content": "Les Yats existent aussi en dehors de Cake Wallet. Toute adresse sur terre peut être remplacée par un Yat !",
662
"third_intro_title": "Yat est universel",
663
+ "thorchain_contract_address_not_supported": "Thorchain ne prend pas en charge l'envoi à une adresse de contrat",
664
"thorchain_taproot_address_not_supported": "Le fournisseur de Thorchain ne prend pas en charge les adresses de tapoot. Veuillez modifier l'adresse ou sélectionner un autre fournisseur.",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "Pourboire :",
res/values/strings_ha.arb
+1
@@ -662,6 +662,7 @@
662
"template_name": "Sunan Samfura",
663
"third_intro_content": "Yats suna zaune a wajen Kek Wallet, kuma. Ana iya maye gurbin kowane adireshin walat a duniya da Yat!",
664
"third_intro_title": "Yat yana wasa da kyau tare da wasu",
665
+ "thorchain_contract_address_not_supported": "Thorchain baya goyon bayan aika zuwa adireshin kwangila",
666
"thorchain_taproot_address_not_supported": "Mai ba da tallafi na ThorChain baya goyan bayan adreshin taproot. Da fatan za a canza adireshin ko zaɓi mai bayarwa daban.",
667
"time": "${minutes}m ${seconds}s",
668
"tip": "Tukwici:",
res/values/strings_hi.arb
+1
@@ -662,6 +662,7 @@
662
"template_name": "टेम्पलेट नाम",
663
"third_intro_content": "Yats Cake Wallet के बाहर भी रहता है। धरती पर किसी भी वॉलेट पते को Yat से बदला जा सकता है!",
664
"third_intro_title": "Yat दूसरों के साथ अच्छा खेलता है",
665
+ "thorchain_contract_address_not_supported": "थोरचेन एक अनुबंध पते पर भेजने का समर्थन नहीं करता है",
666
"thorchain_taproot_address_not_supported": "थोरचेन प्रदाता टैपरोट पते का समर्थन नहीं करता है। कृपया पता बदलें या एक अलग प्रदाता का चयन करें।",
667
"time": "${minutes}m ${seconds}s",
668
"tip": "टिप:",
res/values/strings_hr.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Naziv predloška",
661
"third_intro_content": "Yats žive i izvan Cake Wallet -a. Bilo koja adresa novčanika na svijetu može se zamijeniti Yat!",
662
"third_intro_title": "Yat se lijepo igra s drugima",
663
+ "thorchain_contract_address_not_supported": "Thorchain ne podržava slanje na adresu ugovora",
664
"thorchain_taproot_address_not_supported": "Thorchain pružatelj ne podržava Taproot adrese. Promijenite adresu ili odaberite drugog davatelja usluga.",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "Savjet:",
res/values/strings_id.arb
+1
@@ -663,6 +663,7 @@
663
"template_name": "Nama Templat",
664
"third_intro_content": "Yats hidup di luar Cake Wallet juga. Setiap alamat dompet di dunia dapat diganti dengan Yat!",
665
"third_intro_title": "Yat bermain baik dengan yang lain",
666
+ "thorchain_contract_address_not_supported": "Thorchain tidak mendukung pengiriman ke alamat kontrak",
667
"thorchain_taproot_address_not_supported": "Penyedia Thorchain tidak mendukung alamat Taproot. Harap ubah alamatnya atau pilih penyedia yang berbeda.",
668
"time": "${minutes}m ${seconds}s",
669
"tip": "Tip:",
res/values/strings_it.arb
+1
@@ -662,6 +662,7 @@
662
"template_name": "Nome modello",
663
"third_intro_content": "Yat può funzionare anche fuori da Cake Wallet. Qualsiasi indirizzo di portafoglio sulla terra può essere sostituito con uno Yat!",
664
"third_intro_title": "Yat gioca bene con gli altri",
665
+ "thorchain_contract_address_not_supported": "Thorchain non supporta l'invio a un indirizzo contrattuale",
666
"thorchain_taproot_address_not_supported": "Il provider di Thorchain non supporta gli indirizzi di TapRoot. Si prega di modificare l'indirizzo o selezionare un fornitore diverso.",
667
"time": "${minutes}m ${seconds}s",
668
"tip": "Suggerimento:",
res/values/strings_ja.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "テンプレート名",
662
"third_intro_content": "YatsはCakeWalletの外にも住んでいます。 地球上のどのウォレットアドレスもYatに置き換えることができます!",
663
"third_intro_title": "Yatは他の人とうまく遊ぶ",
664
+ "thorchain_contract_address_not_supported": "Thorchainは、契約アドレスへの送信をサポートしていません",
665
"thorchain_taproot_address_not_supported": "Thorchainプロバイダーは、TapRootアドレスをサポートしていません。アドレスを変更するか、別のプロバイダーを選択してください。",
666
"time": "${minutes}m ${seconds}s",
667
"tip": "ヒント: ",
res/values/strings_ko.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "템플릿 이름",
662
"third_intro_content": "Yats는 Cake Wallet 밖에서도 살고 있습니다. 지구상의 모든 지갑 주소는 Yat!",
663
"third_intro_title": "Yat는 다른 사람들과 잘 놉니다.",
664
+ "thorchain_contract_address_not_supported": "Thorchain은 계약 주소로 보내는 것을 지원하지 않습니다",
665
"thorchain_taproot_address_not_supported": "Thorchain 제공 업체는 Taproot 주소를 지원하지 않습니다. 주소를 변경하거나 다른 공급자를 선택하십시오.",
666
"time": "${minutes}m ${seconds}s",
667
"tip": "팁:",
res/values/strings_my.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "နမူနာပုံစံ",
661
"third_intro_content": "Yats သည် Cake Wallet အပြင်ဘက်တွင် နေထိုင်ပါသည်။ ကမ္ဘာပေါ်ရှိ မည်သည့်ပိုက်ဆံအိတ်လိပ်စာကို Yat ဖြင့် အစားထိုးနိုင်ပါသည်။",
662
"third_intro_title": "Yat သည် အခြားသူများနှင့် ကောင်းစွာကစားသည်။",
663
+ "thorchain_contract_address_not_supported": "Thorchain သည်စာချုပ်လိပ်စာသို့ပို့ခြင်းမပြုပါ",
664
"thorchain_taproot_address_not_supported": "Thorchain Provider သည် Taproot လိပ်စာများကိုမထောက်ခံပါ။ ကျေးဇူးပြု. လိပ်စာကိုပြောင်းပါသို့မဟုတ်အခြားပံ့ပိုးပေးသူကိုရွေးချယ်ပါ။",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "အကြံပြုချက်-",
res/values/strings_nl.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Sjabloonnaam",
661
"third_intro_content": "Yats wonen ook buiten Cake Wallet. Elk portemonnee-adres op aarde kan worden vervangen door een Yat!",
662
"third_intro_title": "Yat speelt leuk met anderen",
663
+ "thorchain_contract_address_not_supported": "Thorchain ondersteunt het verzenden niet naar een contractadres",
664
"thorchain_taproot_address_not_supported": "De Thorchain -provider ondersteunt geen Taprooot -adressen. Wijzig het adres of selecteer een andere provider.",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "Tip:",
res/values/strings_pl.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Nazwa szablonu",
661
"third_intro_content": "Yats mieszkają również poza Cake Wallet. Każdy adres portfela na ziemi można zastąpić Yat!",
662
"third_intro_title": "Yat ładnie bawi się z innymi",
663
+ "thorchain_contract_address_not_supported": "Thorchain nie wspiera wysyłania na adres umowy",
664
"thorchain_taproot_address_not_supported": "Dostawca Thorchain nie obsługuje adresów TAPROOT. Zmień adres lub wybierz innego dostawcę.",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "wskazówka:",
res/values/strings_pt.arb
+1
@@ -662,6 +662,7 @@
662
"template_name": "Nome do modelo",
663
"third_intro_content": "Yats também mora fora da Cake Wallet. Qualquer endereço de carteira na Terra pode ser substituído por um Yat!",
664
"third_intro_title": "Yat joga bem com os outros",
665
+ "thorchain_contract_address_not_supported": "Thorchain não suporta o envio para um endereço de contrato",
666
"thorchain_taproot_address_not_supported": "O provedor de Thorchain não suporta endereços de raiz de Tap. Altere o endereço ou selecione um provedor diferente.",
667
"time": "${minutes}m ${seconds}s",
668
"tip": "Dica:",
res/values/strings_ru.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "Имя Шаблона",
662
"third_intro_content": "Yat находятся за пределами Cake Wallet. Любой адрес кошелька на земле можно заменить на Yat!",
663
"third_intro_title": "Yat хорошо взаимодействует с другими",
664
+ "thorchain_contract_address_not_supported": "Thorchain не поддерживает отправку на адрес контракта",
665
"thorchain_taproot_address_not_supported": "Поставщик Thorchain не поддерживает адреса taproot. Пожалуйста, измените адрес или выберите другого поставщика.",
666
"time": "${minutes}мин ${seconds}сек",
667
"tip": "Совет:",
res/values/strings_th.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "ชื่อแม่แบบ",
661
"third_intro_content": "Yat อาศัยอยู่นอก Cake Wallet ด้วย ที่อยู่กระเป๋าใดๆ ทั่วโลกสามารถแทนด้วย Yat ได้อีกด้วย!",
662
"third_intro_title": "Yat ปฏิบัติตนอย่างดีกับผู้อื่น",
663
+ "thorchain_contract_address_not_supported": "Thorchain ไม่สนับสนุนการส่งไปยังที่อยู่สัญญา",
664
"thorchain_taproot_address_not_supported": "ผู้ให้บริการ Thorchain ไม่รองรับที่อยู่ taproot โปรดเปลี่ยนที่อยู่หรือเลือกผู้ให้บริการอื่น",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "เพิ่มค่าตอบแทน:",
res/values/strings_tl.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "Pangalan ng Template",
661
"third_intro_content": "Ang mga yats ay nakatira sa labas ng cake wallet, din. Ang anumang address ng pitaka sa mundo ay maaaring mapalitan ng isang yat!",
662
"third_intro_title": "Si Yat ay mahusay na gumaganap sa iba",
663
+ "thorchain_contract_address_not_supported": "Hindi sinusuportahan ng Thorchain ang pagpapadala sa isang address ng kontrata",
664
"thorchain_taproot_address_not_supported": "Ang Tagabigay ng Thorchain ay hindi sumusuporta sa mga address ng taproot. Mangyaring baguhin ang address o pumili ng ibang provider.",
665
"time": "${minutes} m ${seconds} s",
666
"tip": "Tip:",
res/values/strings_tr.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "şablon adı",
661
"third_intro_content": "Yat'lar Cake Wallet'ın dışında da çalışabilir. Dünya üzerindeki herhangi bir cüzdan adresi Yat ile değiştirilebilir!",
662
"third_intro_title": "Yat diğerleriyle iyi çalışır",
663
+ "thorchain_contract_address_not_supported": "Thorchain bir sözleşme adresine göndermeyi desteklemiyor",
664
"thorchain_taproot_address_not_supported": "Thorchain sağlayıcısı Taproot adreslerini desteklemiyor. Lütfen adresi değiştirin veya farklı bir sağlayıcı seçin.",
665
"time": "${minutes}d ${seconds}s",
666
"tip": "Bahşiş:",
res/values/strings_uk.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "Назва шаблону",
662
"third_intro_content": "Yat знаходиться за межами Cake Wallet. Будь-яку адресу гаманця на землі можна замінити на Yat!",
663
"third_intro_title": "Yat добре взаємодіє з іншими",
664
+ "thorchain_contract_address_not_supported": "Thorchain не підтримує надсилання на адресу контракту",
665
"thorchain_taproot_address_not_supported": "Постачальник Thorchain не підтримує адреси Taproot. Будь ласка, змініть адресу або виберіть іншого постачальника.",
666
"time": "${minutes}хв ${seconds}сек",
667
"tip": "Порада:",
res/values/strings_ur.arb
+1
@@ -662,6 +662,7 @@
662
"template_name": "ٹیمپلیٹ کا نام",
663
"third_intro_content": "Yats بھی Cake والیٹ سے باہر رہتے ہیں۔ زمین پر کسی بھی بٹوے کے پتے کو Yat سے تبدیل کیا جا سکتا ہے!",
664
"third_intro_title": "Yat دوسروں کے ساتھ اچھی طرح کھیلتا ہے۔",
665
+ "thorchain_contract_address_not_supported": "تھورچین معاہدے کے پتے بھیجنے کی حمایت نہیں کرتا ہے",
666
"thorchain_taproot_address_not_supported": "تھورچین فراہم کنندہ ٹیپروٹ پتے کی حمایت نہیں کرتا ہے۔ براہ کرم پتہ تبدیل کریں یا ایک مختلف فراہم کنندہ کو منتخب کریں۔",
667
"time": "${minutes}m ${seconds}s",
668
"tip": "ٹپ:",
res/values/strings_yo.arb
+1
@@ -661,6 +661,7 @@
661
"template_name": "Orukọ Awoṣe",
662
"third_intro_content": "A sì lè lo Yats níta Cake Wallet. A lè rọ́pò Àdírẹ́sì kankan àpamọ́wọ́ fún Yat!",
663
"third_intro_title": "Àlàáfíà ni Yat àti àwọn ìmíìn jọ wà",
664
+ "thorchain_contract_address_not_supported": "Thorchain ko ṣe atilẹyin fifiranṣẹ si adirẹsi adehun kan",
665
"thorchain_taproot_address_not_supported": "Olupese Trockchain ko ṣe atilẹyin awọn adirẹsi Taproot. Jọwọ yi adirẹsi pada tabi yan olupese ti o yatọ.",
666
"time": "${minutes}ìṣj ${seconds}ìṣs",
667
"tip": "Owó àfikún:",
res/values/strings_zh.arb
+1
@@ -660,6 +660,7 @@
660
"template_name": "模板名称",
661
"third_intro_content": "Yats 也住在 Cake Wallet 之外。 地球上任何一個錢包地址都可以用一個Yat來代替!",
662
"third_intro_title": "Yat 和別人玩得很好",
663
+ "thorchain_contract_address_not_supported": "Thorchain不支持发送到合同地址",
664
"thorchain_taproot_address_not_supported": "Thorchain提供商不支持Taproot地址。请更改地址或选择其他提供商。",
665
"time": "${minutes}m ${seconds}s",
666
"tip": "提示:",
tool/configure.dart
+2
-1
@@ -1057,7 +1057,8 @@ Future<void> generatePubspec(
1057
final inputFile = File(pubspecOutputPath);
1058
final inputText = await inputFile.readAsString();
1059
final inputLines = inputText.split('\n');
1060
- final dependenciesIndex = inputLines.indexWhere((line) => line.toLowerCase().contains('dependencies:'));
1060
+ final dependenciesIndex =
1061
+ inputLines.indexWhere((line) => line.toLowerCase().contains('dependencies:'));
1062
var output = cwCore;
1063
1064
if (hasMonero) {