如何使用Solana Web3.js获取链上代币的名称、符号及其他元数据
SPL代币元数据获取方案
SPL代币的名称、符号等元数据并不存储在代币Mint账户本身,而是存储在Metaplex协议的元数据PDA账户中,原生Solana Web3.js没有直接读取该数据的接口,需要配合Metaplex相关工具实现,具体方案如下:
1. 安装依赖
推荐使用Metaplex官方JS SDK实现快速读取,执行以下命令安装依赖:
npm install @metaplex-foundation/js @metaplex-foundation/mpl-token-metadata
2. 完整实现代码
基于你现有代码的修改示例:
import { Metaplex } from "@metaplex-foundation/js"; // 如果你使用CommonJS规范,替换为以下导入 // const { Metaplex } = require("@metaplex-foundation/js"); let from_pairs = new anchor.web3.PublicKey("DUru78GcRB8Ucg24Gy6WNTyufuyBhqcL5wppZJkckQHz") const NETWORK = anchor.web3.clusterApiUrl('devnet'); const Connection = new anchor.web3.Connection(NETWORK); const data = await Connection.getTokenSupply(from_pairs) // 初始化Metaplex实例 const metaplex = Metaplex.make(Connection); try { // 通过Mint地址获取元数据 const metadata = await metaplex.nfts().findByMint({ mintAddress: from_pairs }); console.log("代币名称:", metadata.name); console.log("代币符号:", metadata.symbol); console.log("代币资源URI(含图标、描述等):", metadata.uri); console.log("代币精度:", data.value.decimals); console.log("总供应量:", data.value.uiAmount); } catch (e) { console.log("该代币未上传链上元数据:", e.message) }
轻量实现方案(无需引入全量SDK)
如果你不想引入完整的Metaplex SDK,可以手动计算元数据PDA地址,直接读取账户数据后反序列化:
import { getMetadataAccountDataSerializer } from "@metaplex-foundation/mpl-token-metadata"; // Metaplex元数据程序固定ID const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); // 计算元数据PDA地址 const [metadataPda] = anchor.web3.PublicKey.findProgramAddressSync( [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), from_pairs.toBuffer()], TOKEN_METADATA_PROGRAM_ID ); const metadataAccount = await Connection.getAccountInfo(metadataPda); if (metadataAccount) { const serializer = getMetadataAccountDataSerializer(); const metadata = serializer.deserialize(metadataAccount.data)[0]; console.log("代币名称:", metadata.name.trim()); console.log("代币符号:", metadata.symbol.trim()); }
内容的提问来源于stack exchange,提问作者mohan A
相关产品推荐
相关产品推荐

