Reputation: 3898
I'm using solana json rpc api to check a wallet's token balance from my javascript app. I have used the function for it like this
const getTokenBalance = async (walletAddress, tokenMintAddress) => {
const response = await axios({
url: `https://api.mainnet-beta.solana.com`,
method: "post",
headers: { "Content-Type": "application/json" },
data: {
jsonrpc: "2.0",
id: 1,
method: "getTokenAccountsByOwner",
params: [
walletAddress,
{
mint: tokenMintAddress,
},
{
encoding: "jsonParsed",
},
],
},
});
if (
Array.isArray(response?.data?.result?.value) &&
response?.data?.result?.value?.length > 0 &&
response?.data?.result?.value[0]?.account?.data?.parsed?.info?.tokenAmount
?.amount > 0
) {
return (
Number(
response?.data?.result?.value[0]?.account?.data?.parsed?.info
?.tokenAmount?.amount
) / 1000000000
);
} else {
return 0;
}
};
However I want to get all the token balance by one call instead of asking a token balance by giving a mint address for every token out there which makes my api respond like 10 minutes, is there any friendly way to do that?
I saw Covalent api can do it for checking ethereum wallet balance, wonder how they can do it
Upvotes: 9
Views: 16900
Reputation: 65
There are actully 4 ways to fetch balance of tokens
All method details are mentioned in the below link.
Upvotes: 0
Reputation: 559
As all tokens (that follow the standard) are "childs" of the Token Program you can get all with one RPC call :
curl https://api.mainnet-beta.solana.com -X POST -H "Content-Type:
application/json" -d ' {
"jsonrpc":"2.0",
"method":"getTokenAccountsByOwner",
"params": [
"walletAddress",
{
"programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
},
{
"encoding": "jsonParsed"
}
],
"id":4
}
Upvotes: 3
Reputation: 370
If u need to get a balance of ur own token u can used the json rpc api with the follow post.
curl https://api.devnet.solana.com/ -X POST -H "Content-Type: application/json" -d '
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTokenAccountsByOwner",
"params": [
"uja3w9XG1g6DQSVT6YASK99FVmdVwXoHVoQEgtEJdLv",
{
"mint": "7TMzmUe9NknkeS3Nxcx6esocgyj8WdKyEMny9myDGDYJ"
},
{
"encoding": "jsonParsed"
}
]
}
'
Upvotes: -1
Reputation: 17334
Most of the standard RPC accept batch requests, you should be able to send an array of all the requests you want, note that response will be an array as well.
// For example
const response = await axios({
url: `https://api.mainnet-beta.solana.com`,
method: "post",
headers: { "Content-Type": "application/json" },
data: [
{
jsonrpc: "2.0",
id: 1,
method: "getTokenAccountsByOwner",
params: [
walletAddress,
{
mint: tokenMintAddress,
},
{
encoding: "jsonParsed",
},
],
},
{
jsonrpc: "2.0",
id: 1,
method: "getTokenAccountsByOwner",
params: [
walletAddress2,
{
mint: tokenMintAddress2,
},
{
encoding: "jsonParsed",
},
],
},
]
});
Upvotes: 11