使用@solana/web3.js为Solana NFT添加元数据避免钱包显示未知代币
解决方案
前置依赖
- 首先你需要额外安装Metaplex元数据协议的SDK包:
npm install @metaplex-foundation/mpl-token-metadata
核心实现步骤
你原来的创建Mint账户的代码无需修改,在成功创建Mint之后,按以下流程添加链上元数据即可:
- 导入所需方法
import { getMetadataPda, createCreateMetadataAccountV3Instruction } from "@metaplex-foundation/mpl-token-metadata"; import { PublicKey, Transaction } from "@solana/web3.js";
- 构造元数据参数
// 替换为你自己的代币信息 const tokenMetadata = { name: "你的NFT名称", symbol: "NFT符号", uri: "https://你的元数据json地址", // 这里存储NFT的图片、属性等链下元数据 sellerFeeBasisPoints: 0, // 版税比例,单位为万分之一,0即代表0%版税 creators: [ { address: fromWallet.publicKey, verified: true, share: 100, // 版税分成比例,所有创作者的share总和需要等于100 }, ], collection: null, // 若需要归属指定NFT集合可填写对应值,不需要则留空 uses: null, };
- 计算元数据PDA地址
// 元数据程序为固定ID,无需修改 const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); const metadataPda = await getMetadataPda(mint.publicKey, TOKEN_METADATA_PROGRAM_ID);
- 构造并发送元数据上链交易
const transaction = new Transaction().add( createCreateMetadataAccountV3Instruction( { metadata: metadataPda, mint: mint.publicKey, mintAuthority: fromWallet.publicKey, payer: fromWallet.publicKey, updateAuthority: fromWallet.publicKey, }, { createMetadataAccountArgsV3: { ...tokenMetadata, isMutable: true, // 配置后续是否允许修改元数据 collectionDetails: null, }, } ) ); // 发送交易并确认上链 const txSignature = await connection.sendTransaction(transaction, [fromWallet]); await connection.confirmTransaction(txSignature);
注意事项
uri字段对应的JSON需要符合SPL元数据规范,至少包含name、description、image三个字段,image字段填写你NFT的图片直链即可- 若你创建的是NFT,需要确保创建Mint时精度参数传0,且总发行量为1,和你现有代码的参数设置是匹配的
- 元数据上链完成后,钱包即可正常识别代币的名称、图标等信息,不会再显示为Unknown Token
内容的提问来源于stack exchange,提问作者Ood
相关产品推荐
相关产品推荐

