Metaplex 拍卖行错误 "Error processing Instruction 0: insufficient account keys for instruction"

Metaplex Auction House Error "Error processing Instruction 0: insufficient account keys for instruction"

我一直在尝试 运行 来自 mpl-auction-house 软件包的 execute_sale 修复程序,但我在日志中收到此错误 我已经让 sellInstruction 和 buyInstruction 正常工作

这是我的代码

  const executeSellInstructionAccounts:ExecuteSaleInstructionAccounts = {
    buyer:buyerwallet.publicKey,
    seller:Sellerwallet.publicKey,
    tokenAccount:tokenAccountKey,
    tokenMint:mint,
    metadata:await getMetadata(mint),
    treasuryMint:new anchor.web3.PublicKey(AuctionHouse.mint),
    auctionHouse:new anchor.web3.PublicKey(AuctionHouse.address),
    auctionHouseFeeAccount:new anchor.web3.PublicKey(AuctionHouse.feeAccount),
    authority:new anchor.web3.PublicKey(AuctionHouse.authority),
    programAsSigner:programAsSigner,
    auctionHouseTreasury:new anchor.web3.PublicKey(AuctionHouse.treasuryAccount),
    buyerReceiptTokenAccount:buyerATA.address,
    sellerPaymentReceiptAccount:Sellerwallet.publicKey,
    buyerTradeState:BuyertradeState,
    escrowPaymentAccount:escrowPaymentAccount,
    freeTradeState:freeTradeState,
    sellerTradeState:SellertradeState,
  }

  const executeSellInstructionArgs:ExecuteSaleInstructionArgs = {
      escrowPaymentBump:escrowBump,
      freeTradeStateBump:freeTradeBump,
      programAsSignerBump:programAsSignerBump,
      buyerPrice:buyPriceAdjusted,
      tokenSize:tokenSizeAdjusted,
  }


  const execute_sale_ix = createExecuteSaleInstruction(
    executeSellInstructionAccounts,executeSellInstructionArgs
  )

  const execute_sale_tx = new anchor.web3.Transaction(
    {
      recentBlockhash: blockhash,
      feePayer: Sellerwallet.publicKey,
    }
  )

  execute_sale_tx.add(execute_sale_ix);

  const execute_sale_res = await sprovider.sendAndConfirm(execute_sale_tx);

目前已发布的 AuctionHouse SDK 与底层 Rust 程序之间存在差异。

控制台参考实现在这里:https://github.com/metaplex-foundation/metaplex/blob/master/js/packages/cli/src/auction-house-cli.ts

控制台参考实现之所以有效,是因为它直接从链中加载 idl,因此是最新的。它完全绕过了 AuctionHouse SDK。

但是,如果您在浏览器中执行此操作,您可能不想从链中加载 IDL。你需要解压库之类的东西,这会大大增加你的包大小。

为了解决这个问题,我在这里分叉了 metaplex 存储库:https://github.com/neftworld/metaplex

上面的分叉有以下变化:

  1. 将 IDL 定义包括为打字稿 src 文件(截至 2022 年 5 月 30 日正确)
  2. 正在从本地 IDL 定义中获取 auctionHouse 程序,而不是从链中获取它

因此,您可以将其用作网络实施的基础。要在网络上进行此操作,您需要删除对密钥对的引用 - 控制台使用密钥对文件 - 并在发送前使用浏览器钱包签署交易。