목차
- Minting 하기
- Basic Minting
- Minting With Guards
- Minting With Guard Groups
Minting 하기
지금까지, Candy Machine을 생성하고 관리하는 방법과 Guard에 대해 알아봤습니다. 이제 Minting 하는 방법에 대해 알아볼 차례입니다.
이 글은 Reference 문서를 해석해 정리한 것입니다.
Basic Minting
먼저 Mint Account를 만들기 위해 몇 가지 Instruction 들을 만들어야 합니다. 실제 Minting 할 때, SDK는 Candy Machine에 따라 어느 프로그램과 통신해야 할지 알고 있을 것입니다. 그래서 우리는 Candy Machine과 설정에 따른 속성 값들을 넘기기만 하면 됩니다.
만약 Candy Machine과 연결된 Candy Guard가 없다면, 설정한 Mint Authority가 서명자로 제공되어야 합니다. Minting에 성공하면 Candy Machine에 설정된 값에 따라 NFT가 발행됩니다. 예를들어, Confing Line Settings 모드에 Is Sequential 이 False이면 우리는 다음 Item을 랜덤하게 얻을 것입니다.
JS SDk를 통해 Minting을 하기 위해서는 Candy Machine 모듈의 mint
메서드를 사용합니다. 필수 인자는 candyMachine
과 collectionUpdateAuthority
의 주소입니다. 후자가 필요한 이유는 Candy Machine에 이 값이 존재하지 않지만, Mint Instrunction에 필요한 값이기 때문입니다.
const { nft } = await metaplex.candyMachines().mint({
candyMachine,
collectionUpdateAuthority,
});
기본적으로, 발행된 NFT의 payer
와 owner
는 현재 식별자로 설정될 것입니다. 이는 payer와 owner 속성을 통해 각각 바꿀 수 있습니다. 다만, payer 속성은 두 번째 인자인 OperationOptions
을 통해 제공되어야 하고 Transaction을 인증하기 위해 서명도 해야합니다.
import { Keypair } from "@solana/web3.js";
const customPayer = Keypair.generate();
const customOwner = Keypair.generate();
const { nft } = await metaplex.candyMachines().mint(
{
candyMachine,
collectionUpdateAuthority,
owner: customOwner.publicKey,
},
{
payer: customPayer,
}
);
만약 의도적으로 Candy Guard가 설정되지 않은 Candy Machine이라면 Mint Authority 값을 제공해야 합니다.
const { nft } = await metaplex.candyMachines().mint({
candyMachine,
collectionUpdateAuthority,
mintAuthority: candyMachineMintAuthority,
});
Minting With Guards
Guard 들을 사용하는 Candy Machine으로부터 Minting 할 때는 Guard를 위해 추가 정보들을 함께 제공해야 합니다. 수동으로 Mint Instruction을 만든다면, Instruction 인자와 나머지 Account들이 함께 제공돼야 합니다. 그러나 Metaplex SDK에는 각 Guard에 대한 Mint Settings이 정의되어 있고, 프로그램이 필요로 하는 것들이 자동으로 파싱 될 것입니다.
Mint Setting 값이 필요 없는 경우도 있는데, Mint Limit Guard와 같은 경우입니다. 이 Guard는 얼마나 많은 NFT들이 발행되었는지 추적할 수 있는 PDA Account의 주소를 요구합니다. 하지만 이 PDA 주소는 payer와 같은 이미 알고 있는 값에 의해 추론될 수 있기 때문에 Mint Settings 값이 필요 없습니다. 여기에서 Minting 할 때, 각 Guard가 Mint Settings을 필요로 하는지 확인할 수 있습니다.
아래에서는 추가 서명자를 요구하는 Third Party Signer Guard와 NFT를 얼마나 발행했는지 추적하는 Mint Limit Guard를 사용하는 예를 보여줍니다.
import { Keypair } from "@solana/web3.js";
const thirdPartySigner = Keypair.generate();
const { candyMachine } = await metaplex.candyMachines().create({
// ...
guards: {
thirdPartySigner: { signer: thirdPartySigner.publicKey },
mintLimit: { id: 1, limit: 3 },
},
});
const { nft } = await metaplex.candyMachines().mint({
candyMachine,
collectionUpdateAuthority,
guards: {
thirdPartySigner: { signer: thirdPartySigner },
},
});
위 코드에서 Mint Limit Guard는 PDA를 요구함에도 불구하고 넘기지 않는 것을 알 수 있는데, 이는 SDK 이 정보를 추론할 수 있기 때문입니다.
Minting With Guard Groups
Guard Group을 사용해 Minting 할 때 Label을 제공해서 어느 그룹으로부터 Minting 하길 원하는지를 명확히 해야 합니다. 추가로, Mint Settings 값은 선택된 Group의 "Resolved Guards"에 맞게 적용될 것입니다.
예를 들어 아래와 같은 Candy Machine이 있다고 생각해 봅시다.
- Default Guards
- Bot Tax
- Third Party Signer
- Start Date
- Group 1
- Label: "nft"
- Gaurds
- NFT Payment
- Start Date
- Group 2
- Label: "public"
- Guards
- Sol Payment
"nft" Label을 갖고 있는 Group 1의 Resolved Guards는 아래와 같습니다.
- Bot Tax: Default Guards.
- Third Party Signer: Default Guards.
- NFT Payment: Group 1.
- Start Date: Group 1. (Default Guards를 덮어쓴다)
Mint Settings 값은 이 Resolved Guards에 맞춰져야 합니다. 위의 예에서는 Third Party Signer Guard와 NFT Payment Guard 값이 제공돼야 합니다. Minting 할 때 원하는 그룹은 group
속성을 통해 Label 값이 제공되어야 하고, Mint Settings 값들이 setting
속성을 통해 제공되어야 합니다.
import { Keypair } from "@solana/web3.js";
const thirdPartySigner = Keypair.generate();
const { candyMachine } = await metaplex.candyMachines().create({
// ...
guards: {
botTax: { lamports: sol(0.001), lastInstruction: true },
thirdPartySigner: { signer: thirdPartySigner.publicKey },
startDate: { date: toDateTime("2022-10-18T17:00:00Z") },
},
groups: [
{
label: "nft",
guards: {
nftPayment: { requiredCollection, destination: nftTreasury },
startDate: { date: toDateTime("2022-10-18T16:00:00Z") },
},
},
{
label: "public",
guards: {
solPayment: { amount: sol(1), destination: solTreasury },
},
},
],
});
const { nft } = await metaplex.candyMachines().mint({
candyMachine,
collectionUpdateAuthority,
group: "nft",
guards: {
thirdPartySigner: { signer: thirdPartySigner },
nftPayment: { mint: nftFromRequiredCollection.address },
},
});
References
'Dev > Blockchain' 카테고리의 다른 글
[Solana] Metaplex Candy Machine 이용해 NFT Minting 하기 (0) | 2023.04.28 |
---|---|
[Metaplex Candy Machine] #4. Candy Guard 이해하기 (0) | 2023.04.14 |
[Metaplex Candy Machine] #3. Candy Machine에 Item 넣기 (0) | 2023.04.13 |
[Metaplex Candy Machine] #2. Candy Machine 관리하기 (0) | 2023.04.13 |
[Metaplex Candy Machine] #1. Candy Machine 설정 이해하기 (0) | 2023.04.12 |