如何为使用createInitializeTransferFeeConfigInstruction创建的Solana Token 2022添加元数据
为Solana Token Program 2022代币添加元数据
要给带TransferFeeConfig扩展的Token 2022代币添加名称、符号等元数据,需要使用SPL Token Metadata Program(Solana官方代币元数据标准)。以下是具体实现步骤和修改后的代码:
步骤说明
- 安装依赖:确保项目已安装
@solana/spl-token-metadata包,用于处理元数据相关指令。 - 推导元数据账户地址:通过代币mint地址生成对应的元数据PDA(程序派生地址)。
- 计算元数据账户租金:获取元数据账户所需的最低免租金余额。
- 添加元数据账户创建指令:通过系统程序创建归属到Token Metadata Program的元数据账户。
- 添加元数据初始化指令:写入代币的名称、符号、URI等核心元数据信息。
修改后的完整代码
import { Connection, Transaction, sendAndConfirmTransaction, SystemProgram } from '@solana/web3.js'; import { ExtensionType, TOKEN_2022_PROGRAM_ID, getMintLen, createInitializeTransferFeeConfigInstruction, createInitializeMintInstruction } from '@solana/spl-token'; // 导入元数据相关工具 import { createCreateMetadataAccountV3Instruction, findMetadataPda, TOKEN_METADATA_PROGRAM_ID, getMetadataAccountSize } from '@solana/spl-token-metadata'; // 假设以下变量已提前定义:payer, mint, mintKeypair, transferFeeConfigAuthority, withdrawWithheldAuthority, feeBasisPoints, maxFee, decimals, mintAuthority, connection // 1. 定义代币扩展并计算mint账户空间 const extensions = [ExtensionType.TransferFeeConfig]; const mintLen = getMintLen(extensions); const mintLamports = await connection.getMinimumBalanceForRentExemption(mintLen); // 2. 推导元数据账户地址并计算租金 const metadataAccount = findMetadataPda(mint); const metadataAccountSize = getMetadataAccountSize(); const metadataLamports = await connection.getMinimumBalanceForRentExemption(metadataAccountSize); // 3. 构建完整交易 const mintTransaction = new Transaction().add( // 创建mint账户 SystemProgram.createAccount({ fromPubkey: payer.publicKey, newAccountPubkey: mint, space: mintLen, lamports: mintLamports, programId: TOKEN_2022_PROGRAM_ID, }), // 初始化TransferFeeConfig扩展 createInitializeTransferFeeConfigInstruction( mint, transferFeeConfigAuthority.publicKey, withdrawWithheldAuthority.publicKey, feeBasisPoints, maxFee, TOKEN_2022_PROGRAM_ID ), // 初始化mint核心参数 createInitializeMintInstruction(mint, decimals, mintAuthority.publicKey, null, TOKEN_2022_PROGRAM_ID), // 创建元数据账户 SystemProgram.createAccount({ fromPubkey: payer.publicKey, newAccountPubkey: metadataAccount, space: metadataAccountSize, lamports: metadataLamports, programId: TOKEN_METADATA_PROGRAM_ID, }), // 写入代币元数据 createCreateMetadataAccountV3Instruction( { metadata: metadataAccount, mint: mint, mintAuthority: mintAuthority.publicKey, payer: payer.publicKey, updateAuthority: mintAuthority.publicKey, // 通常设为mint权限持有者,支持后续修改元数据 }, { createMetadataAccountArgsV3: { data: { name: "My Transfer Fee Token", // 代币全称,最长32字符 symbol: "MTFT", // 代币缩写,最长10字符 uri: "https://your-metadata-host.com/token-meta.json", // 指向含详细元数据的JSON文件 sellerFeeBasisPoints: 50, // 二次销售版税(千分比,50代表5%) creators: null, // 可选:创作者数组,格式如[{address: pubkey, verified: true, share: 100}] collection: null, // 可选:所属集合信息 uses: null, // 可选:代币用途限制 }, isMutable: true, // 是否允许后续修改元数据 collectionDetails: null, // 可选:集合详情 } } ) ); // 发送并确认交易 const newTokenTx = await sendAndConfirmTransaction(connection, mintTransaction, [payer, mintKeypair], undefined); console.log("New Token Created:", generateExplorerTxUrl(newTokenTx));
关键细节解释
- 元数据PDA:
findMetadataPda(mint)是Solana元数据标准的固定规则,通过mint地址生成唯一绑定的元数据账户地址。 - 元数据字段:
createMetadataAccountArgsV3中的data字段定义代币核心信息:uri指向的JSON文件可包含代币logo、详细描述、社交链接等扩展信息sellerFeeBasisPoints设置二次销售的版税比例,收益会自动分配给创作者
- 可变性控制:
isMutable设为true后,可通过createUpdateMetadataAccountV2Instruction后续修改元数据内容。
内容的提问来源于stack exchange,提问作者user130198
相关产品推荐
相关产品推荐

