CW-1548: Solana wallet performance improvements (#3404)

* fix android CI

* add incremental sync, parallel fetch for native and spl token, and other improvments on perf and display regarding lagging
This commit is contained in:
David Adegoke
2026-07-16 19:57:23 +03:00
committed by GitHub
parent aa1dab4b1a
commit 0822c7d976
10 changed files with 284 additions and 108 deletions
+16 -3
View File
@@ -122,9 +122,13 @@ class CWSolana extends Solana {
return CryptoCurrency.sol;
}
return (wallet as SolanaWallet).splTokenCurrencies.firstWhere(
(element) => transaction.amount.currency.symbol == element.symbol,
);
final token = (wallet as SolanaWallet).splTokenBySymbol(transaction.amount.currency.symbol);
if (token == null) {
throw StateError('No SPL token for symbol ${transaction.amount.currency.symbol}');
}
return token;
}
@override
@@ -401,6 +405,15 @@ class CWSolana extends Solana {
}
await Future.wait(tokenChecks);
final discoveredMints = result.newTokens
.where((item) => item.token.enabled)
.map((item) => item.token.mintAddress)
.toList();
if (discoveredMints.isNotEmpty) {
await wallet.updateSPLTokenTransactions(specificMints: discoveredMints);
}
} catch (_) {}
}
@@ -14,7 +14,6 @@ import 'package:cake_wallet/zano/zano.dart';
import 'package:cw_core/amount/money.dart';
import 'package:cw_core/crypto_amount_format.dart';
import 'package:cw_core/transaction_history.dart';
import 'package:cw_core/utils/print_verbose.dart';
import 'package:cw_core/wallet_base.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
@@ -498,7 +497,6 @@ abstract class BalanceViewModelBase with Store {
final record = wallet.balance[curr]!;
final available = record.available - (record.secondAvailable ?? Money.zero(curr));
final price = fiatConversionStore.prices[curr] ?? 0;
printV(record.available);
ret += double.tryParse(calculateFiatAmount(price: price, cryptoAmount: available.toString())
.replaceAll(",", "")) ??
0;
@@ -227,9 +227,10 @@ abstract class DashboardViewModelBase with Store {
1;
} catch (_) {}
} else {
confirmations = appStore.wallet!.transactionHistory.transactions.values
.map((item) => item.isPending)
.fold(0, (val, pending) => pending ? val + 1 : val);
final pendingCount = appStore.wallet!.transactionHistory.transactions.values
.where((item) => item.isPending)
.length;
confirmations = pendingCount + 1;
}
return length * confirmations;
}, _transactionDisposerCallback, delay: 300);
@@ -1331,9 +1332,10 @@ abstract class DashboardViewModelBase with Store {
1;
} catch (_) {}
} else {
confirmations = appStore.wallet!.transactionHistory.transactions.values
.map((item) => item.isPending)
.fold(0, (val, pending) => pending ? val + 1 : val);
final pendingCount = appStore.wallet!.transactionHistory.transactions.values
.where((item) => item.isPending)
.length;
confirmations = pendingCount + 1;
}
return length * confirmations;
}, _transactionDisposerCallback, delay: 300);
@@ -195,7 +195,7 @@ class TransactionListItem extends ActionListItem with Keyable {
case WalletType.decred:
case WalletType.zcash:
amount = calculateFiatAmountRaw(
cryptoAmount: double.parse(transaction.amount.toString()),
cryptoAmount: transaction.amount.toDouble(),
price: price,
).withLocalSeperator(_appStore.settingsStore.languageCode);
case WalletType.ethereum:
@@ -206,15 +206,15 @@ class TransactionListItem extends ActionListItem with Keyable {
final asset = assetOfTransaction;
final price = balanceViewModel.fiatConversionStore.prices[asset];
amount = calculateFiatAmountRaw(
cryptoAmount: double.parse(transaction.amount.toString()),
cryptoAmount: transaction.amount.toDouble(),
price: price,
).withLocalSeperator(_appStore.settingsStore.languageCode);
break;
case WalletType.solana:
final asset = solana!.assetOfTransaction(balanceViewModel.wallet, transaction);
final asset = assetOfTransaction;
final price = balanceViewModel.fiatConversionStore.prices[asset];
amount = calculateFiatAmountRaw(
cryptoAmount: double.parse(transaction.amount.toString()),
cryptoAmount: transaction.amount.toDouble(),
price: price,
).withLocalSeperator(_appStore.settingsStore.languageCode);
break;
@@ -222,7 +222,7 @@ class TransactionListItem extends ActionListItem with Keyable {
final asset = tron!.assetOfTransaction(balanceViewModel.wallet, transaction);
final price = balanceViewModel.fiatConversionStore.prices[asset];
amount = calculateFiatAmountRaw(
cryptoAmount: double.parse(transaction.amount.toString()),
cryptoAmount: transaction.amount.toDouble(),
price: price,
).withLocalSeperator(_appStore.settingsStore.languageCode);
break;
@@ -234,7 +234,7 @@ class TransactionListItem extends ActionListItem with Keyable {
}
final price = balanceViewModel.fiatConversionStore.prices[asset];
amount = calculateFiatAmountRaw(
cryptoAmount: double.parse(transaction.amount.toString()),
cryptoAmount: transaction.amount.toDouble(),
price: price,
).withLocalSeperator(_appStore.settingsStore.languageCode);
break;