You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中读取Solana的Buffer数据?获取持有的代币列表返回空数组的解决方法

如何在TypeScript中正确读取Solana账户的代币数据?

你现在遇到的问题其实是找错了查询方法——getParsedAccountInfo获取的是原生Solana主账户的基础信息,而你要找的SPL代币数据并不存在这个主账户里,而是存储在和主账户关联的独立代币账户中。所以主账户的data为空是正常的,它本身只记录SOL余额和基础账户属性,不存储代币列表。

要获取你持有的所有代币,应该用Solana SDK专门提供的getTokenAccountsByOwner方法,用来查询某个账户名下的所有SPL代币账户。下面是修改后的完整代码:

import { Connection, Keypair, PublicKey, TokenAccountsFilter } from "@solana/web3.js";

// 连接到Solana测试网节点
const solanaConn = new Connection("https://api.testnet.solana.com", "confirmed");

const getTokenList = async () => {
  // 你的测试账户密钥
  const DEMO_FROM_SECRET_KEY = new Uint8Array([
    223, 119, 171, 5, 237, 138, 42, 140, 176, 163, 74, 107, 25, 143, 90, 97,
    250, 158, 203, 102, 238, 19, 77, 228, 211, 238, 147, 149, 40, 50, 211, 155,
    51, 207, 14, 53, 86, 230, 164, 27, 14, 202, 78, 181, 185, 250, 16, 52, 134,
    242, 96, 16, 12, 67, 2, 178, 106, 241, 156, 212, 11, 150, 114, 72
  ]);
  const keypair = Keypair.fromSecretKey(DEMO_FROM_SECRET_KEY);
  const ownerPublicKey = keypair.publicKey;

  console.log("=============获取持有的代币列表==============");

  // SPL代币标准程序ID,固定值
  const tokenProgramId = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
  // 过滤器:查询该所有者名下所有SPL代币账户
  const filter: TokenAccountsFilter = { programId: tokenProgramId };

  // 查询代币账户
  const tokenAccounts = await solanaConn.getTokenAccountsByOwner(ownerPublicKey, filter, "confirmed");

  // 解析每个代币账户的关键信息
  const tokenList = tokenAccounts.value.map(account => {
    const parsedData = account.account.data.parsed.info;
    return {
      mintAddress: parsedData.mint,
      tokenAccountAddress: account.pubkey.toString(),
      rawBalance: parsedData.tokenAmount.amount,
      decimals: parsedData.tokenAmount.decimals,
      formattedBalance: parsedData.tokenAmount.uiAmount
    };
  });

  console.log("你的代币列表:", tokenList);
};

getTokenList();

关键说明:

  • getTokenAccountsByOwner会返回所有关联到你主账户的SPL代币账户,每个代币对应一个独立的账户
  • 通过固定的SPL代币程序ID过滤,确保只查询合规的代币账户
  • 解析返回的parsed.info可以直接拿到代币的铸币地址、原始余额、小数位、格式化后的可读余额等核心信息

额外注意:

如果运行后还是返回空数组,大概率是你的测试账户在testnet上还没有任何代币账户。你可以先通过Solana测试网水龙头领取一些SOL,再尝试创建代币账户或接收测试代币,之后再运行代码就能看到数据了。

内容的提问来源于stack exchange,提问作者Jimitree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:22:36