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

Posted

技术标签:

【中文标题】Solana 检查钱包的所有 spl 代币余额【英文标题】:Solana check all spl token balances of a wallet 【发布时间】: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可以检查以太坊钱包余额,想知道他们是怎么做到的

【问题讨论】:

【参考方案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"
      
    ]
  
'

【讨论】:

以上是关于Solana 检查钱包的所有 spl 代币余额的主要内容,如果未能解决你的问题,请参考以下文章

通过向关联令牌元数据帐户发送资金来解决 Solana 钱包问题

将虚拟钱包私钥导入 solana CLI

如何通过 Phantom 钱包集成使用 Vanilla JS 和 JSON-RPC 获取 Solana 帐户信息和/或 SOL 余额?

前端Vue项目调用页面web3.js:连接metaMask钱包,(查询钱包ETH余额,查询代币余额,ETH转账,代币转账,代币授权,查询授权数量,计算价格)等功能

Solana - 如何获得外国账户的代币余额?

Web3 通过钱包地址获取所有代币