java-topology/defects/cake_wallet-0001/patch/cake_wallet-0001.patch

67 lines
3.5 KiB
Diff

# UNDF: UNDF-2026-000000923
--- a/lib/view_model/exchange/exchange_view_model.dart
+++ b/lib/view_model/exchange/exchange_view_model.dart
@@ -1643,10 +1643,17 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with S
Future<void> _injectUserEthTokensIntoCurrencyLists() async {
final tokens = await TokenUtilities.loadEvmTokensForSwap();
final toAddReceive = <CryptoCurrency>[];
final toAddDeposit = <CryptoCurrency>[];
+ // Build sets of existing contract addresses for O(1) lookup instead of
+ // scanning receiveCurrencies/depositCurrencies with .any() per token.
+ final receiveAddrs = receiveCurrencies.whereType<Erc20Token>()
+ .map((t) => t.contractAddress.toLowerCase()).toSet();
+ final depositAddrs = depositCurrencies.whereType<Erc20Token>()
+ .map((t) => t.contractAddress.toLowerCase()).toSet();
+
for (final token in tokens) {
- if (!_listContainsToken(receiveCurrencies, token)) toAddReceive.add(token);
- if (!_listContainsToken(depositCurrencies, token)) toAddDeposit.add(token);
+ final addr = token.contractAddress.toLowerCase();
+ if (!receiveAddrs.contains(addr)) toAddReceive.add(token);
+ if (!depositAddrs.contains(addr)) toAddDeposit.add(token);
}
if (toAddReceive.isNotEmpty) receiveCurrencies.addAll(toAddReceive);
@@ -1680,10 +1687,17 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with S
Future<void> _injectUserSplTokensIntoCurrencyLists() async {
final tokens = await TokenUtilities.loadSolTokensForSwap();
final toAddReceive = <CryptoCurrency>[];
final toAddDeposit = <CryptoCurrency>[];
+ // Build sets of existing mint addresses for O(1) lookup.
+ final receiveMints = receiveCurrencies.whereType<SPLToken>()
+ .map((t) => t.mintAddress.toLowerCase()).toSet();
+ final depositMints = depositCurrencies.whereType<SPLToken>()
+ .map((t) => t.mintAddress.toLowerCase()).toSet();
+
for (final token in tokens) {
- if (!_listContainsSplToken(receiveCurrencies, token)) toAddReceive.add(token);
- if (!_listContainsSplToken(depositCurrencies, token)) toAddDeposit.add(token);
+ final mint = token.mintAddress.toLowerCase();
+ if (!receiveMints.contains(mint)) toAddReceive.add(token);
+ if (!depositMints.contains(mint)) toAddDeposit.add(token);
}
if (toAddReceive.isNotEmpty) receiveCurrencies.addAll(toAddReceive);
@@ -1707,10 +1721,17 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with S
Future<void> _injectUserTronTokensIntoCurrencyLists() async {
final tokens = await TokenUtilities.loadTronTokensForSwap();
final toAddReceive = <CryptoCurrency>[];
final toAddDeposit = <CryptoCurrency>[];
+ // Build sets of existing contract addresses for O(1) lookup.
+ final receiveAddrs = receiveCurrencies.whereType<TronToken>()
+ .map((t) => t.contractAddress.toLowerCase()).toSet();
+ final depositAddrs = depositCurrencies.whereType<TronToken>()
+ .map((t) => t.contractAddress.toLowerCase()).toSet();
+
for (final token in tokens) {
- if (!_listContainsTronToken(receiveCurrencies, token)) toAddReceive.add(token);
- if (!_listContainsTronToken(depositCurrencies, token)) toAddDeposit.add(token);
+ final addr = token.contractAddress.toLowerCase();
+ if (!receiveAddrs.contains(addr)) toAddReceive.add(token);
+ if (!depositAddrs.contains(addr)) toAddDeposit.add(token);
}
if (toAddReceive.isNotEmpty) receiveCurrencies.addAll(toAddReceive);