如何找到从 v2 糖果机铸造的所有 NFT
How to find all NFTs minted from a v2 candy machine
我正在制作 Solana NFT。糖果机 v2 最近发布,v1 已弃用。
如果我创建了一个 v2 糖果机并铸造了一些 NFT,我以后如何从铸造的所有代币中找到哈希值?
如果你有糖果机id,你可以用这个找到所有的薄荷糖:
import { Connection } from '@metaplex/js';
import { Metadata, MetadataProgram } from '@metaplex-foundation/mpl-token-metadata';
const connection = new Connection('mainnet-beta');
const MAX_NAME_LENGTH = 32;
const MAX_URI_LENGTH = 200;
const MAX_SYMBOL_LENGTH = 10;
const MAX_CREATOR_LEN = 32 + 1 + 1;
const candyMachineId: string = 'BdNtsrV26ZHdqDFxmDfLib6CrcUNj4ePorhppHreRgER';
export async function fetchHashTable(hash: string){
const metadataAccounts = await MetadataProgram.getProgramAccounts(
connection,
{
filters: [
{
memcmp: {
offset:
1 +
32 +
32 +
4 +
MAX_NAME_LENGTH +
4 +
MAX_URI_LENGTH +
4 +
MAX_SYMBOL_LENGTH +
2 +
1 +
4 +
0 * MAX_CREATOR_LEN,
bytes: hash,
},
},
],
},
)
const mintHashes: any = []
for (let index = 0; index < metadataAccounts.length; index++) {
const account = metadataAccounts[index];
const accountInfo: any = await connection.getParsedAccountInfo(account.pubkey);
const metadata = new Metadata(hash.toString(), accountInfo.value);
mintHashes.push(metadata.data.mint)
}
console.log(mintHashes)
}
fetchHashTable(candyMachineId)
您可以在 solana cookbook
上找到这个以及更多内容
编辑:以上内容适用于 Candy Machine V1。
对于 Candy Machine V2,您将执行以下操作:
import { Connection, clusterApiUrl, PublicKey } from '@solana/web3.js';
import bs58 from 'bs58';
const connection = new Connection(clusterApiUrl('mainnet-beta'));
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;
const MAX_METADATA_LEN = 1 + 32 + 32 + MAX_DATA_SIZE + 1 + 1 + 9 + 172;
const CREATOR_ARRAY_START = 1 + 32 + 32 + 4 + MAX_NAME_LENGTH + 4 + MAX_URI_LENGTH + 4 + MAX_SYMBOL_LENGTH + 2 + 1 + 4;
const TOKEN_METADATA_PROGRAM = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');
const CANDY_MACHINE_V2_PROGRAM = new PublicKey('cndy3Z4yapfJBmL3ShUp5exZKqR3z33thTzeNMm2gRZ');
const candyMachineId = new PublicKey('ENTER_YOUR_CANDY_MACHINE_ID_HERE');
const getMintAddresses = async (firstCreatorAddress: PublicKey) => {
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)
));
};
const getCandyMachineCreator = async (candyMachine: PublicKey): Promise<[PublicKey, number]> => (
PublicKey.findProgramAddress(
[Buffer.from('candy_machine'), candyMachine.toBuffer()],
CANDY_MACHINE_V2_PROGRAM,
)
);
(async () => {
const candyMachineCreator = await getCandyMachineCreator(candyMachineId);
getMintAddresses(candyMachineCreator[0]);
})();
确保将 ENTER_YOUR_CANDY_MACHINE_ID_HERE
替换为您的糖果机 ID
我正在制作 Solana NFT。糖果机 v2 最近发布,v1 已弃用。
如果我创建了一个 v2 糖果机并铸造了一些 NFT,我以后如何从铸造的所有代币中找到哈希值?
如果你有糖果机id,你可以用这个找到所有的薄荷糖:
import { Connection } from '@metaplex/js';
import { Metadata, MetadataProgram } from '@metaplex-foundation/mpl-token-metadata';
const connection = new Connection('mainnet-beta');
const MAX_NAME_LENGTH = 32;
const MAX_URI_LENGTH = 200;
const MAX_SYMBOL_LENGTH = 10;
const MAX_CREATOR_LEN = 32 + 1 + 1;
const candyMachineId: string = 'BdNtsrV26ZHdqDFxmDfLib6CrcUNj4ePorhppHreRgER';
export async function fetchHashTable(hash: string){
const metadataAccounts = await MetadataProgram.getProgramAccounts(
connection,
{
filters: [
{
memcmp: {
offset:
1 +
32 +
32 +
4 +
MAX_NAME_LENGTH +
4 +
MAX_URI_LENGTH +
4 +
MAX_SYMBOL_LENGTH +
2 +
1 +
4 +
0 * MAX_CREATOR_LEN,
bytes: hash,
},
},
],
},
)
const mintHashes: any = []
for (let index = 0; index < metadataAccounts.length; index++) {
const account = metadataAccounts[index];
const accountInfo: any = await connection.getParsedAccountInfo(account.pubkey);
const metadata = new Metadata(hash.toString(), accountInfo.value);
mintHashes.push(metadata.data.mint)
}
console.log(mintHashes)
}
fetchHashTable(candyMachineId)
您可以在 solana cookbook
上找到这个以及更多内容编辑:以上内容适用于 Candy Machine V1。
对于 Candy Machine V2,您将执行以下操作:
import { Connection, clusterApiUrl, PublicKey } from '@solana/web3.js';
import bs58 from 'bs58';
const connection = new Connection(clusterApiUrl('mainnet-beta'));
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;
const MAX_METADATA_LEN = 1 + 32 + 32 + MAX_DATA_SIZE + 1 + 1 + 9 + 172;
const CREATOR_ARRAY_START = 1 + 32 + 32 + 4 + MAX_NAME_LENGTH + 4 + MAX_URI_LENGTH + 4 + MAX_SYMBOL_LENGTH + 2 + 1 + 4;
const TOKEN_METADATA_PROGRAM = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');
const CANDY_MACHINE_V2_PROGRAM = new PublicKey('cndy3Z4yapfJBmL3ShUp5exZKqR3z33thTzeNMm2gRZ');
const candyMachineId = new PublicKey('ENTER_YOUR_CANDY_MACHINE_ID_HERE');
const getMintAddresses = async (firstCreatorAddress: PublicKey) => {
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)
));
};
const getCandyMachineCreator = async (candyMachine: PublicKey): Promise<[PublicKey, number]> => (
PublicKey.findProgramAddress(
[Buffer.from('candy_machine'), candyMachine.toBuffer()],
CANDY_MACHINE_V2_PROGRAM,
)
);
(async () => {
const candyMachineCreator = await getCandyMachineCreator(candyMachineId);
getMintAddresses(candyMachineCreator[0]);
})();
确保将 ENTER_YOUR_CANDY_MACHINE_ID_HERE
替换为您的糖果机 ID