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

Solana check all spl token balances of a wallet

我正在使用 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;
  }
};

但是我想通过一个电话获得所有代币余额,而不是通过为那里的每个代币提供一个铸币厂地址来询问代币余额,这使得我的 api 响应大约 10 分钟,有没有友好的怎么做?

我看到Covalent api可以查看以太坊钱包余额,想知道他们是怎么做到的

大多数标准 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",
            },
          ],
        },
    ]
});

如果您需要获得自己代币的余额,您可以使用 json rpc api 并遵循 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"
      }
    ]
  }
'

由于所有令牌(遵循标准)都是令牌程序的“子代”,您可以通过一次 RPC 调用获得所有令牌:

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
  }