機能
ガードグループ
前のページでは、ガードを紹介し、それらを使用してキャンディマシンのアクセス制御を定義しました。ガードを使用することで、例えばミントごとに1 SOLの支払いを追加し、特定の日付後にミントが開始されることを確保できることがわかりました。しかし、2回目の日付後に2 SOLを請求したい場合はどうでしょうか?特定のトークン保有者を無料または割引価格でミントできるようにしたい場合はどうでしょうか?
それぞれが独自の要件を持つ複数のガードセットを定義できたらどうでしょうか?そのために、ガードグループを作成しました!
グループはどのように機能しますか?
任意のキャンディマシンでガードを設定する方法を覚えていますか?有効にしたいガードの設定を提供するだけです。ガードグループも同じように機能しますが、それらを識別するための一意のラベルも付ける必要があります。
したがって、各ガードグループには以下の属性があります:
- ラベル: 一意のテキスト識別子。これは6文字より長くすることはできません。
- ガード: そのグループ内のすべてのアクティブなガードの設定。これは、キャンディマシンで直接ガードを設定するのと同じように機能します。
簡単な例を取ってみましょう。午後4時から5時まで1 SOLを請求し、その後午後5時からキャンディマシンが使い切られるまで2 SOLを請求したいとします。すべてボット税ガード経由でボットから保護されます。ガードの設定方法は以下のとおりです:
- グループ1:
- ラベル: "early"
- ガード:
- SOL支払い: 1 SOL
- 開始日: 午後4時(簡単にするために実際の日付は無視)
- 終了日: 午後5時
- ボット税: 0.001 SOL
- グループ2:
- ラベル: "late"
- ガード:
- SOL支払い: 2 SOL
- 開始日: 午後5時
- ボット税: 0.001 SOL
これで、カスタマイズされた2段階ミントプロセスを作成しました!
キャンディマシンからミントしようとする人は、どのグループからミントするかを明示的に伝える必要があります。ミント時にグループラベルを求めることが重要な理由:
- 購入者が予期しないミント動作を経験しないことを保証します。最初のグループの終了日の最後に1 SOLでミントしようとしたが、トランザクションが実行される時には既にその日付を過ぎていたとします。グループラベルを求めなければ、トランザクションは成功し、1 SOLしか請求されることを期待していたにもかかわらず2 SOLが請求されてしまいます。
- 並列グループをサポートすることが可能になります。これについてはこのページで後で詳しく話します。
SDKを使用してグループを作成・更新する方法を見てみましょう。
ガードグループ付きキャンディマシンの作成
ガードグループ付きキャンディマシンを作成するには、create関数にgroups配列を提供するだけです。この配列の各アイテムにはlabelと、そのグループでアクティブにしたいすべてのガードの設定を含むguardsオブジェクトが含まれている必要があります。
Umiライブラリを使用して上記の例を実装する方法は次のとおりです。
import { some, sol, dateTime } from '@metaplex-foundation/umi'
await create(umi, {
// ...
groups: [
{
label: 'early',
guards: {
solPayment: some({ lamports: sol(1), destination: treasury }),
startDate: some({ date: dateTime('2022-10-18T16:00:00Z') }),
endDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
},
},
{
label: 'late',
guards: {
solPayment: some({ lamports: sol(2), destination: treasury }),
startDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
},
},
],
}).sendAndConfirm(umi)
グループを更新するには、updateCandyGuard関数に同じgroups属性を提供するだけです。 guardsオブジェクト全体とgroups配列が更新されることに注意してください。つまり、既存のすべてのデータを上書きします!
したがって、設定が変更されていない場合でも、すべてのグループの設定を提供してください。既存の設定を上書きしないように、事前に最新のキャンディガードアカウントデータを取得したい場合があります。
「late」グループのSOL支払いガードを2 SOLではなく3 SOLに変更する例です。
import { some, sol, dateTime } from '@metaplex-foundation/umi'
const candyGuard = await fetchCandyGuard(umi, candyMachine.mintAuthority)
await updateCandyGuard(umi, {
candyGuard: candyGuard.publicKey,
guards: candyGuard.guards,
groups: [
{
label: 'early',
guards: {
solPayment: some({ lamports: sol(1), destination: treasury }),
startDate: some({ date: dateTime('2022-10-18T16:00:00Z') }),
endDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
},
},
{
label: 'late',
guards: {
solPayment: some({ lamports: sol(3), destination: treasury }),
startDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
},
},
],
}).sendAndConfirm(umi)
APIリファレンス: create, updateCandyGuard, DefaultGuardSetArgs
デフォルトガード
上記の例では、同じボット税ガードを両方のグループに提供する必要があったことに注目してください。これは、キャンディマシンで設定されたグローバルガードを活用することで簡単にできます。
ガードグループを使用する際、キャンディマシンのグローバルガード — 前のページで説明したもの — はデフォルトガードとして機能します!つまり、グループで明示的に有効にしてオーバーライドしない限り、グループはグローバルガードと同じガード設定をデフォルトで使用します。
簡単なまとめです:
- デフォルトガードでガードが有効になっているがグループのガードでは有効になっていない場合、グループはデフォルトガードで定義されたガードを使用します。
- デフォルトガードでガードが有効になっており、かつグループのガードでも有効になっている場合、グループはグループのガードで定義されたガードを使用します。
- デフォルトガードまたはグループのガードでガードが有効になっていない場合、グループはこのガードを使用しません。
それを説明するために、前のセクションの例を取り、ボット税ガードをデフォルトガードに移動しましょう。
- デフォルトガード:
- ボット税: 0.001 SOL
- グループ1:
- ラベル: "early"
- ガード:
- SOL支払い: 1 SOL
- 開始日: 午後4時
- 終了日: 午後5時
- グループ2:
- ラベル: "late"
- ガード:
- SOL支払い: 2 SOL
- 開始日: 午後5時
ご覧のように、デフォルトガードはグループ内での繰り返しを避けるのに役立ちます。
デフォルトガードを使用する場合でも、ミント時にグループを提供する必要があることに注意してください。つまり、ガードグループを使用する場合、デフォルトガードのみを使用してミントすることはできません。
デフォルトガードとガードグループ付きキャンディマシンの作成
Umiライブラリでデフォルトガードを使用するには、キャンディマシンを作成または更新する際にgroups配列と組み合わせてguards属性を使用するだけです。例えば、上記で説明したガード設定を使用してキャンディマシンを作成する方法です。
import { some, sol, dateTime } from '@metaplex-foundation/umi'
await create(umi, {
// ...
guards: {
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
},
groups: [
{
label: 'early',
guards: {
solPayment: some({ lamports: sol(1), destination: treasury }),
startDate: some({ date: dateTime('2022-10-18T16:00:00Z') }),
endDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
},
},
{
label: 'late',
guards: {
solPayment: some({ lamports: sol(2), destination: treasury }),
startDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
},
},
],
}).sendAndConfirm(umi)
APIリファレンス: create, DefaultGuardSetArgs
並列グループ
ミント時にグループラベルを要求することの本当に興味深い利点の1つは、特定の時点で複数の有効なグループを持つ能力です。これにより、プログラムの曖昧性が除去され、購入者がどのグループからミントしたいかを選択できます。
新しい例でそれを説明しましょう。「Innocent Bird」と呼ばれるNFTコレクションがあり、「Innocent Bird」NFTを保有している人には1 SOLの割引価格を提供し、他の人には2 SOLを請求したいとします。これらのグループの両方が同時にミントを開始できるようにしたい — 午後4時と言って — そして両方のグループでボットから保護されたいです。ガードの設定方法は次のとおりです:
- デフォルトガード:
- 開始日: 午後4時
- ボット税: 0.001 SOL
- グループ1:
- ラベル: "nft"
- ガード:
- SOL支払い: 1 SOL
- NFTゲート: "Innocent Bird"コレクション
- グループ2:
- ラベル: "public"
- ガード:
- SOL支払い: 2 SOL
ご覧のように、これらのガード設定では、両方のグループが同時にミントすることが可能です。NFT保有者が「public」グループからミントすることを決定した場合、満額の2 SOLを支払うことさえ可能です。しかし、できるなら「nft」グループを選択することが彼らの最善の利益です。
並列グループ付きキャンディマシンの作成
Umiライブラリ経由で上記で説明したガード設定を使用してキャンディマシンを作成する方法です。
import { some, sol, dateTime } from '@metaplex-foundation/umi'
await create(umi, {
// ...
guards: {
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
startDate: some({ date: dateTime('2022-10-18T16:00:00Z') }),
},
groups: [
{
label: 'early',
guards: {
solPayment: some({ amount: sol(1), destination: treasury }),
nftGate: some({
requiredCollection: innocentBirdCollectionNft.publicKey,
}),
},
},
{
label: 'late',
guards: {
solPayment: some({ amount: sol(2), destination: treasury }),
},
},
],
}).sendAndConfirm(umi)
APIリファレンス: create, DefaultGuardSetArgs
まとめ
ガードグループは、ニーズに合わせてシーケンシャルおよび/または並列のミントワークフローを定義することで、キャンディマシンに全く新しい次元をもたらします。
次のページでは、ガードに関するもう一つのエキサイティングな機能:ガード命令について見てみましょう!
