fix: SPL token balance display for xstocks and non-6-decimal tokens (#3052)

This commit is contained in:
David Adegoke
2026-03-13 02:02:56 +01:00
committed by GitHub
parent 10c2e51f45
commit 4d26b4ee6b
3 changed files with 17 additions and 11 deletions
+5 -2
View File
@@ -7,12 +7,15 @@ class SolanaBalance extends Balance {
BigInt.from(int.tryParse(balance.toStringAsFixed(isToken ? 6 : 9).replaceFirst(".", "")) ?? 0),
BigInt.from(int.tryParse(balance.toStringAsFixed(isToken ? 6 : 9).replaceFirst(".", "")) ?? 0));
// Using raw amount from RPC to avoid decimals mismatch for SPL tokens.
SolanaBalance.forToken(BigInt rawAmount, double uiAmount)
: balance = uiAmount,
super(rawAmount, rawAmount);
final double balance;
@override
String get formattedAdditionalBalance => _balanceFormatted();
@override
String get formattedAvailableBalance => _balanceFormatted();
String _balanceFormatted() {
+9 -7
View File
@@ -111,22 +111,24 @@ class SolanaWalletClient {
return null;
}
// Sum the balances of all accounts with the specified mint address
double totalBalance = 0.0;
// Sum raw amounts and ui amounts across all token accounts
BigInt totalRaw = BigInt.zero;
double totalUi = 0.0;
for (var tokenAccount in tokenAccounts) {
final tokenAmountResult = await _provider!.request(
SolanaRPCGetTokenAccountBalance(account: tokenAccount.pubkey),
);
final balance = tokenAmountResult.uiAmountString;
final raw = BigInt.tryParse(tokenAmountResult.amount) ?? BigInt.zero;
totalRaw += raw;
final balanceAsDouble = double.tryParse(balance ?? '0.0') ?? 0.0;
totalBalance += balanceAsDouble;
final ui = tokenAmountResult.uiAmount ??
(double.tryParse(tokenAmountResult.uiAmountString ?? '0') ?? 0.0);
totalUi += ui;
}
return SolanaBalance(totalBalance, true);
return SolanaBalance.forToken(totalRaw, totalUi);
} catch (_) {
if (throwOnError) {
rethrow;
+3 -2
View File
@@ -588,7 +588,8 @@ abstract class SolanaWalletBase
for (final entry in results) {
final token = entry.key;
final fetchedBalance = entry.value;
final currentBalance = balance[token] ?? SolanaBalance(0.0, true);
final currentBalance = balance[token] ??
SolanaBalance.forToken(BigInt.zero, 0.0);
balance[token] = fetchedBalance ?? currentBalance;
}
}
@@ -636,7 +637,7 @@ abstract class SolanaWalletBase
if (token.enabled) {
final tokenBalance = await _client.getSplTokenBalance(token.mintAddress, solanaAddress) ??
balance[token] ??
SolanaBalance(0.0, true);
SolanaBalance.forToken(BigInt.zero, 0.0);
balance[token] = tokenBalance;
} else {