如何修改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
相关产品推荐
相关产品推荐

