From af89603b81c5c62b39c44def92ff58fe34791a71 Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Tue, 24 Jun 2025 03:47:21 +0100 Subject: [PATCH] CW-1103:Token Validation Issues (#2327) * feat(token_validation): Improve flow for adding new tokens across wallets This change: - Implements check to see if a token is already added, preventing duplicates - Triggers dialog warning if its a duplicate token - Takes EVM Chains contract adddress case-insensitivity when making checks for potential scams. * refactor(token_validation): Modify token management flow This change: - Removes duplicate token check during token addition in EVMChainWalletBase. - Introduces a flag to indicate if a token is being edited - Adjusts token addition validation to bypass checks when editing an existing token. * Update lib/src/screens/dashboard/edit_token_page.dart --------- Co-authored-by: Omar Hatem --- cw_evm/lib/evm_chain_wallet.dart | 14 ++++++++-- lib/ethereum/cw_ethereum.dart | 12 +++++++-- lib/polygon/cw_polygon.dart | 6 +++++ lib/solana/cw_solana.dart | 6 +++++ .../screens/dashboard/edit_token_page.dart | 22 +++++++++++++++ lib/tron/cw_tron.dart | 6 +++++ .../dashboard/home_settings_view_model.dart | 27 ++++++++++++++++++- lib/zano/cw_zano.dart | 6 +++++ res/values/strings_ar.arb | 1 + res/values/strings_bg.arb | 1 + res/values/strings_cs.arb | 1 + res/values/strings_de.arb | 1 + res/values/strings_en.arb | 1 + res/values/strings_es.arb | 1 + res/values/strings_fr.arb | 1 + res/values/strings_ha.arb | 1 + res/values/strings_hi.arb | 1 + res/values/strings_hr.arb | 1 + res/values/strings_hy.arb | 1 + res/values/strings_id.arb | 1 + res/values/strings_it.arb | 1 + res/values/strings_ja.arb | 1 + res/values/strings_ko.arb | 1 + res/values/strings_my.arb | 1 + res/values/strings_nl.arb | 1 + res/values/strings_pl.arb | 1 + res/values/strings_pt.arb | 1 + res/values/strings_ru.arb | 1 + res/values/strings_th.arb | 1 + res/values/strings_tl.arb | 1 + res/values/strings_tr.arb | 1 + res/values/strings_uk.arb | 1 + res/values/strings_ur.arb | 1 + res/values/strings_vi.arb | 1 + res/values/strings_yo.arb | 1 + res/values/strings_zh.arb | 1 + tool/configure.dart | 5 ++++ 37 files changed, 127 insertions(+), 5 deletions(-) diff --git a/cw_evm/lib/evm_chain_wallet.dart b/cw_evm/lib/evm_chain_wallet.dart index 1791258f5..a1285f0e4 100644 --- a/cw_evm/lib/evm_chain_wallet.dart +++ b/cw_evm/lib/evm_chain_wallet.dart @@ -198,8 +198,8 @@ abstract class EVMChainWalletBase for (var token in erc20Currencies) { bool isPotentialScam = false; - bool isWhitelisted = - getDefaultTokenContractAddresses.any((element) => element == token.contractAddress); + bool isWhitelisted = getDefaultTokenContractAddresses + .any((element) => element.toLowerCase() == token.contractAddress.toLowerCase()); final tokenSymbol = token.title.toUpperCase(); @@ -214,6 +214,16 @@ abstract class EVMChainWalletBase token.iconPath = null; await token.save(); } + + // For fixing wrongly classified tokens + if (!isPotentialScam && token.isPotentialScam) { + token.isPotentialScam = false; + final iconPath = CryptoCurrency.all + .firstWhere((element) => element.title.toUpperCase() == token.symbol.toUpperCase()) + .iconPath; + token.iconPath = iconPath; + await token.save(); + } } } diff --git a/lib/ethereum/cw_ethereum.dart b/lib/ethereum/cw_ethereum.dart index 3e3675d1f..a6a6a7205 100644 --- a/lib/ethereum/cw_ethereum.dart +++ b/lib/ethereum/cw_ethereum.dart @@ -199,8 +199,16 @@ class CWEthereum extends Ethereum { } @override - List getDefaultTokenContractAddresses() => - DefaultEthereumErc20Tokens().initialErc20Tokens.map((e) => e.contractAddress).toList(); + List getDefaultTokenContractAddresses() { + return DefaultEthereumErc20Tokens().initialErc20Tokens.map((e) => e.contractAddress).toList(); + } + + + @override + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress) { + final ethereumWallet = wallet as EthereumWallet; + return ethereumWallet.erc20Currencies.any((element) => element.contractAddress.toLowerCase() == contractAddress.toLowerCase()); + } Future createTokenApproval(WalletBase wallet, BigInt amount, String spender, CryptoCurrency token, TransactionPriority priority) => diff --git a/lib/polygon/cw_polygon.dart b/lib/polygon/cw_polygon.dart index 557cedc39..2e6e7dd13 100644 --- a/lib/polygon/cw_polygon.dart +++ b/lib/polygon/cw_polygon.dart @@ -216,4 +216,10 @@ class CWPolygon extends Polygon { .initialPolygonErc20Tokens .map((e) => e.contractAddress) .toList(); + + @override + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress) { + final polygonWallet = wallet as PolygonWallet; + return polygonWallet.erc20Currencies.any((element) => element.contractAddress.toLowerCase() == contractAddress.toLowerCase()); + } } diff --git a/lib/solana/cw_solana.dart b/lib/solana/cw_solana.dart index 9036f5584..ca001bb3b 100644 --- a/lib/solana/cw_solana.dart +++ b/lib/solana/cw_solana.dart @@ -155,4 +155,10 @@ class CWSolana extends Solana { List getDefaultTokenContractAddresses() { return DefaultSPLTokens().initialSPLTokens.map((e) => e.mintAddress).toList(); } + + @override + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress) { + final solanaWallet = wallet as SolanaWallet; + return solanaWallet.splTokenCurrencies.any((element) => element.mintAddress == contractAddress); + } } diff --git a/lib/src/screens/dashboard/edit_token_page.dart b/lib/src/screens/dashboard/edit_token_page.dart index f36ca1456..8f9f67178 100644 --- a/lib/src/screens/dashboard/edit_token_page.dart +++ b/lib/src/screens/dashboard/edit_token_page.dart @@ -73,6 +73,7 @@ class _EditTokenPageBodyState extends State { bool _showDisclaimer = false; bool _disclaimerChecked = false; + bool isEditingToken = false; @override void initState() { @@ -88,6 +89,8 @@ class _EditTokenPageBodyState extends State { _tokenSymbolController.text = widget.token!.title; _tokenDecimalController.text = widget.token!.decimals.toString(); _tokenIconPathController.text = widget.token?.iconPath ?? ''; + + isEditingToken = true; } if (widget.initialContractAddress != null) { @@ -200,6 +203,25 @@ class _EditTokenPageBodyState extends State { onPressed: () async { if (_formKey.currentState!.validate() && (!_showDisclaimer || _disclaimerChecked)) { + final isTokenAlreadyAdded = isEditingToken + ? false + : await widget.homeSettingsViewModel + .checkIfTokenIsAlreadyAdded(_contractAddressController.text); + if (isTokenAlreadyAdded) { + showPopUp( + context: context, + builder: (dialogContext) { + return AlertWithOneAction( + alertTitle: S.current.warning, + alertContent: S.of(context).token_already_exists, + buttonText: S.of(context).ok, + buttonAction: () => Navigator.of(dialogContext).pop(), + ); + }, + ); + return; + } + final isWhitelisted = await widget.homeSettingsViewModel .checkIfTokenIsWhitelisted(_contractAddressController.text); diff --git a/lib/tron/cw_tron.dart b/lib/tron/cw_tron.dart index 8c29dab58..395129b8f 100644 --- a/lib/tron/cw_tron.dart +++ b/lib/tron/cw_tron.dart @@ -138,4 +138,10 @@ class CWTron extends Tron { List getDefaultTokenContractAddresses() { return DefaultTronTokens().initialTronTokens.map((e) => e.contractAddress).toList(); } + + @override + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress) { + final tronWallet = wallet as TronWallet; + return tronWallet.tronTokenCurrencies.any((element) => element.contractAddress == contractAddress); + } } diff --git a/lib/view_model/dashboard/home_settings_view_model.dart b/lib/view_model/dashboard/home_settings_view_model.dart index f16d2aa95..fdf4d75a5 100644 --- a/lib/view_model/dashboard/home_settings_view_model.dart +++ b/lib/view_model/dashboard/home_settings_view_model.dart @@ -126,6 +126,31 @@ abstract class HomeSettingsViewModelBase with Store { } } + @action + bool checkIfTokenIsAlreadyAdded(String contractAddress) { + if (_balanceViewModel.wallet.type == WalletType.ethereum) { + return ethereum!.isTokenAlreadyAdded(_balanceViewModel.wallet, contractAddress); + } + + if (_balanceViewModel.wallet.type == WalletType.polygon) { + return polygon!.isTokenAlreadyAdded(_balanceViewModel.wallet, contractAddress); + } + + if (_balanceViewModel.wallet.type == WalletType.solana) { + return solana!.isTokenAlreadyAdded(_balanceViewModel.wallet, contractAddress); + } + + if (_balanceViewModel.wallet.type == WalletType.tron) { + return tron!.isTokenAlreadyAdded(_balanceViewModel.wallet, contractAddress); + } + + if (_balanceViewModel.wallet.type == WalletType.zano) { + return zano!.isTokenAlreadyAdded(_balanceViewModel.wallet, contractAddress); + } + + return false; + } + @action Future deleteToken(CryptoCurrency token) async { try { @@ -297,7 +322,7 @@ abstract class HomeSettingsViewModelBase with Store { required bool isEthereum, }) async { final uri = Uri.https( - "api.etherscan.io", + "api.etherscan.io", "/v2/api", { "chainid": isEthereum ? "1" : "137", diff --git a/lib/zano/cw_zano.dart b/lib/zano/cw_zano.dart index 7bd515e32..ede37eabc 100644 --- a/lib/zano/cw_zano.dart +++ b/lib/zano/cw_zano.dart @@ -136,4 +136,10 @@ class CWZano extends Zano { Map> debugCallLength() { return api.debugCallLength(); } + + @override + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress) { + final zanoWallet = wallet as ZanoWallet; + return zanoWallet.zanoAssets.values.any((element) => element?.assetId == contractAddress); + } } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index a5b287384..0a48d4da5 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -913,6 +913,7 @@ "tip": "بقشيش:", "to": "ل", "today": "اليوم", + "token_already_exists": "رمز موجود بالفعل", "token_contract_address": "عنوان عقد الرمز", "token_decimal": "رمز عشري", "token_name": "اسم الرمز ، على سبيل المثال: Tether", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 805fd9273..c083b8297 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -913,6 +913,7 @@ "tip": "Tip:", "to": "Да", "today": "Днес", + "token_already_exists": "Токена вече съществува", "token_contract_address": "Адрес на токен договор", "token_decimal": "Токен десетичен", "token_name": "Име на токена, напр.: Tether", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 658bcdf6e..49becb211 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -913,6 +913,7 @@ "tip": "Spropitné:", "to": "Na", "today": "Dnes", + "token_already_exists": "Token již existuje", "token_contract_address": "Adresa tokenové smlouvy", "token_decimal": "Token v desítkové soustavě", "token_name": "Název tokenu např.: Tether", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index b35f79cd3..4f5c3f87e 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -914,6 +914,7 @@ "tip": "Hinweis:", "to": "Zu", "today": "Heute", + "token_already_exists": "Token existiert bereits", "token_contract_address": "Token-Contract-Adresse", "token_decimal": "Token-Dezimalzahl", "token_name": "Token-Name, z. B.: Tether", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index b6e655674..3de612694 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -914,6 +914,7 @@ "tip": "Tip:", "to": "To", "today": "Today", + "token_already_exists": "Token already exists", "token_contract_address": "Token contract address", "token_decimal": "Token decimal", "token_name": "Token name eg: Tether", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 6a75f6e62..d19ec108d 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -914,6 +914,7 @@ "tip": "Consejo:", "to": "A", "today": "Hoy", + "token_already_exists": "Token ya existe", "token_contract_address": "Dirección de contrato de token", "token_decimal": "Token decimal", "token_name": "Nombre del token, por ejemplo: Tether", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index d2f8b4e6b..9056dbc49 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -913,6 +913,7 @@ "tip": "Pourboire:", "to": "À", "today": "Aujourd'hui", + "token_already_exists": "Le jeton existe déjà", "token_contract_address": "Adresse du contrat de token", "token_decimal": "Décimales de token", "token_name": "Nom du token, par exemple : Tether", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 6b73db8ed..b5f77a1c0 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -915,6 +915,7 @@ "tip": "Tukwici:", "to": "Zuwa", "today": "Yau", + "token_already_exists": "Alama an riga an wanzu", "token_contract_address": "Adireshin kwangilar Token", "token_decimal": "Alamar ƙima", "token_name": "Alamar sunan misali: Tether", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index f97b0f84f..79d25a1fb 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -915,6 +915,7 @@ "tip": "टिप:", "to": "को", "today": "आज", + "token_already_exists": "टोकन पहले से मौजूद है", "token_contract_address": "टोकन अनुबंध पता", "token_decimal": "सांकेतिक दशमलव", "token_name": "टोकन नाम जैसे: टीथर", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index ef9e04bbe..6f94329ff 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -913,6 +913,7 @@ "tip": "Savjet:", "to": "Do", "today": "Danas", + "token_already_exists": "Token već postoji", "token_contract_address": "Adresa ugovora tokena", "token_decimal": "Token decimalni", "token_name": "Naziv tokena npr.: Tether", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index ac1bfda99..c54d6b5b8 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -911,6 +911,7 @@ "tip": "Թեյավճար", "to": "Դեպի", "today": "Այսօր", + "token_already_exists": "Նշանն արդեն գոյություն ունի", "token_contract_address": "Token-ի պայմանագրի հասցե", "token_decimal": "Token-ի տասանիշ", "token_name": "Token-ի անուն, օրինակ՝ Tether", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index e693c98e5..7682903fc 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -916,6 +916,7 @@ "tip": "Tip:", "to": "Ke", "today": "Hari ini", + "token_already_exists": "Token sudah ada", "token_contract_address": "Alamat kontrak token", "token_decimal": "Desimal token", "token_name": "Nama token misalnya: Tether", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index b92969550..9d03f7947 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -914,6 +914,7 @@ "tip": "Suggerimento:", "to": "A", "today": "Oggi", + "token_already_exists": "Il token esiste già", "token_contract_address": "Indirizzo del contratto token", "token_decimal": "Decimale del token", "token_name": "Nome del token, ad esempio: Tether", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 9a0b9fc23..c92a6dab1 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -914,6 +914,7 @@ "tip": "ヒント: ", "to": "に", "today": "今日", + "token_already_exists": "トークンはすでに存在します", "token_contract_address": "トークンコントラクトアドレス", "token_decimal": "トークン10進数", "token_name": "トークン名 例: Tether", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index b70d30328..0184673d7 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -914,6 +914,7 @@ "tip": "팁:", "to": "받는 통화", "today": "오늘", + "token_already_exists": "토큰이 이미 존재합니다", "token_contract_address": "토큰 계약 주소", "token_decimal": "토큰 소수 자릿수", "token_name": "토큰 이름 (예: Tether)", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index f17bb7527..9b158be76 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -913,6 +913,7 @@ "tip": "အကြံပြုချက်-", "to": "သို့", "today": "ဒီနေ့", + "token_already_exists": "တိုကင်ရှိပြီးသား", "token_contract_address": "တိုကင်စာချုပ်လိပ်စာ", "token_decimal": "တိုကင်ဒဿမ", "token_name": "တိုကင်အမည် ဥပမာ- Tether", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index ebde13a68..948798b0a 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -913,6 +913,7 @@ "tip": "Tip:", "to": "Naar", "today": "Vandaag", + "token_already_exists": "Token bestaat al", "token_contract_address": "Token contractadres", "token_decimal": "Token decimaal", "token_name": "Tokennaam bijv.: Tether", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index d83ef2f3e..4b39a949b 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -913,6 +913,7 @@ "tip": "tip:", "to": "Do", "today": "Dzisiaj", + "token_already_exists": "Token już istnieje", "token_contract_address": "Adres kontraktu tokena", "token_decimal": "Token dziesiętny", "token_name": "Nazwa tokena, np.: Tether", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 020f37a78..c2f0f209c 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -915,6 +915,7 @@ "tip": "Dica:", "to": "Para", "today": "Hoje", + "token_already_exists": "Token já existe", "token_contract_address": "Endereço do contrato de token", "token_decimal": "Token decimal", "token_name": "Nome do token, por exemplo: Tether", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 003829450..1b59e84ab 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -914,6 +914,7 @@ "tip": "Совет:", "to": "К", "today": "Сегодня", + "token_already_exists": "Токен уже существует", "token_contract_address": "Адрес контракта токена", "token_decimal": "Десятичный токен", "token_name": "Имя токена, например: Tether", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 6a9c59f57..1fc8d81d5 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -913,6 +913,7 @@ "tip": "เพิ่มค่าตอบแทน:", "to": "ถึง", "today": "วันนี้", + "token_already_exists": "โทเค็นมีอยู่แล้ว", "token_contract_address": "ที่อยู่สัญญาโทเค็น", "token_decimal": "โทเค็นทศนิยม", "token_name": "ชื่อโทเค็น เช่น Tether", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 2f494adce..2ca3b02e4 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -913,6 +913,7 @@ "tip": "Tip:", "to": "Sa", "today": "Ngayon", + "token_already_exists": "Mayroon nang token", "token_contract_address": "Address ng token contract", "token_decimal": "Token decimal", "token_name": "Pangalan ng token, halimbawa: Tether", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 0b67edbe8..c5582b4ef 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -913,6 +913,7 @@ "tip": "Bahşiş:", "to": "İle", "today": "Bugün", + "token_already_exists": "Token zaten var", "token_contract_address": "Token sözleşme adresi", "token_decimal": "Belirteç ondalık", "token_name": "Belirteç adı, örneğin: Tether", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index a4078a341..cdfc91433 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -914,6 +914,7 @@ "tip": "Порада:", "to": "До", "today": "Сьогодні", + "token_already_exists": "Маркер вже існує", "token_contract_address": "Адреса договору маркера", "token_decimal": "Токен десятковий", "token_name": "Назва токена, наприклад: Tether", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 3c805fe6b..42a2398c2 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -915,6 +915,7 @@ "tip": "ٹپ:", "to": "to", "today": "آج", + "token_already_exists": "ٹوکن پہلے ہی موجود ہے", "token_contract_address": "ٹوکن کنٹریکٹ ایڈریس", "token_decimal": "ٹوکن اعشاریہ", "token_name": "ٹوکن کا نام جیسے: Tether", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index ea3281b2a..5f76e666a 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -910,6 +910,7 @@ "tip": "Mẹo:", "to": "ĐẾN", "today": "Hôm nay", + "token_already_exists": "Mã thông báo đã tồn tại", "token_contract_address": "Địa chỉ hợp đồng token", "token_decimal": "Số thập phân của token", "token_name": "Tên token ví dụ: Tether", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 109dac40f..360fcd6b6 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -914,6 +914,7 @@ "tip": "Owó àfikún:", "to": "Si", "today": "Lénìí", + "token_already_exists": "Token tẹlẹ wa", "token_contract_address": "Àmi guide adirẹsi", "token_decimal": "Àmi eleemewa", "token_name": "Orukọ àmi fun apẹẹrẹ: Tether", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 8f146e0fb..3bf18677c 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -913,6 +913,7 @@ "tip": "提示:", "to": "到", "today": "今天", + "token_already_exists": "令牌已经存在", "token_contract_address": "代币合约地址", "token_decimal": "令牌十进制", "token_name": "代币名称例如:Tether", diff --git a/tool/configure.dart b/tool/configure.dart index 95c8a4d5a..f6e1496de 100644 --- a/tool/configure.dart +++ b/tool/configure.dart @@ -760,6 +760,7 @@ abstract class Ethereum { void setLedgerConnection(WalletBase wallet, ledger.LedgerConnection connection); Future> getHardwareWalletAccounts(LedgerViewModel ledgerVM, {int index = 0, int limit = 5}); List getDefaultTokenContractAddresses(); + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress); } """; @@ -870,6 +871,7 @@ abstract class Polygon { void setLedgerConnection(WalletBase wallet, ledger.LedgerConnection connection); Future> getHardwareWalletAccounts(LedgerViewModel ledgerVM, {int index = 0, int limit = 5}); List getDefaultTokenContractAddresses(); + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress); } """; @@ -1156,6 +1158,7 @@ abstract class Solana { List? getValidationLength(CryptoCurrency type); double? getEstimateFees(WalletBase wallet); List getDefaultTokenContractAddresses(); + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress); } """; @@ -1234,6 +1237,7 @@ abstract class Tron { void updateTronGridUsageState(WalletBase wallet, bool isEnabled); List getDefaultTokenContractAddresses(); + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress); } """; @@ -1308,6 +1312,7 @@ abstract class Zano { String getAddress(WalletBase wallet); bool validateAddress(String address); Map> debugCallLength(); + bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress); } """; const zanoEmptyDefinition = 'Zano? zano;\n';