Core Candy Machine

ガードグループ

以前のページの一つで、ガードを紹介し、Candy Machineのアクセス制御を定義するためにそれらを使用しました。ガードを使用することで、例えばミント毎に1 SOLの支払いを追加し、特定の日付後にミントが開始されることを確保できることを見ました。しかし、第2の日付の後に2 SOLを請求することもしたい場合はどうでしょうか?特定のトークンホルダーに無料または割引価格でミントを許可したい場合はどうでしょうか?

それぞれが独自の要件を持つ複数のガードセットを定義できればどうでしょうか?その理由のために、私たちはガードグループを作成しました!

グループはどのように機能しますか?

有効にしたいガードの設定を提供するだけで、どんなCore Candy Machineでもガードを設定できる方法を覚えていますか?ガードグループも同じ方法で機能しますが、それらを識別するために固有のラベルも提供する必要があります。

したがって、各ガードグループには以下の属性があります:

  • ラベル: 固有のテキスト識別子。これは6文字を超えることはできません。
  • ガード: そのグループ内のすべての有効化されたガードの設定。これはCore Candy Machineに直接ガードを設定するのと同じように機能します。

簡単な例を取ってみましょう。4時から5時まで1 SOLを請求し、その後5時からCore Candy Machineが消耗するまで2 SOLを請求したいとしましょう。Bot Taxガード経由でボットから保護されていることを確認しながらすべてを行います。ここでガードをどのように設定するかを示します:

  • グループ1:
    • ラベル: "early"
    • ガード:
      • Sol Payment: 1 SOL
      • Start Date: 4 pm (簡単にするために実際の日付はここでは無視します)
      • End Date: 5 pm
      • Bot Tax: 0.001 SOL
  • グループ2:
    • ラベル: "late"
    • ガード:
      • Sol Payment: 2 SOL
      • Start Date: 5 pm
      • Bot Tax: 0.001 SOL

このようにして、カスタマイズされた2段階ミントプロセスを作成しました!

今、誰かがCore Candy Machineからミントしようとするとき、彼らはどのグループからミントしているかを明示的に私たちに伝える必要があります。ミント時にグループラベルを求めることが重要な理由は:

  • 購入者が予期しないミント動作を経験しないことを保証します。最初のグループの終了日の最後に1 SOLでミントしようとしましたが、トランザクションが実行される頃にはその日付を過ぎているとします。グループラベルを求めなかった場合、トランザクションは成功し、1 SOLのみを請求されることを期待していたにも関わらず、2 SOLが請求されます。
  • 並行グループをサポートすることを可能にします。これについては後でこのページで詳しく説明します。

今、SDKを使用してグループをどのように作成・更新できるかを見てみましょう。

ガードグループ付きCandy Machineの作成

ガードグループ付きCandy Machineを作成するには、create関数にgroups配列を提供するだけです。この配列の各項目には、そのグループで有効化したいすべてのガードの設定を含むlabelguardsオブジェクトが含まれている必要があります。

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配列が更新されることに注意してください。つまり、既存のすべてのデータを上書きします

したがって、設定が変更されていない場合でも、すべてのグループの設定を提供するようにしてください。既存の設定を上書きしないように、事前に最新のCandy Guardアカウントデータを取得したい場合があります。

以下は「late」グループのSOL paymentガードを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

デフォルトガード

上記の例で、両方のグループに同じBot Taxガードを提供する必要があったことに注目してください。これは、Candy Machineに設定されたグローバルガードを活用することで簡素化できます。

ガードグループを使用する場合、Core Candy Machineのグローバルガード — 以前のページで説明したとおり — はデフォルトガードとして機能します!これは、グループで明示的に有効化してそれらを上書きしない限り、グループがグローバルガードと同じガード設定を使用することをデフォルトとすることを意味します。

簡単な要約:

  • ガードがデフォルトガードでは有効だがグループのガードでは有効でない場合、グループはデフォルトガードで定義されたとおりにガードを使用します。
  • ガードがデフォルトガード_と_グループのガードの両方で有効な場合、グループはグループのガードで定義されたとおりにガードを使用します。
  • ガードがデフォルトガードまたはグループのガードで有効でない場合、グループはこのガードを使用しません。

これを説明するために、前のセクションの例を取って、Bot Taxガードをデフォルトガードに移しましょう。

  • デフォルトガード:
    • Bot Tax: 0.001 SOL
  • グループ1:
    • ラベル: "early"
    • ガード:
      • Sol Payment: 1 SOL
      • Start Date: 4 pm
      • End Date: 5 pm
  • グループ2:
    • ラベル: "late"
    • ガード:
      • Sol Payment: 2 SOL
      • Start Date: 5 pm

ご覧のとおり、デフォルトガードはグループ内の繰り返しを避けるのに役立ちます。

デフォルトガードを使用する場合でも、ミント時にグループを提供する必要があることに注意してください。つまり、ガードグループを使用する場合、デフォルトガードのみを使用してミントすることは不可能です

デフォルトガードとガードグループでCandy Machineを作成

Umiライブラリでデフォルトガードを使用するには、Candy Machineを作成または更新するときにgroups配列と組み合わせてguards属性を使用するだけです。例えば、上記で説明したガード設定を使用してCandy Machineを作成する方法は以下のとおりです。

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

並行グループ

ミント時にグループラベルを要求することの非常に興味深い利点の一つは、特定の時間に複数の有効なグループを持つ能力です。これにより、プログラムの曖昧さが排除され、購入者がどのグループからミントを試行したいかを選択できます。

新しい例でこれを説明しましょう。「Innocent Bird」と呼ばれるアセットコレクションがあり、「Innocent Bird」アセットを保有している人に1 SOLの割引価格を提供し、他の人には2 SOLを請求したいとします。両方のグループが同時にミント開始できるようにしたい — たとえば4時 — そして両方のグループでボットから保護されたいとします。ガードをどのように設定するかは以下のとおりです:

  • デフォルトガード:
    • Start Date: 4 pm
    • Bot Tax: 0.001 SOL
  • グループ1:
    • ラベル: "nft"
    • ガード:
      • Sol Payment: 1 SOL
      • NFT Gate: "Innocent Bird" コレクション
  • グループ2:
    • ラベル: "public"
    • ガード:
      • Sol Payment: 2 SOL

ご覧のとおり、これらのガード設定では、両方のグループが同時にミントすることが可能です。NFTホルダーが「public」グループからのミントを決定した場合、全額の2 SOLを支払うことさえ可能です。しかし、可能であれば「nft」グループを選択することが彼らの最大の利益になります。

並行グループ付きCore Candy Machineの作成

Umiライブラリ経由で上記で説明したガード設定を使用してCore Candy Machineを作成する方法は以下のとおりです。

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

まとめ

ガードグループは、ニーズに合わせた順次および/または並行ミントワークフローを定義できるようにすることで、Core Candy Machineに全く新しい次元をもたらします。

次のページでは、ガードに関するさらにもう一つのエキサイティングな機能:ガード命令を見ていきます!