我正在尝试编写一个脚本来通过糖果机 id 提取 NFT,但它要么失败,要么每次都返回一个空数组。
我正在使用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和Magic Eden 的 Hash List Tool。它们还返回空数组。NFT 在链上,它们在我的钱包里,所以我有点不知所措。