15 个版本 (8 个稳定版)
3.0.0 | 2023年12月7日 |
---|---|
2.0.0 | 2023年8月12日 |
1.1.1 | 2023年6月27日 |
1.0.1 | 2023年3月20日 |
0.2.0 | 2022年10月28日 |
#925 in 神奇豆
每月下载 69 次
用于 sugar-cli
385KB
5.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 crate,可以使用以下方式序列化 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
:将铸币价格设为指定收藏的NFTProgramGate
:限制可以出现在铸币交易中的程序RedeemedAmount
:根据铸币总数确定铸币结束SolPayment
:设置铸币在SOL中的价格StartDate
:确定铸币的开始日期ThirdPartySigner
:交易需要额外的签署者TokenBurn
:限制铸币只对指定spl-token的持有者开放,要求烧毁代币TokenGate
:限制铸币只对指定spl-token的持有者开放TokenPayment
:设置铸币在spl-token数量中的价格
除了这些守卫之外,社区中的出色团队正在制作带有新酷检查的守卫程序。以下是一些创建守卫的团队
- Civic:Civic Pass Guard (集成文档)
账户
Candy Guard配置存储在单个账户中。有关启用守卫的信息存储在账户的“隐藏”部分,以避免不必要的反序列化。
字段 | 偏移 | 大小 | 描述 |
---|---|---|---|
— | 0 | 8 | 锚账户判别符。 |
基础 |
8 | 32 | PubKey 用于推导PDA密钥。种子由["candy_guard", base pubkey] 定义。 |
bump |
40 | 1 | u8 表示派生的bump。 |
权限 |
41 | 32 | PubKey 控制Candy Guard的权限地址。 |
隐藏部分 | 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 账户。 |
参数
参数 | 偏移 | 大小 | 描述 |
---|---|---|---|
数据 |
0 | ~ | 序列化的CandyGuardData 对象,作为[u8] 。 |
该指令使用自定义序列化来与之前版本的CandyGuardData
结构保持向后兼容。
📄 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公钥] )。 |
|
付款人 |
✅ | ✅ | 交易付款人。 |
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 账户。 |
||
剩余账户 | (可选)所需个别守卫的可选账户列表。 |
参数
参数 | 偏移 | 大小 | 描述 |
---|---|---|---|
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公钥] )。 |
|
付款人 |
✅ | ✅ | 交易付款人。 |
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 sysvar集群数据。 | ||
authorization_rules_program |
(可选)令牌授权规则程序。 | ||
authorization_rules |
(可选)令牌授权规则账户。 | ||
剩余账户 | (可选)所需个别守卫的可选账户列表。 |
参数
参数 | 偏移 | 大小 | 描述 |
---|---|---|---|
mint_args |
0 | ~ | [u8] 表示守卫的参数;如果没有参数,则为空的[u8] 。 |
label |
~ | 6 | (可选)表示用于守卫验证的组标签的string 。 |
📄 route
此指令将交易路由到守卫,允许执行自定义守卫指令。交易可以包含守卫指令所需的任何其他账户。将接收交易以及任何其他参数的守卫和任何其他参数在RouteArgs
结构中指定。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账户PDA密钥。 |
||
candy_machine |
✅ | CandyMachine 账户。 |
|
付款人 |
✅ | ✅ | 交易付款人。 |
剩余账户 | (可选)守卫指令所需的可选账户列表。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体。 |
|
- guard | 1 | 枚举值 GuardType |
- data | ~ | [u8] 表示指令的参数;如果没有参数,则为空的 [u8] 。 |
label |
6 | (可选) 表示用于检索守卫集的组标签的字符串。 |
📄 unwrap
此指令从糖果机中移除糖果守卫,将糖果机的铸造权限设置为糖果机权限。为了使此指令成功,糖果守卫的公钥必须与糖果机 mint_authority
匹配。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账户PDA密钥。 |
||
权限 |
✅ | 糖果守卫权限的公钥。 | |
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority |
✅ | 糖果机权限的公钥。 | |
candy_machine_program |
CandyMachine 程序ID。 |
参数
None。
📄 update
此指令更新糖果守卫配置。由于存在可灵活调整数量的守卫和组,此指令将相应地调整账户大小,要么增加要么减少账户大小。因此,将收取租金费用或退还租金兰波特。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
candy_guard |
✅ | CandyGuard 账户PDA密钥。 |
|
权限 |
糖果守卫权限的公钥。 | ||
付款人 |
✅ | 交易付款人。 | |
系统程序 |
SystemProgram 账户。 |
参数
参数 | 偏移 | 大小 | 描述 |
---|---|---|---|
数据 |
0 | ~ | 序列化的CandyGuardData 对象,作为[u8] 。 |
该指令使用自定义序列化来与之前版本的CandyGuardData
结构保持向后兼容。
📄 withdraw
此指令从账户中提取租金兰波特并关闭它。执行此指令后,糖果守卫账户将无法运行。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
candy_guard |
✅ | 糖果守卫账户。 | |
权限 |
✅ | ✅ | 糖果守卫权限的公钥。 |
参数
None。
📄 wrap
此指令向糖果机添加糖果守卫。在守卫添加后,只有通过糖果守卫才能进行铸造。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账户PDA密钥。 |
||
权限 |
✅ | 糖果守卫权限的公钥。 | |
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority |
✅ | 糖果机权限的公钥。 | |
candy_machine_program |
CandyMachine 程序ID。 |
参数
None。
守卫
AddressGate
pub struct AddressGate {
address: Pubkey,
}
AddressGate
守卫将铸造限制为单个 address
— 地址必须与铸造事务的付款人地址匹配。
分配
pub struct Allocation {
pub id: u8,
pub size: u16,
}
Allocation
守卫指定组(守卫集)中允许的铸造最大数量。配置中的 id
代表分配的唯一标识符——更改 id
的效果是重新启动限制,因为将创建不同的跟踪账户。大小表示分配的最大铸造数量。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
mint_tracker |
✅ | 铸造跟踪 PDA。PDA 是通过种子 ["allocation", allocation id, candy guard pubkey, candy machine pubkey] 推导出来的。 |
路由指令
在验证第一次铸造事务之前需要创建分配 PDA。这是通过具有以下账户和 RouteArgs
的 route
指令完成的
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
proof_pda |
✅ | 表示分配的 PDA(种子 ["allocation", allocation id, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | Candy Guard authority | |
系统程序 |
系统程序账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.分配 |
- data | 0 | 空 |
AllowList
pub struct AllowList {
pub merkle_root: [u8; 32],
}
AllowList
守卫通过基于 Merkle 树的地址允许列表验证付款人地址。它需要 Merkle 树的根作为配置,铸造事务必须包含 Merkle 证明的 PDA。如果没有指定证明,则事务将失败。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
proof_pda |
默克尔证明的PDA(种子 ["allow_list", merkle树根,铸造者密钥,糖果守护者公钥,糖果机器公钥] )。 |
路由指令
在铸造交易之前需要完成默克尔证明的验证。这是通过具有以下账户和RouteArgs
的route
指令完成的。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
proof_pda |
✅ | 代表默克尔证明的PDA(种子 ["allow_list", merkle树根,付款者/铸造者密钥,糖果守护者公钥,糖果机器公钥] )。 |
|
系统程序 |
系统程序账户。 | ||
minter |
(可选)用于验证的铸造者账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.AllowList |
- data | ~ | 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", 目标公钥, 糖果守护者公钥, 糖果机器公钥] )。 |
|
nft_ata |
NFT的关联代币账户(种子 [付款者公钥, 代币程序公钥, NFT铸造公钥] )。 |
||
rule_set |
(可选)铸造的pNFT的授权规则集。 |
路由指令
initialize
:初始化冻结担保PDA。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", 目标公钥, 糖果守护者公钥, 糖果机器公钥] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
系统程序 |
系统程序账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeSolPayment |
- data | ~ | |
-- ix | 1 | FreezeInstruction.Initialize |
-- period | 8 | 冻结期(以秒为单位,最大30天) |
thaw
:解冻符合条件的NFT。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", 目标公钥, 糖果守护者公钥, 糖果机器公钥] )。 |
|
nft_mint |
NFT的铸造账户。 | ||
owner |
NFT所有者的地址。 | ||
nft_ata |
✅ | NFT的关联代币账户(种子 [所有者公钥, 代币程序公钥, NFT铸造公钥] )。 |
|
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 |
(可选)令牌授权规则账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeSolPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.Thaw |
unlock_funds
:解锁冻结的资金。
解锁资金仅在所有冻结的NFT解冻后启用。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", 目标公钥, 糖果守护者公钥, 糖果机器公钥] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
目标 |
✅ | 接收资金的地址(必须与守卫配置中的destination 地址匹配)。 |
|
系统程序 |
SystemProgram 账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.FreezeSolPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.解锁资金 |
冻结代币支付
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的关联代币账户(种子 [付款者公钥, 代币程序公钥, NFT铸造公钥] )。 |
||
代币账户 |
✅ | 持有所需金额的代币账户(种子 [payer pubkey, token program pubkey, mint pubkey] )。 |
|
冻结_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] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
系统程序 |
系统程序账户。 | ||
冻结_ata |
✅ | 冻结PDA的关联代币账户(种子 [freeze PDA pubkey, token program pubkey, nft mint pubkey] )。 |
|
代币铸造 |
代币铸造账户(必须与守卫配置中的mint 地址匹配)。 |
||
token_program |
spl-token 程序ID。 |
||
关联代币程序 |
关联代币程序账户。 | ||
目标_ata |
✅ | 接收资金的地址(必须与守卫配置中的destination_ata 地址匹配)。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.冻结代币支付 |
- 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的关联代币账户(种子 [所有者公钥, 代币程序公钥, NFT铸造公钥] )。 |
|
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 |
(可选)令牌授权规则账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.冻结代币支付 |
- data | 1 | |
-- ix | 1 | FreezeInstruction.Thaw |
unlock_funds
:解锁冻结的资金。
解锁资金仅在所有冻结的NFT解冻后启用。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结PDA(种子 ["freeze_escrow", destination_ata pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
冻结_ata |
✅ | 冻结PDA的关联代币账户(种子 [freeze PDA pubkey, token program pubkey, nft mint pubkey] )。 |
|
目标_ata |
✅ | 接收资金的地址(必须与守卫配置中的destination_ata 地址匹配)。 |
|
token_program |
spl-token 程序ID。 |
||
系统程序 |
SystemProgram 账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
参数 |
RouteArgs 结构体 |
|
- guard | 1 | GuardType.冻结代币支付 |
- data | 1 | |
-- ix | 1 | FreezeInstruction.解锁资金 |
守卫者
pub struct Gatekeeper {
pub gatekeeper_network: Pubkey,
pub expire_on_use: bool,
}
Gatekeeper
守卫验证交易付款人是否拥有来自指定网关网络的代币——在大多数情况下,在完成验证码挑战后获得的代币。使用expire_on_use
配置来指示代币在铸造后是否应该过期。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
守卫者代币账户 |
✅ | 守卫者代币账户。 | |
守卫者程序账户。 |
网络过期功能 | ||
守卫者过期账户。 |
MintLimit |
MintLimit
守卫允许为每个地址指定铸造数量的限制。配置中的id
表示限制的唯一标识符——更改id
的效果是重新启动限制,因为将创建不同的跟踪账户。指示的limit
表示允许的最大铸造数量。
MintLimit
守卫允许为每个地址指定铸造数量的限制。配置中的id
表示限制的唯一标识符——更改id
的效果是重新启动限制,因为将创建不同的跟踪账户。指示的limit
表示允许的最大铸造数量。pub struct MintLimit {
pub id: u8,
pub limit: u16,
}
铸造计数
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
铸造计数PDA。PDA使用种子 |
✅ | NftBurn |
NftBurn
守卫限制铸造仅限于其他NFT(代币)的持有者,要求在允许铸造时烧毁NFT。
NftBurn
守卫限制铸造仅限于其他NFT(代币)的持有者,要求在允许铸造时烧毁NFT。pub struct NftBurn {
pub required_collection: Pubkey,
}
nft_account
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
NFT的代币账户。 |
✅ | nft_edition | |
nft_metadata |
✅ | NFT的元数据账户。 | |
nft_mint_account |
✅ | NFT的主版账户。 | |
Mint账户的NFT。 |
✅ | 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的代币账户。 |
nft_edition | ||
nft_metadata |
NFT的元数据账户。 |
NftPayment
pub struct NftPayment {
pub required_collection: Pubkey,
pub destination: Pubkey,
}
NftPayment
守卫是一种支付守卫,它从特定集合中收取另一个NFT(代币)的费用以进行铸造。作为铸造的要求,指定的NFT将转移到destination
地址。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
NFT的代币账户。 |
✅ | nft_edition | |
nft_metadata |
✅ | NFT的元数据账户。 | |
Mint账户的NFT。 |
NFT的铸造账户。 | ||
目标 |
接收NFT的账户。 | ||
目标_ata |
✅ | 目标PDA密钥(种子 [目标公钥, 令牌程序ID, nft_mint公钥] )。 |
|
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>,
}
《code>ProgramGate 保护器限制了可以在铸造交易中存在的程序。保护器允许铸造所需的程序以及配置中指定的任何其他程序。
RedeemedAmount
pub struct RedeemedAmount {
pub maximum: u64,
}
《code>RedeemedAmount 保护器在Candy Machine的《code>items_redeemed数量达到配置的《code>maximum数量时停止铸造。
SolPayment
pub struct SolPayment {
pub lamports: u64,
pub destination: Pubkey,
}
《code>SolPayment 保护器用于对铸造收取一定数量的SOL(lamports)。资金将转移到配置的《code>destination地址。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
目标 |
✅ | 接收资金的地址。 |
StartDate
pub struct StartDate {
pub date: i64,
}
《code>StartDate 保护器确定铸造的开始日期。如果没有指定此保护器,则允许铸造——类似于说任何日期都有效。
ThirdPartySigner
pub struct ThirdPartySigner {
pub signer_key: Pubkey,
}
《code>ThirdPartySigner 保护器需要在交易中添加额外的签名者。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
signer_key |
✅ | 交易签名者。 |
TokenBurn
pub struct TokenBurn {
pub amount: u64,
pub mint: Pubkey,
}
《code>TokenBurn 限制了铸造只能由指定的spl-token持有者进行,并要求烧毁这些令牌。《code>amount 决定了需要多少令牌。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
代币账户 |
✅ | 持有所需数量的令牌账户。 | |
代币铸造 |
✅ | 令牌铸造账户。 |
TokenGate
pub struct TokenGate {
pub amount: u64,
pub mint: Pubkey,
}
《code>TokenGate 限制了铸造只能由指定的spl-token持有者进行。《code>amount 决定了需要多少令牌。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
代币账户 |
持有所需数量的令牌账户。 |
TokenPayment
pub struct TokenPayment {
pub amount: u64,
pub token_mint: Pubkey,
pub destination_ata: Pubkey,
}
《code>TokenPayment 限制了铸造只能由指定的spl-token持有者进行,并将所需数量转移到《code>destination_ata地址。《code>amount 决定了需要多少令牌。
账户
名称 | 可写 | 签署者 | 描述 |
---|---|---|---|
代币账户 |
✅ | 持有所需数量的令牌账户。 | |
目标_ata |
✅ | 接收令牌的ATA地址。 |
依赖关系
~40MB
~678K SLoC