利用可能なガード
Freeze Token Payment ガード
概要
Freeze Token Payment ガードは、特定のミントアカウントから特定量のトークンを支払者に請求することで、凍結された Asset のミントを可能にします。凍結された Asset は解凍されるまで転送やマーケットプレイスへの出品ができません。
凍結された Asset は、以下のいずれかの条件が満たされていれば誰でも解凍できます:
- Candy Machine がミントアウト(完売)した。
- Candy Machine が削除された。
- 設定された凍結期間(最大30日間)が経過した。
トークンは「Freeze Escrow」アカウントに転送されます。このアカウントは、ミントを開始する前に Candy Guard 権限者によって初期化される必要があります。すべての凍結された Asset が解凍されると、Candy Guard 権限者によって資金のロックが解除され、設定された宛先アカウントに転送されます。
Freeze Escrow アカウントの初期化、Asset の解凍、資金のロック解除は、このガードのルート命令を介して行うことができます。
ガード設定
Freeze Token Payment ガードには以下の設定が含まれます:
- Amount: 支払者に請求するトークンの数。
- Mint: 支払いに使用する SPL Token を定義するミントアカウントのアドレス。
- Destination Associated Token Address (ATA): トークンを最終的に送信する関連トークンアカウントのアドレス。このアドレスは、Mint 属性と、これらのトークンを受け取るべき任意のウォレットのアドレスを使用して、Associated Token Address PDA を見つけることで取得できます。
Freeze Token Payment ガードを使用して Candy Machine を設定
以下は、Freeze Token Payment ガードを使用して Candy Machine を作成する方法です。この例では、Umi の identity を宛先ウォレットとして使用しています。
import { findAssociatedTokenPda } from "@metaplex-foundation/mpl-toolbox";
create(umi, {
// ...
guards: {
freezeTokenPayment: some({
amount: 300,
mint: tokenMint.publicKey,
destinationAta: findAssociatedTokenPda(umi, {
mint: tokenMint.publicKey,
owner: umi.identity.publicKey,
}),
}),
},
});
ミント設定
Freeze Token Payment ガードには以下のミント設定が含まれます:
- Mint: 支払いに使用する SPL Token を定義するミントアカウントのアドレス。
- Destination Associated Token Address (ATA): トークンを最終的に送信する関連トークンアカウントのアドレス。
注意: SDK の助けを借りずに命令を構築する場合は、これらのミント設定とその他を命令引数と残りアカウントの組み合わせとして提供する必要があります。詳細については、Candy Guard のプログラムドキュメントを参照してください。
Freeze Token Payment ガードを使用して Candy Machine を設定
以下のように mintArgs 引数を使用して、Freeze Token Payment ガードのミント設定を渡すことができます。
mintV1(umi, {
// ...
mintArgs: {
freezeTokenPayment: some({
mint: tokenMint.publicKey,
destinationAta,
}),
},
});
ルート命令
Freeze Token Payment ルート命令は以下の機能をサポートしています。
Freeze Escrow の初期化
パス: initialize
Freeze Token Payment ガードを使用する場合、ミントを開始する前に Freeze Escrow アカウントを初期化する必要があります。これにより、ガードの設定の Destination ATA 属性から派生した PDA アカウントが作成されます。
Freeze Escrow PDA アカウントは、以下のような複数のパラメータを追跡します:
- このガードを通じて何枚の凍結された Asset がミントされたか。
- 凍結期間はその後からカウントされるため、このガードを介して最初の凍結された Asset がいつミントされたか。
この Freeze Escrow アカウントを初期化する際は、ガードのルート命令に以下の引数を提供する必要があります:
- Path =
initialize: ルート命令で実行するパスを選択します。 - Mint: 支払いに使用する SPL Token を定義するミントアカウントのアドレス。
- Destination Associated Token Address (ATA): トークンを最終的に送信する関連トークンアカウントのアドレス。
- Period: 凍結期間が継続すべき秒数での時間。これは最大30日間(2,592,000秒)で、このガードを介してミントされた最初の凍結された Asset から開始されます。凍結期間は、Candy Machine が完売しなくても、凍結された Asset が最終的に解凍されることを保証する安全機構を提供します。
- Candy Guard Authority: 署名者としての Candy Guard アカウントの権限。
最後に、Freeze Escrow PDA アカウントは、このガードを通じてミントされたすべての凍結された Asset の資金を受け取ります。
Freeze Escrow を初期化
以下の例では、最大凍結期間を15日間として Freeze Escrow アカウントを初期化し、現在の identity を Core Candy Guard 権限として使用しています。
route(umi, {
// ...
guard: "freezeTokenPayment",
routeArgs: {
path: "initialize",
mint: tokenMint.publicKey,
destinationAta,
period: 15 * 24 * 60 * 60, // 15日間。
candyGuardAuthority: umi.identity,
},
});
凍結された Asset の解凍
パス: thaw
凍結された Asset は、以下のいずれかの条件が満たされていれば誰でも解凍できます:
- Core Candy Machine がミントアウトした。
- Core Candy Machine が削除された。
- 設定された凍結期間(最大30日間)が経過した。
Freeze Escrow 内のトークンはすべての Asset が解凍されるまで転送不可能であるため、これにより treasury はできるだけ早くすべての Asset を解凍するインセンティブが生まれます。
凍結された Asset を解凍するには、ガードのルート命令に以下の引数を提供する必要があります:
- Path =
thaw: ルート命令で実行するパスを選択します。 - Mint: 支払いに使用する SPL Token を定義するミントアカウントのアドレス。
- Destination Associated Token Address (ATA): トークンを最終的に送信する関連トークンアカウントのアドレス。
- Asset Address: 解凍する凍結された Asset のミントアドレス。
- Asset Owner: 解凍する凍結された Asset の所有者のアドレス。
Freeze Token Payment ガードを使用して Candy Machine を設定
以下の例では、現在の identity に属する凍結された Asset を解凍しています。
route(umi, {
// ...
guard: "freezeTokenPayment",
routeArgs: {
path: "thaw",
mint: tokenMint.publicKey,
destinationAta,
AssetMint: AssetMint.publicKey,
AssetOwner: umi.identity.publicKey,
AssetTokenStandard: candyMachine.tokenStandard,
},
});
資金のロック解除
パス: unlockFunds
すべての凍結された Asset が解凍されると、treasury は Freeze Escrow アカウントから資金のロックを解除できます。これにより、トークンが設定された Destination ATA アドレスに転送されます。
資金のロックを解除するには、ガードのルート命令に以下の引数を提供する必要があります:
- Path =
unlockFunds: ルート命令で実行するパスを選択します。 - Mint: 支払いに使用する SPL Token を定義するミントアカウントのアドレス。
- Destination Associated Token Address (ATA): トークンを最終的に送信する関連トークンアカウントのアドレス。
- Candy Guard Authority: 署名者としての Core Candy Guard アカウントの権限。
Freeze Token Payment ガードを使用して Candy Machine を設定
以下の例では、現在の identity を Candy Guard 権限として使用し、Freeze Escrow アカウントから資金のロックを解除しています。
route(umi, {
// ...
guard: 'freezeTokenPayment',
routeArgs: {
path: 'unlockFunds',
destination,
candyGuardAuthority: umi.identity,
},
})
API リファレンス: route, freezeTokenPaymentRouteArgsUnlockFunds
Asset の凍結を停止
Freeze Token Payment ガード内で Asset の凍結を停止することが可能です。つまり、新しくミントされる Asset は凍結されなくなりますが、既存の凍結された Asset は凍結されたままです。
これを実現するにはいくつかの方法があり、2つのカテゴリに分けることができます:
- ☀️ 解凍可能: 既存の凍結された Asset は、ルート命令の
thawパスを使用して誰でも解凍できます。 - ❄️ 解凍不可: 既存の凍結された Asset はまだ解凍できず、「解凍可能」の条件の1つが満たされるまで待つ必要があります。
これを念頭に置いて、Asset の凍結を停止する方法と、それぞれが既存の凍結された Asset の解凍を許可するかどうかの完全なリストは以下の通りです:
- Candy Machine がミントアウトした → ☀️ 解凍可能。
- 設定された凍結期間(最大30日間)が経過した → ☀️ 解凍可能。
- Candy Machine アカウントが削除された → ☀️ 解凍可能。
- Candy Guard アカウントが削除された → ❄️ 解凍不可。
- Freeze Token Payment ガードが設定から削除された → ❄️ 解凍不可。
Freeze Escrow とガードグループ
様々なガードグループ内で複数の Freeze Token Payment ガードを使用する場合、Freeze Token Payment ガードと Freeze Escrow アカウントの関係を理解することが重要です。
Freeze Escrow アカウントは Destination アドレスから派生した PDA です。つまり、複数の Freeze Token Payment ガードが同じ Destination アドレスを使用するように設定されている場合、それらはすべて同じ Freeze Escrow アカウントを共有します。
したがって、それらは同じ凍結期間を共有し、すべての資金は同じエスクローアカウントによって収集されます。これはまた、設定された Destination アドレスごとに initialize ルート命令を1回だけ呼び出す必要があることを意味します。これは、ルート命令が設定された Destination アドレスごとに1回だけ必要であることを意味します。unlockFunds についても同様です。thaw するには、同じエスクローアカウントを共有している限り、どのラベルでも使用できます。
異なる Destination アドレスを持つ複数の Freeze Token Payment ガードを使用することも可能です。この場合、各 Freeze Token Payment ガードは独自の Freeze Escrow アカウントと独自の凍結期間を持ちます。
以下の例は、3つのグループに3つの Freeze Token Payment ガードを持つ Candy Machine を示しています:
- グループ1と2は同じ Destination アドレスを共有しているため、同じ Freeze Escrow アカウントを共有します。
- グループ3は独自の Destination アドレスを持っているため、独自の Freeze Escrow アカウントを持ちます。
