通过 CandyMachineId 获取 NFT 总是返回一个空数组

Get NFTs by CandyMachineId always returning an empty array

我正在尝试编写一个脚本来通过糖果机 ID 提取 NFT,但它要么失败,要么每次都return输入一个空数组。

我正在使用 genesysgo 主网 rpc。

这里是相关代码。

const rpc = process.env.REACT_APP_RPC_HOST!;
const connection = new Connection(rpc);

export const CANDY_MACHINE_V2_PROGRAM = new anchor.web3.PublicKey(
  "cndy3Z4yapfJBmL3ShUp5exZKqR3z33thTzeNMm2gRZ"
);

export const TOKEN_METADATA_PROGRAM = new anchor.web3.PublicKey(
  "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"
);

const MAX_NAME_LENGTH = 32;
const MAX_URI_LENGTH = 200;
const MAX_SYMBOL_LENGTH = 10;
const MAX_CREATOR_LEN = 32 + 1 + 1;
const MAX_CREATOR_LIMIT = 5;
const MAX_DATA_SIZE =
  4 +
  MAX_NAME_LENGTH +
  4 +
  MAX_SYMBOL_LENGTH +
  4 +
  MAX_URI_LENGTH +
  2 +
  1 +
  4 +
  MAX_CREATOR_LIMIT * MAX_CREATOR_LEN;

export const MAX_METADATA_LEN = 1 + 32 + 32 + MAX_DATA_SIZE + 1 + 1 + 9 + 172;
export const CREATOR_ARRAY_START =
  1 +
  32 +
  32 +
  4 +
  MAX_NAME_LENGTH +
  4 +
  MAX_URI_LENGTH +
  4 +
  MAX_SYMBOL_LENGTH +
  2 +
  1 +
  4;

async function getCandyMachineCreator(
  candyMachineId: PublicKey
): Promise<[PublicKey, number]> {
  return await PublicKey.findProgramAddress(
    [Buffer.from("candy_machine"), candyMachineId.toBuffer()],
    CANDY_MACHINE_V2_PROGRAM
  );
}

async function getMintsByCandyMachineId(candyMachineId: StringPublicKey) {
  const key = new PublicKey(candyMachineId);
  const [firstCreatorAddress] = await getCandyMachineCreator(key);
  const metadataAccounts = await connection.getProgramAccounts(
    TOKEN_METADATA_PROGRAM,
    {
      // The mint address is located at byte 33 and lasts for 32 bytes.
      dataSlice: { offset: 33, length: 32 },

      filters: [
        // Only get Metadata accounts.
        { dataSize: MAX_METADATA_LEN },

        // Filter using the first creator.
        {
          memcmp: {
            offset: CREATOR_ARRAY_START,
            bytes: firstCreatorAddress.toBase58(),
          },
        },
      ],
    }
  );

  return metadataAccounts.map((metadataAccountInfo) =>
    bs58.encode(metadataAccountInfo.account.data)
  );
}

我也试过使用 Solana NFT Tools and Magic Eden's Hash List Tool。他们还 return 空数组。 NFTs在链上,它们在我的钱包里,所以我有点不知所措。

您可能使用了错误的 CMID。在 solscan 上找到你的一个 NFT,并使用元数据中第一个经过验证的创建者 ID 作为你的 CMID。 (如下所示)。

这可以解释为什么 ID 在魔法伊甸园和五角星网站上也是 returns 一个空数组。

此地址与您的 .cache 文件中的 CMID 不同。