mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-17 05:41:29 +02:00
fix: SPL token balance display for xstocks and non-6-decimal tokens (#3052)
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user