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

如何修改Solana Playground的TS脚本本地运行并适配主网及修复错误

解决Solana代币元数据更新脚本的三个关键问题

1. 修复await语法错误

这个错误是因为你在非async函数的顶层使用了await,两种简单解决方式:

方式一:封装到async主函数并调用

把所有逻辑放进一个async函数里,最后直接调用执行:

import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Metaplex, keypairIdentity } from "@metaplex-foundation/js";
import fs from "fs";

// 主逻辑函数
async function updateTokenMetadata() {
  // 所有异步代码放在这里执行
  const connection = new Connection("https://api.mainnet-beta.solana.com");
  // ...其他业务代码
}

// 调用主函数并捕获错误
updateTokenMetadata().catch(err => console.error(err));

方式二:启用ES模块模式

在项目的package.json中添加"type": "module",就能直接在顶层使用await:

{
  "type": "module"
}

之后脚本后缀可改为.mts,或保持.ts(需确保TypeScript配置支持ES模块)。

2. 加载本地密钥对

直接读取本地Solana密钥文件(默认路径为~/.config/solana/id.json),转换为可使用的Keypair:

// 读取本地密钥文件
const secretKey = JSON.parse(fs.readFileSync(process.env.HOME + "/.config/solana/id.json", "utf-8"));
const payer = Keypair.fromSecretKey(new Uint8Array(secretKey));

若密钥存放在其他路径,直接替换fs.readFileSync的路径参数即可。

3. 适配主网并更新元数据

使用Metaplex JS库完成代币元数据更新,步骤如下:

安装依赖

确保已安装必要的依赖包:

npm install @solana/web3.js @metaplex-foundation/js @solana/spl-token fs

完整示例脚本

import { Connection, Keypair, PublicKey } from "@solana/web3.js";
import { Metaplex, keypairIdentity, bundlrStorage } from "@metaplex-foundation/js";
import fs from "fs";
import path from "path";

async function updateTokenMetadata() {
  // 1. 连接Solana主网
  const connection = new Connection("https://api.mainnet-beta.solana.com", "confirmed");

  // 2. 加载本地支付密钥对
  const secretKeyPath = path.join(process.env.HOME || "", ".config/solana/id.json");
  const secretKey = JSON.parse(fs.readFileSync(secretKeyPath, "utf-8"));
  const payer = Keypair.fromSecretKey(new Uint8Array(secretKey));

  // 3. 初始化Metaplex实例
  const metaplex = Metaplex.make(connection)
    .use(keypairIdentity(payer))
    .use(bundlrStorage({
      address: "https://bundlr.network",
      providerUrl: "https://api.mainnet-beta.solana.com",
      timeout: 60000,
    }));

  // 4. 指定要更新的代币Mint地址
  const mintAddress = new PublicKey("YOUR_TOKEN_MINT_ADDRESS");

  // 5. 获取现有元数据(用于保留未修改的字段)
  const existingMetadata = await metaplex.nfts().findByMint({ mintAddress });

  // 6. 准备新的元数据内容
  const updatedMetadata = {
    name: "Updated Token Name", // 新代币名称
    symbol: "NEW_SYMBOL", // 新代币符号
    uri: "https://your-new-metadata-uri.json", // 新的元数据URI(可选更新)
    // 保留原有字段(如手续费、创作者信息)
    sellerFeeBasisPoints: existingMetadata.sellerFeeBasisPoints,
    creators: existingMetadata.creators,
  };

  // 7. 执行元数据更新
  const updateTx = await metaplex.nfts().update({
    nftOrSft: existingMetadata,
    ...updatedMetadata,
  });

  console.log("元数据更新完成,交易签名:", updateTx.response.signature);
}

// 执行主函数
updateTokenMetadata().catch(err => {
  console.error("更新失败:", err);
  process.exit(1);
});

注意事项

  • 主网交易需要支付SOL手续费,确保本地密钥对中有足够余额。
  • 若更新元数据URI,需先将新的元数据JSON文件上传至IPFS或其他可信存储服务。
  • 若仅修改名称、符号等字段,可省略uri参数,直接保留原有URI。

内容的提问来源于stack exchange,提问作者user23543214

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:47:40