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

使用新版Metaplex JS SDK搭建Solana拍卖屋遇错误求助

Solana AuctionHouse 功能搭建问题解决

错误1:挂售NFT时提示Account is already initialized

问题原因

该错误由TokenLendingError#AlreadyInitialized触发,通常是因为当前NFT对应的TradeState账户已存在(比如NFT已处于挂售状态,或之前的挂单未正确取消),或者重复执行创建挂单逻辑导致账户重复初始化。

解决方案

  1. 先检查NFT是否已挂售:创建挂单前先查询该NFT是否有活跃挂单,若有则先取消或更新,而非重复创建。
  2. 使用Metaplex封装的完整创建挂单方法:直接调用createListing()而非手动构建交易后发送,该方法会自动处理账户初始化的判断逻辑:
const listNft = async () => {
  try {
    const NFTs = await metaplex.nfts().findAllByOwner(publicKey).run();
    const targetNft = NFTs[4];
    console.log(targetNft.mintAddress.toString(), " nft");
    
    const auctionHouse = await metaplex
      .auctions()
      .findAuctionHouseByCreatorAndMint(publicKey, WRAPPED_SOL_MINT)
      .run();

    // 替换手动builder为封装方法,自动处理账户逻辑
    const { listing, response } = await metaplex
      .auctions()
      .for(auctionHouse)
      .createListing({
        mintAccount: targetNft.mintAddress,
        price: lamports(1 * LAMPORTS_PER_SOL),
      })
      .run();

    console.log(response.signature, "listed nft");
  } catch (error) {
    console.log(error);
  }
};
  1. 强制更新挂单:若需修改已存在的挂单价格,使用updateListing()方法而非重复创建。

错误2:获取挂单时提示Account Not Found

问题原因

findListingByAddress()方法需要传入ListingReceipt账户的地址,而非NFT的mint地址。你当前传入NFTs[4].mintAddress,导致无法找到对应的Listing账户。

解决方案

  1. 使用findListingByMint()查询挂单:通过NFT的mint地址直接查询对应的挂单:
const getListing = async () => {
  const NFTs = await metaplex.nfts().findAllByOwner(publicKey).run();
  const targetNft = NFTs[4];
  const retrievedAuctionHouse = await metaplex
    .auctions()
    .findAuctionHouseByCreatorAndMint(publicKey, WRAPPED_SOL_MINT)
    .run();

  console.log(retrievedAuctionHouse?.address?.toString(), "auction pubkey");
  
  // 替换为findListingByMint,传入mint地址查询
  const retrieveListing = await metaplex
    .auctions()
    .for(retrievedAuctionHouse)
    .findListingByMint(targetNft.mintAddress)
    .run();

  console.log(retrieveListing, "retrieving listings");
};
  1. 保存挂单返回的ListingReceipt地址:创建挂单时,将返回的listing.address存储下来,后续查询时直接使用该地址调用findListingByAddress()。

额外优化建议

  • 缓存AuctionHouse实例:无需每次调用方法都重新查询AuctionHouse,将实例缓存起来提升性能。
  • 细化错误处理:在catch块中区分不同错误类型,比如针对已初始化的错误,自动触发取消挂单后重新创建的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:39:47