에어드롭 - 다른 지갑으로 NFT를 민팅하는 방법

이 가이드는 Candy Machine에서 다른 지갑 주소로 NFT를 민팅하는 방법을 설명합니다 - 에어드롭, 경품 또는 여러 수신자에게 NFT를 배포하는 일반적인 요구사항입니다.

사전 준비사항

  • Solana와 NFT에 대한 기본적인 이해
  • 거래 수수료를 위한 자금이 있는 지갑

둘 중 하나

  • Sugar CLI (v2.0.0 이상)

또는

  • Node.js 16.0 이상
  • @metaplex-foundation/mpl-token-metadata
  • @metaplex-foundation/mpl-toolbox
  • @metaplex-foundation/umi-bundle-defaults
  • @metaplex-foundation/mpl-candy-machine

다른 지갑으로 NFT를 민팅하는 것은 에어드롭, 경품 또는 여러 수신자에게 NFT를 배포하는 데 특히 유용할 수 있습니다. 이 가이드는 Candy Machine에서 다른 지갑 주소로 NFT를 민팅하는 과정을 안내합니다. 민팅 프로세스를 시작하는 사람이 민팅 비용을 부담한다는 점에 유의해야 합니다. 따라서 수신자가 직접 NFT를 클레임하도록 하는 것이 종종 더 비용 효율적입니다.

중요한 고려사항

  • 다른 지갑으로 민팅하는 것은 비용이 많이 들 수 있습니다. allowlist 또는 NFT Gate 가드를 사용하는 것과 같은 클레임 메커니즘을 사용하는 것을 고려할 수 있습니다.
  • 가드가 있는 Candy Machine과 가드가 없는 Candy Machine에는 다른 도구를 사용할 수 있습니다. 가드 없이 민팅하는 것이 일반적으로 더 쉽습니다.

이 가이드에는 두 가지 접근 방식이 설명되어 있습니다:

  1. Sugar CLI를 사용한 민팅. 코딩이 필요 없습니다!
  2. Javascript를 사용한 민팅

Sugar CLI 사용

Sugar CLI는 다른 지갑으로 NFT를 민팅하기 위한 두 가지 주요 명령을 제공합니다:

  1. sugar mint - 하나의 특정 지갑으로 민팅
  2. sugar airdrop - 여러 지갑으로 민팅

sugar를 통한 민팅을 허용하기 위한 전제 조건은 가드가 연결되지 않은 Candy Machine을 생성하는 것입니다. sugar로 Candy Machine을 생성하려면 이 가이드의 첫 번째 단계를 따를 수 있습니다. Candy Machine에 가드가 연결되어 있는 경우 sugar guard remove를 사용하여 제거할 수 있습니다.

sugar mint로 단일 수신자 민팅

단일 수신자 지갑으로 NFT를 민팅하려면 다음 매개변수와 함께 sugar mint 명령을 사용하세요:

  • --receiver <WALLET>: 수신자의 지갑 주소를 지정
  • --number <NUMBER>: (선택 사항) 해당 지갑으로 민팅할 NFT 수를 지정

예제:

지갑 Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV로 3개의 NFT를 민팅하려면 다음과 같이 호출합니다:

sugar mint --receiver Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV -n 3 --candy-machine 11111111111111111111111111111111

sugar airdrop으로 여러 수신자에게 민팅

단일 명령으로 여러 지갑에 NFT를 민팅하려면 sugar airdrop을 사용할 수 있습니다. 이는 주소와 각 지갑이 받을 NFT 수를 포함하는 파일이 필요합니다. 이러한 파일은 예를 들어 특정 컬렉션의 NFT 소유자를 스냅샷하고 그들의 지갑과 보유한 NFT를 다음 형식의 파일에 추가하여 생성할 수 있습니다:

{
"11111111111111111111111111111111": 3,
"22222222222222222222222222222222": 1
}

기본적으로 sugar는 이 파일이 airdrop_list.json이라고 불리기를 기대하지만, 다른 파일 이름을 사용하려면 --airdrop-list를 사용하여 파일 이름을 전달할 수 있습니다.

예제: 이 에어드롭을 실행하려면 다음 명령을 사용할 수 있습니다

sugar airdrop --candy-machine 11111111111111111111111111111111

Typescript와 @metaplex-foundation/mpl-candy-machine 사용

이 섹션에서는 Javascript에서 민트 함수에 대한 코드 스니펫을 보여줍니다. 두 예제 모두 Candy Machine이 생성되고 이후 단일 NFT가 특정 지갑으로 민팅되는 전체 코드 스니펫을 포함합니다. 완전한 에어드롭 스크립트를 구현하려면 민트 함수 주위에 루프와 오류 처리를 구현해야 합니다.

Typescript를 사용하여 다른 지갑으로 민팅할 때 Candy Machine이 가드를 사용하는지 여부에 따라 두 가지 주요 접근 방식이 있습니다:

가드 없이 민팅

가드가 없는 Candy Machine의 경우 mintFromCandyMachineV2를 사용하세요. 이 함수를 사용하면 수신자를 nftOwner로 직접 지정할 수 있습니다.

const candyMachineAccount = await fetchCandyMachine(umi, publicKey("CM Address"));
const recipient = publicKey('Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV')
const nftMint = generateSigner(umi)
const mintTx = await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(createMintWithAssociatedToken(umi, { mint: nftMint, owner: recipient }))
.add(
mintFromCandyMachineV2(umi, {
candyMachine: candyMachine.publicKey,
mintAuthority: umi.identity,
nftOwner: recipient,
nftMint,
collectionMint: candyMachineAccount.collectionMint,
collectionUpdateAuthority: candyMachineAccount.authority,
})
)
.sendAndConfirm(umi, {
confirm: { commitment: 'finalized' },
})

가드와 함께 민팅

가드가 있는 Candy Machine의 경우 mintV2를 사용할 수 있습니다. 이 경우 먼저 createMintWithAssociatedToken을 사용하여 수신자를 위한 토큰 계정과 연결 토큰 계정을 생성해야 합니다. 이를 통해 수신자는 트랜잭션에 서명할 필요 없이 NFT를 받을 수 있습니다.

const candyMachineAccount = await fetchCandyMachine(umi, publicKey("CM Address"));
const recipient = publicKey('Tes1zkZkXhgTaMFqVgbgvMsVkRJpq4Y6g54SbDBeKVV')
const nftMint = generateSigner(umi)
const mintTx = await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(createMintWithAssociatedToken(umi, { mint: nftMint, owner: recipient }))
.add(
mintV2(umi, {
candyMachine: candyMachineAccount.publicKey,
nftMint,
token: findAssociatedTokenPda(umi, {
mint: nftMint.publicKey,
owner: recipient,
}),
collectionMint: candyMachineAccount.collectionMint,
collectionUpdateAuthority: candyMachineAccount.authority,
tokenStandard: TokenStandard.NonFungible,
mintArgs: {
mintLimit: some({ // mintArgs가 필요한 가드는 여기에 지정해야 합니다
id: 1,
}),
},
})
)
.sendAndConfirm(umi, {
confirm: { commitment: 'finalized' },
})