【问题标题】:Solana check all spl token balances of a walletSolana 检查钱包的所有 spl 代币余额
【发布时间】:2021-12-10 11:21:30
【问题描述】:

我正在使用 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可以检查以太坊钱包余额,想知道他们是怎么做到的

【问题讨论】:

    标签: javascript node.js solana


    【解决方案1】:

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

    【讨论】:

    • 我会试试这个,如果它有效,我会回复你!
    • 答案是正确的,只要我们传入数据数组的对象超过256个,就会抛出太大的请求错误,代码413,=。所以我只是通过迭代令牌数组来调用每个令牌,并在每次调用中使用 256 个对象调用 api。谢谢!
    【解决方案2】:

    由于所有令牌(遵循标准)都是令牌程序的“孩子”,因此您可以通过一次 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
      } 
    

    【讨论】:

      【解决方案3】:

      如果您需要获得自己代币的余额,您可以使用带有后续帖子的 json rpc api。

          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"
            }
          ]
        }
      '
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-23
        • 2022-08-08
        • 2021-12-29
        • 2018-11-17
        • 1970-01-01
        • 2022-01-13
        • 2021-12-06
        • 2020-10-02
        相关资源
        最近更新 更多