機能

ミント

これまでキャンディマシンの作成と保守について学習しました。設定方法と、ガードおよびガードグループを使用した複雑なミントワークフローの設定方法を見てきました。最後のパズルのピースについて話すときが来ました:ミント!

基本的なミント

キャンディガードページで述べたように、キャンディマシンからNFTをミントする責任を持つ2つのプログラムがあります:NFTのミントを担当するキャンディマシンコアプログラムと、その上に設定可能なアクセス制御レイヤーを追加し、カスタムガードを提供するためにフォークできるキャンディガードプログラムです。

そのため、キャンディマシンからミントする方法は2つあります:

  • キャンディガードプログラムから、その後キャンディマシンコアプログラムにミントを委譲します。ほとんどの場合、より複雑なミントワークフローが可能になるため、これを行いたいでしょう。アカウントで設定されたガードに基づいて、ミント命令に追加の残りアカウントと命令データを渡す必要がある場合があります。幸い、SDKはいくつかの追加パラメーターを要求し、残りを計算することでこれを簡単にします。

  • キャンディマシンコアプログラムから直接。この場合、設定されたミント権限のみがミントでき、したがってトランザクションに署名する必要があります。

すべてがうまくいけば、キャンディマシンで設定されたパラメーターに従ってNFTが作成されます。例えば、指定されたキャンディマシンがシーケンシャルfalseに設定したコンフィグライン設定を使用している場合、次のアイテムをランダムに取得します。

キャンディガードプログラムのバージョン1.0以降、ミント命令は既存のpayer署名者とは異なる可能性がある追加のminter署名者を受け入れます。これにより、NFTをミントするウォレットがSOL手数料(ストレージ手数料やSOLミント支払いなど)を支払う必要がなくなるミントワークフローを作成できます。payer署名者がそれらの手数料を抽象化するからです。minter署名者は依然としてトークンベースの手数料を支払う必要があり、設定されたガードの検証に使用されることに注意してください。

最新のミント命令は、大量の計算ユニットを使用する最新のトークンメタデータ命令に依存することに注意してください。そのため、成功を確実にするためにトランザクションの計算ユニット制限を増やす必要がある場合があります。SDKもこれを支援する場合があります。

キャンディマシンからのミント

設定されたキャンディガードアカウント経由でキャンディマシンからミントするには、mintV2関数を使用し、ミントされたNFTが属するコレクションNFTのミントアドレスと更新権限を提供できます。minter署名者とpayer署名者も提供できますが、それらはそれぞれUmiのアイデンティティとペイヤーにデフォルト設定されます。

上述のとおり、mintV2命令が成功することを確実にするためにトランザクションの計算ユニット制限を増やす必要がある場合があります。以下のコードスニペットで示すように、mpl-toolbox UmiライブラリのsetComputeUnitLimitヘルパー関数を使用してこれを行えます。

pNFT(例えばロイヤリティ強制のため)をミントしたく、キャンディマシンをそれに応じて設定している場合は、tokenStandardフィールドを追加する必要があります。デフォルトではNonFungibleが使用されます。事前にキャンディマシンを取得した場合はcandyMachine.tokenStandardを使用できます。そうでなければ@metaplex-foundation/mpl-token-metadataからtokenStandard: TokenStandard.ProgrammableNonFungibleを使用して自分で割り当てる必要があります。

import { mintV2 } from '@metaplex-foundation/mpl-candy-machine'
import { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox'
import { transactionBuilder, generateSigner } from '@metaplex-foundation/umi'
const nftMint = generateSigner(umi)
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
tokenStandard: candyMachine.tokenStandard,
})
)
.sendAndConfirm(umi)

mintV2命令はデフォルトでミントおよびトークンアカウントを作成し、NFT所有者をminterに設定することに注意してください。事前にこれらを自分で作成したい場合は、署名者ではなく公開鍵としてNFTミントアドレスを単純に指定できます。mpl-toolbox UmiライブラリのcreateMintWithAssociatedToken関数を使用した例を次に示します:

