You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:10:21