mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-17 05:41:29 +02:00
feat: Load default tokens in available swap currencies (#2926)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user