Solana代币创建报错:mpl-token-metadata无PROGRAM_ID属性
问题:Solana代币创建时mpl-token-metadata的PROGRAM_ID不存在错误
我在Solana网络创建代币,安装@metaplex-foundation/mpl-token-metadata并导入代码后出现错误,参考的是2022年7月的新手教程。尝试安装metaplex js和metaplex umi后问题仍未解决。
错误信息
Property 'PROGRAM_ID' does not exist on type 'typeof import("d:/Documents/VSC_Files/Token/node_modules/@metaplex-foundation/mpl-token-metadata/dist/src/index")'.
原代码
import * as mpl from "@metaplex-foundation/mpl-token-metadata"; import * as web3 from "@solana/web3.js" import * as anchor from '@project-serum/anchor' export function loadWalletKey(keypairFile: string): web3.Keypair { const fs = require("fs"); const loaded = web3.Keypair.fromSecretKey( new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString())), ); return loaded; } async function main() { console.log("Let's name some tokens"); const myKeypair = loadWalletKey("AfkbuWt6YuU7xLzUz2M5rBRVpqBcCutyH9895v9YxU6w.json") console.log(myKeypair.publicKey.toBase58()) const mint = new web3.PublicKey("EcUBmCbntM3SniLH54B92TdqR3JexjbW57y8jXmmugxC.json") const seed1 = Buffer.from(anchor.utils.bytes.utf8.encode("metadata")); const seed2 = Buffer.from(mpl.PROGRAM_ID.toBytes()); const seed3 = Buffer.from(mint.toBytes()); const [metadataPDA, _bump] = web3.PublicKey.findProgramAddressSync([seed1, seed2, seed3], mpl.PROGRAM_ID); const accounts = { metadata: metadataPDA, mint, mintAuthority: myKeypair.publicKey, payer: myKeypair.publicKey, updateAuthority: myKeypair.publicKey, } const dataV2 = { name: "Echo Token", symbol: "ECHO", uri: "https://indigo-efficient-sparrow-269.mypinata.cloud/ipfs/QmbQBemXZBS7Uvhd2LdHauBoZimqmy8vDDKCohAnEx49k6?_gl=1*16nlwuc*_ga*MTI0NzMwNTIwMy4xNzA0MzE5OTIx*_ga_5RMPXG14TE*MTcwNDMxOTkyMi4xLjEuMTcwNDMyMDk0MS42MC4wLjA.", sellerFeeBasisPoints: 0, creators: null, collection: null, uses: null } const args = { createMetadataAccountArgsV2: { data: dataV2, isMutable: true } }; const ix = mpl.createCreateMetadataAccountV2Instruction(accounts, args); const tx = new web3.Transaction(); tx.add(ix); const connection = new web3.Connection("https://api.devnet.solana.com"); const txid = await web3.sendAndConfirmTransaction(connection, tx, [myKeypair]); console.log(txid); } main()
解决方案
问题出在新版本的mpl-token-metadata(v3及以上)API变更:原PROGRAM_ID已被替换为TOKEN_METADATA_PROGRAM_ID,同时指令创建函数的参数结构也有调整。
修改后的代码如下:
import * as web3 from "@solana/web3.js" import * as anchor from '@project-serum/anchor' // 调整导入方式,按需导入需要的常量和函数 import { TOKEN_METADATA_PROGRAM_ID, createCreateMetadataAccountV2Instruction } from "@metaplex-foundation/mpl-token-metadata"; export function loadWalletKey(keypairFile: string): web3.Keypair { const fs = require("fs"); const loaded = web3.Keypair.fromSecretKey( new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString())), ); return loaded; } async function main() { console.log("Let's name some tokens"); const myKeypair = loadWalletKey("AfkbuWt6YuU7xLzUz2M5rBRVpqBcCutyH9895v9YxU6w.json") console.log(myKeypair.publicKey.toBase58()) // 注意:mint地址不需要带.json后缀 const mint = new web3.PublicKey("EcUBmCbntM3SniLH54B92TdqR3JexjbW57y8jXmmugxC") const seed1 = Buffer.from(anchor.utils.bytes.utf8.encode("metadata")); const seed2 = Buffer.from(TOKEN_METADATA_PROGRAM_ID.toBytes()); const seed3 = Buffer.from(mint.toBytes()); const [metadataPDA, _bump] = web3.PublicKey.findProgramAddressSync([seed1, seed2, seed3], TOKEN_METADATA_PROGRAM_ID); const accounts = { metadata: metadataPDA, mint, mintAuthority: myKeypair.publicKey, payer: myKeypair.publicKey, updateAuthority: myKeypair.publicKey, systemProgram: web3.SystemProgram.programId, rent: web3.SYSVAR_RENT_PUBKEY, } const dataV2 = { name: "Echo Token", symbol: "ECHO", uri: "https://indigo-efficient-sparrow-269.mypinata.cloud/ipfs/QmbQBemXZBS7Uvhd2LdHauBoZimqmy8vDDKCohAnEx49k6", sellerFeeBasisPoints: 0, creators: null, collection: null, uses: null } const ix = createCreateMetadataAccountV2Instruction( accounts, { createMetadataAccountArgsV2: { data: dataV2, isMutable: true } } ); const tx = new web3.Transaction(); tx.add(ix); const connection = new web3.Connection("https://api.devnet.solana.com"); const txid = await web3.sendAndConfirmTransaction(connection, tx, [myKeypair]); console.log(txid); } main()
额外说明:
- 移除了mint地址后的
.json后缀,因为PublicKey只需要纯地址字符串 - 新增了
systemProgram和rent账户参数,新版本指令要求必须传入 - 优化了URI参数,去掉了不必要的跟踪参数
内容的提问来源于stack exchange,提问作者Timbo
相关产品推荐
相关产品推荐

