Solana 检查钱包的所有 spl 代币余额

onu*_*tan 8 javascript node.js solana

我正在使用 solana json rpc api 从我的 javascript 应用程序检查钱包的代币余额。我已经像这样使用了该功能

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;
  }
};
Run Code Online (Sandbox Code Playgroud)

然而,我想通过一次调用获取所有代币余额,而不是通过为每个代币提供一个铸币地址来询问代币余额,这使得我的 api 响应时间约为 10 分钟,有没有任何友好的方法可以做到这一点?

我看到Covalent api可以用来检查以太坊钱包余额,想知道他们是如何做到的

yan*_*-io 8

大多数标准 RPC 接受批量请求,您应该能够发送您想要的所有请求的数组,请注意,响应也将是一个数组。

// 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",
            },
          ],
        },
    ]
});
Run Code Online (Sandbox Code Playgroud)