可用守卫
Freeze Sol Payment 守卫
概述
Freeze Sol Payment 守卫允许通过向付款人收取一定数量的 SOL 来铸造冻结的 NFT。冻结的 NFT 在解冻之前无法转移或在任何市场上架。
冻结的 NFT 可以被任何人解冻,只要满足以下条件之一:
- Candy Machine 已售罄。
- Candy Machine 已被删除。
- 配置的冻结期——最长可达 30 天——已过。
资金会转移到一个"冻结托管"账户,该账户必须在铸造开始之前由 Candy Guard 权限初始化。一旦所有冻结的 NFT 都被解冻,Candy Guard 权限可以解锁资金并将其转移到配置的目标账户。
您可以通过此守卫的 route 指令初始化冻结托管账户、解冻 NFT 和解锁资金。
守卫设置
Freeze Sol Payment 守卫包含以下设置:
- Lamports:向付款人收取的 SOL 数量(或 lamports)。
- Destination(目标):最终应接收与此守卫相关的所有付款的钱包地址。
使用 Freeze Sol Payment 守卫设置 Candy Machine
create(umi, {
// ...
guards: {
freezeSolPayment: some({
lamports: sol(1.5),
destination: umi.identity.publicKey,
}),
},
})
API 参考:create、FreezeSolPayment
铸造设置
Freeze Sol Payment 守卫包含以下铸造设置:
- Destination(目标):最终应接收与此守卫相关的所有付款的钱包地址。
- NFT Rule Set(可选):铸造的 NFT 的规则集,如果我们正在铸造带有规则集的可编程 NFT。
请注意,如果您计划在没有我们 SDK 帮助的情况下构建指令,您需要提供这些铸造设置以及更多作为指令参数和剩余账户的组合。有关更多详细信息,请参阅 Candy Guard 程序文档。
使用 Freeze Sol Payment 守卫铸造
您可以使用 mintArgs 参数传递 Freeze Sol Payment 守卫的铸造设置,如下所示。
mintV2(umi, {
// ...
mintArgs: {
freezeSolPayment: some({ destination: umi.identity.publicKey }),
},
})
API 参考:mintV2、FreezeSolPaymentMintArgs
Route 指令
Freeze Sol Payment route 指令支持以下功能。
初始化冻结托管
路径:initialize
使用 Freeze Sol Payment 守卫时,我们必须在铸造开始之前初始化冻结托管账户。这将创建一个从守卫设置的 Destination 属性派生的 PDA 账户。
冻结托管 PDA 账户将跟踪几个参数,例如:
- 通过此守卫铸造了多少冻结的 NFT。
- 第一个冻结的 NFT 是何时通过此守卫铸造的,因为冻结期从那时开始计算。
初始化此冻结托管账户时,我们必须向守卫的 route 指令提供以下参数:
- Path =
initialize:选择要在 route 指令中执行的路径。 - Destination(目标):最终应接收与此守卫相关的所有付款的钱包地址。
- Period(期限):冻结期应持续的时间(以秒为单位)。这最多可以是 30 天(2,592,000 秒),它将从通过此守卫铸造的第一个冻结 NFT 开始计算。冻结期提供了一种安全机制,确保即使 Candy Machine 永远不会售罄,冻结的 NFT 最终也可以被解冻。
- Candy Guard Authority:作为签名者的 Candy Guard 账户权限。
最后但同样重要的是,冻结托管 PDA 账户将接收通过此守卫铸造的所有冻结 NFT 的资金。
初始化冻结托管
在下面的示例中,我们使用最长 15 天的冻结期初始化冻结托管账户,并使用当前身份作为 Candy Guard 权限。
route(umi, {
// ...
guard: 'freezeSolPayment',
routeArgs: {
path: 'initialize',
destination: umi.identity.publicKey,
period: 15 * 24 * 60 * 60, // 15 天。
candyGuardAuthority: umi.identity,
},
})
解冻冻结的 NFT
路径:thaw
冻结的 NFT 可以被任何人解冻,只要满足以下条件之一:
- Candy Machine 已售罄。
- Candy Machine 已被删除。
- 配置的冻结期——最长可达 30 天——已过。
请注意,由于冻结托管中的资金在所有 NFT 解冻之前无法转移,这激励国库尽快解冻所有 NFT。
要解冻冻结的 NFT,我们必须向守卫的 route 指令提供以下参数:
- Path =
thaw:选择要在 route 指令中执行的路径。 - Destination(目标):最终应接收与此守卫相关的所有付款的钱包地址。
- NFT Mint:要解冻的冻结 NFT 的铸币地址。
- NFT Owner:要解冻的冻结 NFT 所有者的地址。
- NFT Token Standard:要解冻的冻结 NFT 的代币标准。
- NFT Rule Set(可选):要解冻的冻结 NFT 的规则集,如果我们正在解冻带有规则集的可编程 NFT。
解冻冻结的 NFT
在下面的示例中,我们解冻属于当前身份的冻结 NFT。
route(umi, {
// ...
guard: 'freezeSolPayment',
routeArgs: {
path: 'thaw',
destination,
nftMint: nftMint.publicKey,
nftOwner: umi.identity.publicKey,
nftTokenStandard: candyMachine.tokenStandard,
},
})
解锁资金
路径:unlockFunds
一旦所有冻结的 NFT 都被解冻,国库可以从冻结托管账户解锁资金。这将把资金转移到配置的目标地址。
要解锁资金,我们必须向守卫的 route 指令提供以下参数:
- Path =
unlockFunds:选择要在 route 指令中执行的路径。 - Destination(目标):最终应接收与此守卫相关的所有付款的钱包地址。
- Candy Guard Authority:作为签名者的 Candy Guard 账户权限。
解锁资金
在下面的示例中,我们使用当前身份作为 Candy Guard 权限从冻结托管账户解锁资金。
route(umi, {
// ...
guard: 'freezeSolPayment',
routeArgs: {
path: 'unlockFunds',
destination,
candyGuardAuthority: umi.identity,
},
})
停止冻结 NFT
可以停止 Freeze Sol Payment 守卫内的 NFT 冻结。换句话说,新铸造的 NFT 将不再被冻结,但现有的冻结 NFT 将保持冻结状态。
有几种方法可以实现这一点,可以分为两类:
- ☀️ 可解冻:现有的冻结 NFT 可以被任何人使用 route 指令的
thaw路径解冻。 - ❄️ 不可解冻:现有的冻结 NFT 尚无法解冻,我们必须等待满足"可解冻"条件。
考虑到这一点,以下是停止冻结 NFT 的详尽方法列表,以及每种方法是否允许解冻现有的冻结 NFT:
- Candy Machine 已售罄 → ☀️ 可解冻。
- 配置的冻结期——最长可达 30 天——已过 → ☀️ 可解冻。
- Candy Machine 账户已删除 → ☀️ 可解冻。
- Candy Guard 账户已删除 → ❄️ 不可解冻。
- Freeze Sol Payment 守卫已从设置中移除 → ❄️ 不可解冻。
冻结托管和守卫组
在各种守卫组中使用多个 Freeze Sol Payment 守卫时,了解 Freeze Sol Payment 守卫和冻结托管账户之间的关系非常重要。
冻结托管账户是从目标地址派生的 PDA。这意味着如果多个 Freeze Sol Payment 守卫配置为使用相同的目标地址,它们都将共享相同的冻结托管账户。
因此,它们也将共享相同的冻结期,所有资金将由同一个托管账户收集。这也意味着,我们只需要为每个配置的目标地址调用一次 initialize route 指令。这意味着每个配置的目标地址只需要一次 route 指令。unlockFunds 也是如此。要 thaw,您可以使用任何标签,只要这些标签共享相同的托管账户。
也可以使用具有不同目标地址的多个 Freeze Sol Payment 守卫。在这种情况下,每个 Freeze Sol Payment 守卫将拥有自己的冻结托管账户和自己的冻结期。
下面的示例说明了一个 Candy Machine,它在三个组中有三个 Freeze Sol Payment 守卫,使得:
- 组 1 和组 2 共享相同的目标地址,因此共享相同的冻结托管账户。
- 组 3 有自己的目标地址,因此有自己的冻结托管账户。
