diff --git a/cw_solana/lib/solana_balance.dart b/cw_solana/lib/solana_balance.dart index 5b8a533e8..7be967fbe 100644 --- a/cw_solana/lib/solana_balance.dart +++ b/cw_solana/lib/solana_balance.dart @@ -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() { diff --git a/cw_solana/lib/solana_client.dart b/cw_solana/lib/solana_client.dart index 5ceb7f756..aa86c15f7 100644 --- a/cw_solana/lib/solana_client.dart +++ b/cw_solana/lib/solana_client.dart @@ -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; diff --git a/cw_solana/lib/solana_wallet.dart b/cw_solana/lib/solana_wallet.dart index 7ffc1b24f..51ed325e3 100644 --- a/cw_solana/lib/solana_wallet.dart +++ b/cw_solana/lib/solana_wallet.dart @@ -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 {