1 个稳定版本
1.0.2 |
|
---|---|
1.0.1 | 2023年5月24日 |
#5 in #candy
235KB
3.5K SLoC
Metaplex Candy Guard
💡 更新
从Candy Guard v0.2.0开始,initialize
和update
指令的参数序列化逻辑期望一个表示自定义序列化结构的[u8]
。这是为了确保将来添加新的守卫不会影响客户端。
如果您使用的是mpl-candy-guard
npm包,可以使用以下方式序列化CandyMachineData对象:
import { serialize } from '@metaplex-foundation/mpl-candy-guard';
const data = { ... };
const serializedData = serialize(data);
如果您使用的是mpl-candy-guard
Rust包,可以使用以下方式序列化CandyMachineData结构:
let data = CandyGuardData { ... };
let mut serialized_data = vec![0; data.size()];
data.save(&mut serialized_data)?;
概述
新的Candy Guard
程序旨在将Candy Machine
的访问控制逻辑移除,以处理额外的铸造功能,同时保留Candy Machine程序的核心铸造功能——创建NFT。这不仅提供了访问控制和铸造逻辑之间的清晰分离,还提供了一种模块化和灵活的体系结构,可以添加或删除铸造功能,而无需修改Candy Machine程序。
Candy Guard的访问控制封装在代表需要满足的特定规则的个体守卫中,可以启用或禁用。例如,铸造的直播日期表示为LiveDate
守卫。只有当交易时间在守卫配置的起始时间或之后时,此守卫才满足条件。其他守卫可以验证访问控制的各个方面——例如,确保用户持有特定令牌(令牌门控)。
注意 Candy Guard 程序只能与
Candy Machine Core
(Candy Machine V3
) 账户结合使用。当 Candy Guard 与 Candy Machine 结合使用时,它成为其铸造权限,铸造只能通过 Candy Guard 完成。
程序如何工作?
Candy Guard 程序的主要目的是在用户从糖果机铸造之前,持有铸造 守卫 的配置并应用它们。如果所有启用的守卫条件都有效,则铸造事务将被转发到 Candy Machine。
收到铸造事务时,程序执行以下步骤
- 对事务进行所有启用的守卫的验证。
- 如果在此点守卫失败,则事务将受到
BotTax
(当启用BotTax
守卫时) 的影响,并将终止事务。
- 如果在此点守卫失败,则事务将受到
- 在验证所有守卫都有效后,它将在每个守卫上调用
pre_actions
函数。此函数负责在铸造之前执行任何操作(例如,为铸造收取付款)。 - 然后,事务被转发到 Candy Machine 程序以铸造 NFT。
- 最后,它将在每个启用的守卫上调用
post_actions
函数。此函数负责在铸造之后执行任何操作(例如,冻结 NFT,更改更新权限)。
守卫 是一个模块化代码块,可以轻松添加到 Candy Guard 程序中,提供极大的灵活性和简单性,以支持特定功能而无需直接修改 Candy Machine 程序。通过遵循特定接口添加新守卫是支持的,更改仅限于单个守卫 - 例如,每个守卫可以单独创建和修改。此架构还提供了灵活性,可以在不要求代码更改的情况下启用/禁用守卫,因为每个守卫都有一个启用/禁用 "开关"。
Candy Guard 程序包含一组可启用/禁用的核心访问控制守卫
AddressGate
:将铸造限制为单个地址Allocation
:指定一组(守卫集)中的最大铸造次数AllowList
:使用钱包地址列表来确定谁可以铸造BotTax
:可配置的对无效事务收费的税(金额)EndDate
:确定铸造结束的日期FreezeSolPayment
:使用冻结期设置铸造的价格(以 SOL 计算)FreezeTokenPayment
:使用冻结期设置铸造的价格(以 spl-token 金额计算)Gatekeeper
:集成验证码MintLimit
:指定每个钱包的铸造数量限制NftBurn
:将铸造限制为指定收藏的持有者,要求烧毁 NFTNftGate
:将铸造限制为指定收藏的持有者NftPayment
:以指定收藏的 NFT 的价格设置铸造ProgramGate
:限制可以包含在铸造事务中的程序RedeemedAmount
:根据已铸造的总金额确定铸造结束SolPayment
:以 SOL 计算设置铸造价格StartDate
:确定铸造的开始日期ThirdPartySigner
:要求在事务上有一个额外的签署者TokenBurn
:将铸造限制为指定 spl-token 的持有者,要求烧毁代币TokenGate
:将铸造限制为指定 spl-token 的持有者TokenPayment
:以 spl-token 金额设置铸造价格
随着这些守卫程序的推出,社区中的优秀团队也在开发新的、酷炫的检查机制。以下是几个创建守卫程序的团队:
- 公民:公民通行证守卫程序(集成文档)
账户
Candy Guard的配置存储在单个账户中。启用的守卫相关信息存储在账户的“隐藏”部分,以避免不必要的反序列化。
字段 | 偏移量 | 大小 | 描述 |
---|---|---|---|
— | 0 | 8 | 锚账户判别符。 |
基础 |
8 | 32 | PubKey 用于推导PDA密钥。种子由["candy_guard", base pubkey] 定义。 |
bump |
40 | 1 | u8 表示派生过程中的增量。 |
权限 |
41 | 32 | 控制Candy Guard的权限地址的PubKey 。 |
隐藏部分 | 73 | ~ | 隐藏数据部分以避免不必要的反序列化。该账户的部分用于序列化守卫数据。 |
- 功能 | 73 | 8 | 功能标志,表示哪些守卫已序列化。 |
- 守卫集 | 81 | ~ | (可选) 一系列序列化的守卫结构。 |
- 组计数器 | ~ | 4 | u32 指定使用的组数。 |
- 组 | ~ | ~ | (可选) 表示不同守卫集的Group 结构的一系列。每个组由以下定义: |
-- 标签 | ~ | 6 | 组的标签。 |
-- 功能 | ~ | 8 | 功能标志,表示为组序列化的守卫。 |
-- 守卫集 | ~ | ~ | (可选) 一系列序列化的守卫结构。 |
由于启用的守卫和组的数量是可变的,账户大小在update
指令期间会动态调整,以适应更新的配置。
指令
📄 initialize
此指令创建并初始化一个新的CandyGuard
账户。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
✅ | CandyGuard 账户PDA密钥。PDA是通过种子["candy_guard", base pubkey] 派生的。 |
|
基础 |
✅ | PDA派生的基础公钥。 | |
权限 |
Candy Guard权限的公钥。 | ||
付款人 |
✅ | 交易付款人。 | |
系统程序 |
SystemProgram 账户。 |
📄 mint
(已弃用)
此指令从由Candy Guard“包装”的Candy Machine中铸造NFT。只有在交易成功验证后,才会将其转发到Candy Machine。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账户PDA密钥。PDA是通过种子["candy_guard", base pubkey] 派生的。 |
||
candy_machine_program |
CandyMachine 程序ID。 |
||
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority_pda |
✅ | 权限PDA密钥(种子["candy_machine", candy_machine pubkey] )。 |
|
付款人 |
✅ | ✅ | 交易付款人。 |
nft_metadata |
✅ | NFT的元数据账户。 | |
nft_mint |
✅ | NFT的铸造账户。在执行指令之前,应创建此账户。 | |
nft_mint_authority |
✅ | NFT的铸造权限。 | |
nft_master_edition |
✅ | NFT主版账号。 | |
collection_authority_record |
收藏权限记录PDA。 | ||
collection_mint |
收藏铸造账号。 | ||
collection_metadata |
✅ | 收藏元数据账号。 | |
collection_master_edition |
收藏主版账号。 | ||
collection_update_authority |
收藏更新权限。 | ||
token_metadata_program |
Metaplex TokenMetadata 程序ID。 |
||
token_program |
spl-token 程序ID。 |
||
系统程序 |
SystemProgram 账户。 |
||
rent |
Rent 账号。 |
||
recent_slothashes |
SlotHashes 账号。 |
||
instruction_sysvar_account |
Sysvar1nstructions 账号。 |
||
remaining accounts | (可选) 个别守卫所需的可选账号列表。 |
参数
参数 | 偏移量 | 大小 | 描述 |
---|---|---|---|
mint_args |
0 | ~ | [u8] 代表守卫参数;如果没有参数则为空 [u8] 。 |
label |
~ | 6 | (可选) 代表用于守卫验证的组标签的 string 。 |
📄 mint_v2
此指令从Candy Guard "包装"的Candy Machine中铸造NFT或pNFT。只有当交易成功验证后,它才会转发到Candy Machine。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账户PDA密钥。PDA是通过种子["candy_guard", base pubkey] 派生的。 |
||
candy_machine_program |
CandyMachine 程序ID。 |
||
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority_pda |
✅ | 权限PDA密钥(种子["candy_machine", candy_machine pubkey] )。 |
|
付款人 |
✅ | ✅ | 交易付款人。 |
minter |
✅ | ✅ | NFT的铸造者(所有者)。 |
nft_mint |
✅ | NFT的铸造账户。在执行指令之前,应创建此账户。 | |
nft_mint_authority |
✅ | NFT的铸造权限。 | |
nft_metadata |
✅ | NFT的元数据账户。 | |
nft_master_edition |
✅ | NFT主版账号。 | |
token |
✅ | (可选) NFT令牌账号。 | |
token_record |
✅ | (可选) 元数据 TokenRecord 账号(对于pNFT是必需的) |
|
collection_delegate_record |
收藏的元数据委托记录。 | ||
collection_mint |
收藏铸造账号。 | ||
collection_metadata |
✅ | 收藏元数据账号。 | |
collection_master_edition |
收藏主版账号。 | ||
collection_update_authority |
收藏更新权限。 | ||
token_metadata_program |
Metaplex TokenMetadata 程序ID。 |
||
spl_token_program |
spl-token 程序ID。 |
||
spl_ata_program |
(可选) spl 关联的令牌程序。 |
||
系统程序 |
SystemProgram 账户。 |
||
sysvar_instructions |
sysvar::instructions 账号。 |
||
recent_slothashes |
SlotHashes 系统变量集群数据。 | ||
authorization_rules_program |
(可选) 令牌授权规则程序。 | ||
authorization_rules |
(可选) 令牌授权规则账号。 | ||
remaining accounts | (可选) 个别守卫所需的可选账号列表。 |
参数
参数 | 偏移量 | 大小 | 描述 |
---|---|---|---|
mint_args |
0 | ~ | [u8] 代表守卫参数;如果没有参数则为空 [u8] 。 |
label |
~ | 6 | (可选) 代表用于守卫验证的组标签的 string 。 |
📄 route
此指令将交易路由到守卫,允许执行自定义守卫指令。交易可以包括守卫指令所需的任何其他账号。将在 RouteArgs
结构中指定将接收交易和任何其他参数的守卫。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账号PDA密钥。 | ||
candy_machine |
✅ | CandyMachine 账户。 |
|
付款人 |
✅ | ✅ | 交易付款人。 |
remaining accounts | (可选) 守卫指令所需的可选账号列表。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构。 |
|
- guard | 1 | 枚举 GuardType 的值 |
- data | ~ | [u8] 代表指令参数;如果没有参数则为空 [u8] 。 |
label |
6 | (可选) 表示用于检索守卫集的组标签的字符串。 |
📄 unwrap
此指令从Candy Machine中移除Candy Guard,将Candy Machine的铸造权限设置为Candy Machine权限。Candy Guard的 public key
必须与Candy Machine的 mint_authority
匹配,此指令才能成功。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账号PDA密钥。 | ||
权限 |
✅ | Candy Guard权限的公钥。 | |
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority |
✅ | Candy Machine权限的公钥。 | |
candy_machine_program |
CandyMachine 程序ID。 |
参数
无。
📄 update
此指令更新Candy Guard配置。由于存在可变数量的守卫和组,此指令将相应地调整账户大小,无论是增加还是减少账户大小。因此,可能会有租金费用或租金lamports的提取。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
✅ | CandyGuard 账号PDA密钥。 | |
权限 |
Candy Guard权限的公钥。 | ||
付款人 |
✅ | 交易付款人。 | |
系统程序 |
SystemProgram 账户。 |
📄 withdraw
此指令将租金lamports从账户中提取并关闭它。执行此指令后,Candy Guard账户将无法正常运作。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
✅ | 的CandyGuard 账户。 |
|
权限 |
✅ | ✅ | Candy Guard权限的公钥。 |
参数
无。
📄 wrap
此指令向Candy Machine添加Candy Guard。添加守卫后,只能通过Candy Guard进行铸币。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账号PDA密钥。 | ||
权限 |
✅ | Candy Guard权限的公钥。 | |
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority |
✅ | Candy Machine权限的公钥。 | |
candy_machine_program |
CandyMachine 程序ID。 |
参数
无。
守卫
AddressGate
pub struct AddressGate {
address: Pubkey,
}
AddressGate
守卫将铸币限制为单个address
——地址必须与铸币交易的付款人地址匹配。
分配
pub struct Allocation {
pub id: u8,
pub size: u16,
}
Allocation
守卫指定一个组(守卫集)中允许的铸币最大数量。的id
配置代表分配的唯一标识——更改id
的效果是重新启动限制,因为将创建不同的跟踪账户。的size
表示分配的铸币最大数量。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
mint_tracker |
✅ | 铸币跟踪PDA。PDA是通过种子["allocation", allocation id, candy guard pubkey, candy machine pubkey] 派生的。 |
路由指令
在验证第一个铸币交易之前需要创建分配PDA。这是通过以下账户和RouteArgs
的route
指令完成的:
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
proof_pda |
✅ | 表示分配的PDA(种子["allocation", merke tree root, payer key, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | Candy Guard权限 | |
系统程序 |
系统程序账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.分配 |
- data | 0 | 空 |
允许列表
pub struct AllowList {
pub merkle_root: [u8; 32],
}
AllowList
守卫通过基于Merkle树地址的允许列表验证付款人地址。它需要一个Merkle树的根作为配置,并且铸币交易必须包括Merkle证明的PDA。如果没有指定证明,交易将失败。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
proof_pda |
Merkle证明的PDA(种子["allow_list", merke tree root, payer key, candy guard pubkey, candy machine pubkey] )。 |
路由指令
在铸币交易之前需要完成Merkle证明验证。这是通过以下账户和RouteArgs
的route
指令完成的:
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
proof_pda |
✅ | 表示Merkle证明的PDA(种子["allow_list", merke tree root, payer key, candy guard pubkey, candy machine pubkey] )。 |
|
系统程序 |
系统程序账户。 | ||
minter |
✅ | (可选)要验证的铸币者账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.允许列表 |
- data | ~ | Merkle证明哈希值的Vec 。 |
BotTax
pub struct BotTax {
pub lamports: u64,
pub last_instruction: bool,
}
的BotTax
守卫用于
- 对无效交易收取罚款。罚款的价值由的
lamports
配置指定。 - 验证铸造交易是否是最后一条交易(
last_instruction = true
)。
bot_tax
应用于在验证守卫时发生的任何错误。
EndDate
pub struct EndDate {
pub date: i64,
}
使用EndDate
守卫来指定结束铸造的日期。任何在结束日期之后收到的交易都会失败。
FreezeSolPayment
pub struct FreezeSolPayment {
pub lamports: u64,
pub destination: Pubkey,
}
FreezeSolPayment
守卫用于对铸造收取一定数量的SOL(lamports)费用,并设置冻结期。资金将被转移到冻结托管账户中,直到所有NFT解冻,此时可以(解锁)转移到目标账户。
注意:在开始铸造之前,必须使用initialize
路由指令初始化冻结功能。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
nft_ata |
关联NFT的令牌账户(种子 [payer pubkey, token program pubkey, nft mint pubkey] )。 |
||
rule_set |
(可选)铸造pNFT的授权规则集。 |
路由指令
initialize
:初始化冻结托管PDA。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | Candy Guard权限。 | |
系统程序 |
系统程序账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeSolPayment |
- data | ~ | |
-- ix | 1 | FreezeInstruction.Initialize |
-- period | 8 | 冻结期(以秒为单位,最长30天) |
thaw
:解冻符合条件的NFT。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
nft_mint |
NFT的铸造账户。 | ||
owner |
NFT所有者的地址。 | ||
nft_ata |
✅ | 关联NFT的令牌账户(种子 [owner pubkey, token program pubkey, nft mint pubkey] )。 |
|
nft_master_edition |
NFT主版账号。 | ||
token_program |
spl-token 程序ID。 |
||
token_metadata_program |
Metaplex TokenMetadata 程序。 |
||
以下是pNFT所需的账户 | |||
nft_metadata |
✅ | NFT的元数据账户。 | |
freeze_pda_ata |
✅ | NFT的冻结PDA关联的令牌账户。 | |
系统程序 |
系统程序。 | ||
sysvar_instructions |
Sysvar指令账户。 | ||
spl_ata_program |
SPL关联令牌账户程序。 | ||
owner_token_record |
✅ | 所有者令牌记录账户。 | |
freeze_pda_token_record |
✅ | 冻结PDA令牌记录账户。 | |
authorization_rules_program |
(可选) 令牌授权规则程序。 | ||
authorization_rules |
(可选) 令牌授权规则账号。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeSolPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.Thaw |
unlock_funds
:解锁冻结的资金。
解锁资金仅在所有冻结的NFT解冻后启用。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | Candy Guard权限。 | |
destination |
✅ | 接收资金的地址(必须与守卫配置中的destination 地址匹配)。 |
|
系统程序 |
SystemProgram 账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeSolPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.UnlockFunds |
FreezeTokenPayment
pub struct FreezeTokenPayment {
pub amount: u64,
pub mint: Pubkey,
pub destination_ata: Pubkey,
}
FreezeTokenPayment
守卫用于对铸造收取指定spl-token的金额作为冻结期的支付。资金被转移到冻结托管账户中,直到所有NFT解冻,此时可以(解锁)转移到目标账户。
注意:在开始铸造之前,必须使用initialize
路由指令初始化冻结功能。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination_ata pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
nft_ata |
关联NFT的令牌账户(种子 [payer pubkey, token program pubkey, nft mint pubkey] )。 |
||
token_account |
✅ | 持有所需金额的令牌账户(种子 [payer pubkey, token program pubkey, mint pubkey] )。 |
|
freeze_ata |
✅ | 冻结PDA的关联令牌账户(种子 [freeze PDA pubkey, token program pubkey, nft mint pubkey] )。 |
|
rule_set |
(可选)铸造pNFT的授权规则集。 |
路由指令
initialize
:初始化冻结托管PDA。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination_ata pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | Candy Guard权限。 | |
系统程序 |
系统程序账户。 | ||
freeze_ata |
✅ | 冻结PDA的关联令牌账户(种子 [freeze PDA pubkey, token program pubkey, nft mint pubkey] )。 |
|
token_mint |
代币铸造账户(必须与守卫配置中的 mint 地址匹配)。 |
||
token_program |
spl-token 程序ID。 |
||
关联代币程序 |
关联代币程序账户。 | ||
destination_ata |
✅ | 接收资金的地址(必须与守卫配置中的 destination_ata 地址匹配)。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeTokenPayment |
- data | 9 | |
-- ix | 1 | FreezeInstruction.Initialize |
-- period | 8 | 冻结期(以秒为单位,最长30天) |
thaw
:解冻符合条件的NFT。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination_ata pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
nft_mint |
NFT的铸造账户。 | ||
owner |
NFT所有者的地址。 | ||
nft_ata |
✅ | 关联NFT的令牌账户(种子 [owner pubkey, token program pubkey, nft mint pubkey] )。 |
|
nft_master_edition |
NFT主版账号。 | ||
token_program |
spl-token 程序ID。 |
||
系统程序 |
SystemProgram 账户。 |
||
以下是pNFT所需的账户 | |||
nft_metadata |
✅ | NFT的元数据账户。 | |
freeze_pda_ata |
✅ | NFT的冻结PDA关联的令牌账户。 | |
系统程序 |
系统程序。 | ||
sysvar_instructions |
Sysvar指令账户。 | ||
spl_ata_program |
SPL关联令牌账户程序。 | ||
owner_token_record |
✅ | 所有者令牌记录账户。 | |
freeze_pda_token_record |
✅ | 冻结PDA令牌记录账户。 | |
authorization_rules_program |
(可选) 令牌授权规则程序。 | ||
authorization_rules |
(可选) 令牌授权规则账号。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeTokenPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.Thaw |
unlock_funds
:解锁冻结的资金。
解锁资金仅在所有冻结的NFT解冻后启用。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination_ata pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | Candy Guard权限。 | |
freeze_ata |
✅ | 冻结PDA的关联令牌账户(种子 [freeze PDA pubkey, token program pubkey, nft mint pubkey] )。 |
|
destination_ata |
✅ | 接收资金的地址(必须与守卫配置中的 destination_ata 地址匹配)。 |
|
token_program |
spl-token 程序ID。 |
||
系统程序 |
SystemProgram 账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeTokenPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.UnlockFunds |
守卫者
pub struct Gatekeeper {
pub gatekeeper_network: Pubkey,
pub expire_on_use: bool,
}
Gatekeeper
守卫验证交易付款人是否拥有指定网关网络的 代币 —— 在大多数情况下,完成验证码挑战后的 代币。使用 expire_on_use
配置来指示代币在铸造后是否应该过期。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
gatekeeper_token_account |
✅ | 守卫者代币账户。 | |
gatekeeper_program |
守卫者程序账户。 | ||
network_expire_feature |
守卫者过期账户。 |
MintLimit
pub struct MintLimit {
pub id: u8,
pub limit: u16,
}
MintLimit
守卫允许为每个单独的地址指定铸造次数的限制。配置中的 id
代表限制的唯一标识符——更改 id
将重新启动限制,因为将创建一个新的跟踪账户。指示的 limit
表示允许的最大铸造次数。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
mint_count |
✅ | 铸造计数PDA。PDA使用种子 ["mint_limit", mint guard id, payer key, candy guard pubkey, candy machine pubkey] 计算得出 |
NftBurn
pub struct NftBurn {
pub required_collection: Pubkey,
}
NftBurn
守卫限制铸造仅限于其他NFT(代币)的持有者,要求在允许铸造的同时烧毁NFT。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
nft_account |
✅ | NFT的代币账户。 | |
nft_metadata |
✅ | NFT的元数据账户。 | |
nft_edition |
✅ | NFT主版账号。 | |
nft_mint_account |
✅ | NFT的铸造账户。 | |
nft_mint_collection_metadata |
✅ | NFT的收藏元数据账户。 | |
nft_token_record |
✅ | (可选) NFT(pNFT)的代币记录。 |
NftGate
pub struct NftGate {
pub required_collection: Pubkey,
}
NftGate
守卫限制铸造仅限于指定 required_collection
NFT收藏的持有者。付款人必须持有该收藏至少一个NFT。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
nft_account |
NFT的代币账户。 | ||
nft_metadata |
NFT的元数据账户。 |
NftPayment
pub struct NftPayment {
pub required_collection: Pubkey,
pub destination: Pubkey,
}
NftPayment
守卫是一种支付守卫,它为铸造从特定收藏中的另一个NFT(代币)收费。作为铸造的要求,指定的NFT将转移到 destination
地址。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
nft_account |
✅ | NFT的代币账户。 | |
nft_metadata |
✅ | NFT的元数据账户。 | |
nft_mint_account |
NFT的铸造账户。 | ||
destination |
接收NFT的账户。 | ||
destination_ata |
✅ | 目标PDA密钥(种子 [destination pubkey, token program id, nft_mint pubkey] )。 |
|
atoken_progam |
spl-associate-token 程序。 |
||
owner_token_record |
✅ | (可选) 所有者代币记录账户(pNFT)。 | |
destination_token_record |
✅ | (可选) 冻结PDA代币记录账户(pNFT)。 | |
authorization_rules_program |
(可选) 代币授权规则程序(pNFT)。 | ||
authorization_rules |
(可选) 代币授权规则账户(pNFT)。 |
ProgramGate
pub struct ProgramGate {
pub additional: Vec<Pubkey>,
}
ProgramGate
守卫限制 mint 交易中可以使用的程序。守卫允许 mint 所需的必要程序以及配置中指定的任何其他程序。
RedeemedAmount
pub struct RedeemedAmount {
pub maximum: u64,
}
RedeemedAmount
守卫在 Candy Machine 的 items_redeemed
数量达到配置的 maximum
数量时停止 mint。
SolPayment
pub struct SolPayment {
pub lamports: u64,
pub destination: Pubkey,
}
《SolPayment》守卫用于为铸造支付SOL(lamports)金额。资金将转移到配置的《destination》地址。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
destination |
✅ | 接收资金的地址。 |
StartDate
pub struct StartDate {
pub date: i64,
}
《StartDate》守卫确定铸造的开始日期。如果没有指定此守卫,则允许铸造——类似于说任何日期都有效。
ThirdPartySigner
pub struct ThirdPartySigner {
pub signer_key: Pubkey,
}
《ThirdPartySigner》守卫需要在交易中添加额外的签署者。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
signer_key |
✅ | 交易的签署者。 |
TokenBurn
pub struct TokenBurn {
pub amount: u64,
pub mint: Pubkey,
}
《TokenBurn》守卫将铸造限制为特定spl-token的持有者,并要求烧毁这些代币。《amount》确定需要多少代币。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
token_account |
✅ | 持有所需金额的代币账户。 | |
token_mint |
✅ | 代币铸造账户。 |
TokenGate
pub struct TokenGate {
pub amount: u64,
pub mint: Pubkey,
}
《TokenGate》守卫将铸造限制为特定spl-token的持有者。《amount》确定需要多少代币。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
token_account |
持有所需金额的代币账户。 |
TokenPayment
pub struct TokenPayment {
pub amount: u64,
pub token_mint: Pubkey,
pub destination_ata: Pubkey,
}
《TokenPayment》守卫将铸造限制为特定spl-token的持有者,并将所需金额转账到《destination_ata》地址。《amount》确定需要多少代币。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
token_account |
✅ | 持有所需金额的代币账户。 | |
destination_ata |
✅ | 接收代币的ATA地址。 |
依赖项
~28–39MB
~632K SLoC