From 5d940d37ccd83675297b298156a618d0fac2d64b Mon Sep 17 00:00:00 2001 From: Minimons Date: Sat, 25 Jul 2026 17:49:27 +0200 Subject: [PATCH] 40: Add SPL token balance lookup to SolanaWallet --- .../cryptowallet/solana/SolanaWallet.tjava | 19 +++++++++++++++ .../solana/impl/ref/SolanaWalletImpl.tjava | 23 +++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/tjava/com/r35157/cryptowallet/solana/SolanaWallet.tjava b/src/main/tjava/com/r35157/cryptowallet/solana/SolanaWallet.tjava index 0eb8f20..ad94282 100644 --- a/src/main/tjava/com/r35157/cryptowallet/solana/SolanaWallet.tjava +++ b/src/main/tjava/com/r35157/cryptowallet/solana/SolanaWallet.tjava @@ -2,10 +2,13 @@ package com.r35157.cryptowallet.solana; import com.r35157.libs.solana.SolanaSignedTransaction; import com.r35157.libs.solana.SolanaUnsignedTransaction; +import com.r35157.libs.solana.valuetypes.economic.SolanaSPLTokenProgram; import com.r35157.libs.valuetypes.basic.MoneyAmount; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.math.BigDecimal; /** * A Solana wallet capable of identifying itself and signing transactions. @@ -33,6 +36,22 @@ public interface SolanaWallet { ΩSolanaAmountΩ getSolanaBalance() throws IOException, InterruptedException; + /** + * Returns the balance of a specific SPL token owned by this wallet. + * + * @param mintAddress the SPL token mint address + * @param splProgram the SPL token program containing the token + * @return the token balance, or {@code null} if no token account exists + * @throws IOException if the balance cannot be fetched or decoded + * @throws InterruptedException if the calling thread is interrupted + * @throws IllegalStateException if multiple accounts exist for the mint + */ + @Nullable + ΩAmountΩ getSPLTokenBalance( + @NotNull ΩSPLMintAddressΩ mintAddress, + @NotNull SolanaSPLTokenProgram splProgram + ) throws IOException, InterruptedException; + /** * Signs an unsigned Solana transaction. * diff --git a/src/main/tjava/com/r35157/cryptowallet/solana/impl/ref/SolanaWalletImpl.tjava b/src/main/tjava/com/r35157/cryptowallet/solana/impl/ref/SolanaWalletImpl.tjava index 9cbde97..e27adb8 100644 --- a/src/main/tjava/com/r35157/cryptowallet/solana/impl/ref/SolanaWalletImpl.tjava +++ b/src/main/tjava/com/r35157/cryptowallet/solana/impl/ref/SolanaWalletImpl.tjava @@ -3,13 +3,18 @@ package com.r35157.cryptowallet.solana.impl.ref; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.r35157.cryptowallet.solana.SolanaWallet; +import com.r35157.libs.solana.SPLTokenHolding; import com.r35157.libs.solana.SolanaBlockChain; import com.r35157.libs.solana.SolanaSignedTransaction; import com.r35157.libs.solana.SolanaUnsignedTransaction; +import com.r35157.libs.solana.valuetypes.economic.SolanaSPLTokenProgram; import com.r35157.libs.valuetypes.basic.MoneyAmount; -import java.io.IOException; -import java.nio.charset.StandardCharsets; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; public class SolanaWalletImpl implements SolanaWallet { public SolanaWalletImpl( @@ -33,6 +38,20 @@ public class SolanaWalletImpl implements SolanaWallet { return solanaBlockChain.getBalanceInSolana(address); } + @Override + public @Nullable ΩAmountΩ getSPLTokenBalance( + @NotNull ΩSPLMintAddressΩ mintAddress, + @NotNull SolanaSPLTokenProgram splProgram + ) throws IOException, InterruptedException { + SPLTokenHolding tokenHolding = solanaBlockChain + .getSPLTokenHoldings(address, splProgram) + .get(mintAddress); + + return tokenHolding == null + ? null + : tokenHolding.uiAmount(); + } + @Override public @NotNull SolanaSignedTransaction signTransaction( @NotNull SolanaUnsignedTransaction transaction