import { mintV2 } from '@metaplex-foundation/mpl-candy-machine'
import {
createMintWithAssociatedToken,
setComputeUnitLimit,
} from '@metaplex-foundation/mpl-toolbox'
import { transactionBuilder, generateSigner } from '@metaplex-foundation/umi'
const nftMint = generateSigner(umi)
const nftOwner = generateSigner(umi).publicKey
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(createMintWithAssociatedToken(umi, { mint: nftMint, owner: nftOwner }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint: nftMint.publicKey,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
})
)
.sendAndConfirm(umi)

キャンディマシンコアプログラムから直接ミントすることを希望するまれなケースでは、代わりにmintFromCandyMachineV2関数を使用できます。この関数はキャンディマシンのミント権限を署名者として提供する必要があり、明示的なnftOwner属性を受け入れます。

import { mintFromCandyMachineV2 } from '@metaplex-foundation/mpl-candy-machine'
import { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox'
import { transactionBuilder, generateSigner } from '@metaplex-foundation/umi'
const nftMint = generateSigner(umi)
const nftOwner = generateSigner(umi).publicKey
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintFromCandyMachineV2(umi, {
candyMachine: candyMachine.publicKey,
mintAuthority: umi.identity,
nftOwner,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
})
)
.sendAndConfirm(umi)

APIリファレンス: mintV2, mintFromCandyMachineV2

ガード付きミント

多数のガードを使用するキャンディマシンからミントする際、追加のガード固有の情報を提供する必要がある場合があります。

ミント命令を手動で構築する場合、その情報は命令データと残りアカウントの組み合わせとして提供されます。しかし、SDKを使用する場合、ミント時に追加情報が必要な各ガードは、ミント設定と呼ばれる設定セットを定義します。これらのミント設定は、プログラムが必要とするものに解析されます。

ミント設定が必要なガードの良い例は、ミントの支払いに使用すべきNFTのミントアドレスなどを必要とするNFT支払いガードです。

利用可能な各ガードには独自のドキュメントページがあり、そのガードがミント時にミント設定の提供を期待するかどうかがわかります。

ミント設定を必要としないガードのみを使用する場合は、上記の「基本的なミント」セクションで説明したのと同じ方法でミントできます。それ以外の場合は、それらを必要とするすべてのガードのミント設定を含む追加のオブジェクト属性を提供する必要があります。SDKを使用した実際の例を見てみましょう。

ガード付きキャンディマシンからのミント

Umiライブラリ経由でミントする際、mintArgs属性を使用して必要なミント設定を提供できます。

追加の署名者が必要なサードパーティ署名者ガードと、ウォレットがキャンディマシンからミントした回数を追跡するミント制限ガードを使用した例です。

import {
some,
generateSigner,
transactionBuilder,
} from '@metaplex-foundation/umi'
import { create, mintV2 } from '@metaplex-foundation/mpl-candy-machine'
import { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox'
// ガード付きキャンディマシンを作成します。
const thirdPartySigner = generateSigner()
await create(umi, {
// ...
guards: {
thirdPartySigner: some({ signer: thirdPartySigner.publicKey }),
mintLimit: some({ id: 1, limit: 3 }),
},
}).sendAndConfirm(umi)
// キャンディマシンからミントします。
const nftMint = generateSigner(umi)
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
mintArgs: {
thirdPartySigner: some({ signer: thirdPartySigner }),
mintLimit: some({ id: 1 }),
},
})
)
.sendAndConfirm(umi)

APIリファレンス: mintV2, DefaultGuardSetMintArgs

ガードグループ付きミント

ガードグループを使用するキャンディマシンからミントする際、ラベルを提供することでミントしたいグループを明示的に選択する必要があります

さらに、前のセクションで説明したようにミント設定も必要な場合があります。しかし、ミント設定は選択されたグループの「解決されたガード」に適用されます

例えば、以下のガードを持つキャンディマシンを想像してください:

  • デフォルトガード:
    • ボット税
    • サードパーティ署名者
    • 開始日
  • グループ1
    • ラベル: "nft"
    • ガード:
      • NFT支払い
      • 開始日
  • グループ2
    • ラベル: "public"
    • ガード:
      • SOL支払い

「nft」とラベル付けされたグループ1の解決されたガードは:

  • ボット税: デフォルトガードから。
  • サードパーティ署名者: デフォルトガードから。
  • NFT支払い: グループ1から。
  • 開始日: デフォルトガードを上書きするためグループ1から。

