如何使用Solana web3.js查询指定公钥地址持有的代币资产
Solana地址代币资产查询解决方案
为什么当前代码无法获取代币数据
你调用的connection.getAccountInfoAndContext(publicKey)仅会查询目标公钥对应的原生SOL账户信息,Solana上所有SPL代币都存储在与用户主地址关联的*代币关联账户(ATA)*中,不会直接存放在主地址账户下,因此返回的data字段为空属于正常情况。
两种实现方案
方案1:通过web3.js直接从链上查询(无需依赖Phantom接口)
你可以使用getParsedTokenAccountsByOwner方法直接拉取该地址下所有SPL代币账户的解析后数据,代码示例如下:
// 需提前安装 @solana/spl-token 依赖 import { getParsedTokenAccountsByOwner, TOKEN_PROGRAM_ID } from "@solana/spl-token"; // 传入已实例化的connection对象、目标公钥 const tokenAccounts = await connection.getParsedTokenAccountsByOwner( publicKey, { programId: TOKEN_PROGRAM_ID } ); // 遍历解析代币数据 const tokenAssets = tokenAccounts.value.map(account => { const accountInfo = account.account.data.parsed.info; return { mintAddress: accountInfo.mint, // 代币合约地址 amount: accountInfo.tokenAmount.amount, // 原始数量(未精度换算) decimals: accountInfo.tokenAmount.decimals, // 代币精度 uiAmount: accountInfo.tokenAmount.uiAmount // 换算后可读数量 } });
方案2:通过Phantom钱包接口直接获取
Phantom提供了专用的钱包资产查询接口,无需自行处理链上数据解析,调用代码如下:
// 从已连接的Phantom provider调用资产查询接口 const assets = await window.solana.request({ method: "wallet_getAssets" }); // 返回结果中会直接包含所有SPL代币、NFT资产的结构化数据 const splTokens = assets.result.assets.filter(item => item.type === "spl_token");
内容的提问来源于stack exchange,提问作者neiloth
相关产品推荐
相关产品推荐

