feat: Load default tokens in available swap currencies (#2926)

This commit is contained in:
David Adegoke
2026-02-19 18:51:29 +01:00
committed by GitHub
parent b00fb19286
commit 2398e299dc
6 changed files with 88 additions and 9 deletions
+4
View File
@@ -307,6 +307,10 @@ class CWEVM extends EVM {
HardwareWalletService getTrezorHardwareWalletService(trezor.TrezorConnect connect) =>
EVMChainTrezorService(connect);
@override
List<Erc20Token> getDefaultTokensByChainId(int chainId) =>
EVMChainDefaultTokens.getDefaultTokensByChainId(chainId);
@override
List<String> getDefaultTokenContractAddresses(WalletBase wallet) {
final chainId = getSelectedChainId(wallet);
+3
View File
@@ -172,6 +172,9 @@ class CWSolana extends Solana {
return (wallet as SolanaWallet).estimatedFee;
}
@override
List<SPLToken> getDefaultSPLTokens() => DefaultSPLTokens().initialSPLTokens;
@override
List<String> getDefaultTokenContractAddresses() {
return DefaultSPLTokens().initialSPLTokens.map((e) => e.mintAddress).toList();
+3
View File
@@ -134,6 +134,9 @@ class CWTron extends Tron {
(wallet as TronWallet).updateScanProviderUsageState(isEnabled);
}
@override
List<TronToken> getDefaultTronTokens() => DefaultTronTokens().initialTronTokens;
@override
List<String> getDefaultTokenContractAddresses() {
return DefaultTronTokens().initialTronTokens.map((e) => e.contractAddress).toList();
+69
View File
@@ -1,5 +1,7 @@
import 'package:cake_wallet/reactions/wallet_connect.dart';
import 'package:cake_wallet/evm/evm.dart';
import 'package:cake_wallet/solana/solana.dart';
import 'package:cake_wallet/tron/tron.dart';
import 'package:cw_core/cake_hive.dart';
import 'package:cw_core/crypto_currency.dart';
import 'package:cw_core/currency_for_wallet_type.dart';
@@ -75,6 +77,73 @@ class TokenUtilities {
return unique;
}
static List<Erc20Token> loadDefaultEvmTokensForSwap() {
if (evm == null) return [];
final tokens = <Erc20Token>[];
final seen = <String>{};
for (final chain in evm!.getAllChains()) {
for (final token in evm!.getDefaultTokensByChainId(chain.chainId)) {
final key = '${chain.chainId}|${token.contractAddress.toLowerCase()}';
if (seen.add(key)) tokens.add(token);
}
}
return tokens;
}
static List<SPLToken> loadDefaultSolTokensForSwap() =>
solana != null ? solana!.getDefaultSPLTokens() : [];
static List<TronToken> loadDefaultTronTokensForSwap() =>
tron != null ? tron!.getDefaultTronTokens() : [];
static Future<List<Erc20Token>> loadEvmTokensForSwap() async {
final defaultTokens = loadDefaultEvmTokensForSwap();
final userTokens = await loadAllUniqueEvmTokens();
final seen = <String>{};
final result = <Erc20Token>[];
for (final t in [...defaultTokens, ...userTokens]) {
final key = '${t.tag ?? 'ETH'}|${t.contractAddress.toLowerCase()}';
if (seen.add(key)) result.add(t);
}
return result;
}
static Future<List<SPLToken>> loadSolTokensForSwap() async {
final defaultTokens = loadDefaultSolTokensForSwap();
final userTokens = await loadAllUniqueSolTokens();
final seen = <String>{};
final result = <SPLToken>[];
for (final t in [...defaultTokens, ...userTokens]) {
final key = t.mintAddress.toLowerCase();
if (seen.add(key)) result.add(t);
}
return result;
}
static Future<List<TronToken>> loadTronTokensForSwap() async {
final defaultTokens = loadDefaultTronTokensForSwap();
final userTokens = await loadAllUniqueTronTokens();
final seen = <String>{};
final result = <TronToken>[];
for (final t in [...defaultTokens, ...userTokens]) {
final key = t.contractAddress.toLowerCase();
if (seen.add(key)) result.add(t);
}
return result;
}
/// Finds a token by address across wallets depending on [walletType]
/// - EVM chains: match by contractAddress
/// - Solana: match by mintAddress
@@ -1126,12 +1126,11 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
@action
Future<void> _injectUserEthTokensIntoCurrencyLists() async {
final userTokens = await TokenUtilities.loadAllUniqueEvmTokens();
final tokens = await TokenUtilities.loadEvmTokensForSwap();
final toAddReceive = <CryptoCurrency>[];
final toAddDeposit = <CryptoCurrency>[];
for (final token in userTokens) {
for (final token in tokens) {
if (!_listContainsToken(receiveCurrencies, token)) toAddReceive.add(token);
if (!_listContainsToken(depositCurrencies, token)) toAddDeposit.add(token);
}
@@ -1164,12 +1163,11 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
@action
Future<void> _injectUserSplTokensIntoCurrencyLists() async {
final userTokens = await TokenUtilities.loadAllUniqueSolTokens();
final tokens = await TokenUtilities.loadSolTokensForSwap();
final toAddReceive = <CryptoCurrency>[];
final toAddDeposit = <CryptoCurrency>[];
for (final token in userTokens) {
for (final token in tokens) {
if (!_listContainsSplToken(receiveCurrencies, token)) toAddReceive.add(token);
if (!_listContainsSplToken(depositCurrencies, token)) toAddDeposit.add(token);
}
@@ -1192,12 +1190,11 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
@action
Future<void> _injectUserTronTokensIntoCurrencyLists() async {
final userTokens = await TokenUtilities.loadAllUniqueTronTokens();
final tokens = await TokenUtilities.loadTronTokensForSwap();
final toAddReceive = <CryptoCurrency>[];
final toAddDeposit = <CryptoCurrency>[];
for (final token in userTokens) {
for (final token in tokens) {
if (!_listContainsTronToken(receiveCurrencies, token)) toAddReceive.add(token);
if (!_listContainsTronToken(depositCurrencies, token)) toAddDeposit.add(token);
}
+3
View File
@@ -968,6 +968,7 @@ abstract class Solana {
String getTokenAddress(CryptoCurrency asset);
List<int>? getValidationLength(CryptoCurrency type);
double? getEstimateFees(WalletBase wallet);
List<SPLToken> getDefaultSPLTokens();
List<String> getDefaultTokenContractAddresses();
List<String> getDefaultTokenSymbols();
bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress);
@@ -1094,6 +1095,7 @@ abstract class Tron {
String? getTronTRC20EstimatedFee(WalletBase wallet);
void updateTronGridUsageState(WalletBase wallet, bool isEnabled);
List<TronToken> getDefaultTronTokens();
List<String> getDefaultTokenContractAddresses();
List<String> getDefaultTokenSymbols();
bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress);
@@ -1490,6 +1492,7 @@ abstract class EVM {
HardwareWalletService getTrezorHardwareWalletService(trezor.TrezorConnect connect);
// Utility methods
List<Erc20Token> getDefaultTokensByChainId(int chainId);
List<String> getDefaultTokenContractAddresses(WalletBase wallet);
List<String> getDefaultTokenSymbols(WalletBase wallet);
bool isTokenAlreadyAdded(WalletBase wallet, String contractAddress);