したがって、提供されるミント設定はこれらの解決されたガードに関連する必要があります。上記の例では、サードパーティ署名者ガードとNFT支払いガードのミント設定を提供する必要があります。

ガードグループ付きキャンディマシンからのミント

ガードグループを使用するキャンディマシンからミントする際、選択したいグループのラベルをgroup属性経由で提供する必要があります。

さらに、そのグループの解決されたガードのミント設定をmintArgs属性経由で提供できます。

上記で説明した例のキャンディマシンからミントするためにUmiライブラリを使用する方法は次のとおりです。

// ガード付きキャンディマシンを作成します。
const thirdPartySigner = generateSigner()
await create(umi, {
// ...
guards: {
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
thirdPartySigner: some({ signer: thirdPartySigner.publicKey }),
startDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
},
groups: [
{
label: 'nft',
guards: {
nftPayment: some({ requiredCollection, destination: nftTreasury }),
startDate: some({ date: dateTime('2022-10-18T16:00:00Z') }),
},
},
{
label: 'public',
guards: {
solPayment: some({ lamports: sol(1), destination: solTreasury }),
},
},
],
}).sendAndConfirm(umi)
// キャンディマシンからミントします。
const nftMint = generateSigner(umi)
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
group: some('nft'),
mintArgs: {
thirdPartySigner: some({ signer: thirdPartySigner }),
nftPayment: some({
mint: nftFromRequiredCollection.publicKey,
destination: nftTreasury,
tokenStandard: TokenStandard.NonFungible,
}),
},
})
)
.sendAndConfirm(umi)

APIリファレンス: mintV2, DefaultGuardSetMintArgs

事前検証付きミント

一部のガードは、キャンディマシンからミントできるようになる前に追加の検証ステップを必要とする場合があることに注意することが重要です。この事前検証ステップは通常、ブロックチェーン上にアカウントを作成するか、その検証の証明として機能するトークンでウォレットに報酬を与えます。

ルート命令の使用

ガードが事前検証ステップを必要とする方法の1つは、「ルート」命令を介して独自の特別な命令を使用することです。

その良い例が許可リストガードです。このガードを使用する際、ルート命令を呼び出し、有効なMerkle Proofを提供することで、ウォレットが事前定義されたウォレットのリストに属することを検証する必要があります。このルート命令が成功すると、そのウォレット用の許可リストPDAが作成され、ミント命令がそれを読み取って許可リストガードを検証できます。許可リストガードの専用ページで詳細を読むことができます

外部サービスの使用

ガードが事前検証ステップを実行するもう一つの方法は、外部ソリューションに依存することです。

例えば、ゲートキーパーガードを使用する際、設定されたゲートキーパーネットワークに依存するチャレンジ(Captchaの完了など)を実行してゲートウェイトークンを要求する必要があります。その後、ゲートキーパーガードはそのようなゲートウェイトークンの存在をチェックして、ミントを検証または拒否します。ゲートキーパーガードの専用ページで詳細を学ぶことができます

ボット税付きミント

キャンディマシンに含めたいガードの1つは、失敗したミントに設定可能なSOL量を請求することでキャンディマシンをボットから保護するボット税ガードです。この金額は通常、本物のユーザーからの純粋なミスに影響を与えることなくボットを傷つけるために小額に設定されます。すべてのボット税はキャンディマシンアカウントに転送されるため、ミントが終了した後、キャンディマシンアカウントを削除してこれらの資金にアクセスできます。

このガードは少し特別で、他のすべてのガードのミント動作に影響を与えます。ボット税が有効化され、他のガードがミントの検証に失敗した場合、トランザクションは成功したふりをします。つまり、プログラムからエラーは返されませんが、NFTもミントされません。これは、資金がボットからキャンディマシンアカウントに転送されるためにトランザクションが成功する必要があるためです。ボット税ガードの専用ページで詳細を学ぶことができます

まとめ

おめでとうございます!キャンディマシンのAからZまでの動作を理解しました!

興味を持たれるかもしれない追加の読み物リソースは次のとおりです: