如何在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
相关产品推荐
相关产品推荐

