1 个不稳定版本
0.2.1 | 2024年4月18日 |
---|
#4 in #candy
330KB
4.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 完成。
程序如何工作?
糖果守护者程序的主要目的是保存薄荷 守护者 的配置,并在用户从糖果机中铸造之前应用它们。如果所有启用的守护者条件都有效,铸造交易将被转发到糖果机。
当收到铸造交易时,程序执行以下步骤
- 验证交易是否符合所有启用的守护者。
- 如果在此点失败任何守护者,交易将受到
BotTax
(当BotTax
守护者启用时)的影响,并且交易将被终止。
- 如果在此点失败任何守护者,交易将受到
- 在评估所有守护者都有效后,它将在每个守护者上调用
pre_actions
函数。此函数负责执行任何在铸造 之前 的操作(例如,收取铸造费用)。 - 然后,将交易转发到糖果机程序进行 NFT 铸造。
- 最后,它将在每个启用的守护者上调用
post_actions
函数。此函数负责执行任何在铸造 之后 的操作(例如,冻结 NFT,更改更新权限)。
守护者 是一个模块化代码片段,可以轻松添加到糖果守护者程序中,为支持特定功能提供极大的灵活性和简单性,而无需直接修改糖果机程序。通过遵循特定的接口支持添加新的守护者,更改被隔离到单个守护者中——例如,每个守护者可以独立创建和修改。这种架构还提供了灵活性,可以在不要求代码更改的情况下启用/禁用守护者,因为每个守护者都有一个启用/禁用“开关”。
糖果守护者程序包含一组可启用/禁用的核心访问控制守护者
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 守护者(《集成文档》)
账户
糖果守护者配置存储在一个单独的账户中。有关已启用守护者的信息存储在账户的“隐藏”部分,以避免不必要的反序列化。
字段 | 偏移量 | 大小 | 描述 |
---|---|---|---|
— | 0 | 8 | 锚账户区分符。 |
基础 |
8 | 32 | PubKey 用于推导PDA密钥。种子由["candy_guard", base pubkey] 定义。 |
bump |
40 | 1 | u8 表示推导的bump。 |
权限 |
41 | 32 | PubKey 控制糖果守护者的权限地址。 |
隐藏部分 | 73 | ~ | 隐藏数据部分以避免不必要的反序列化。该账户部分用于序列化守护者数据。 |
- 功能 | 73 | 8 | 指示哪些守护者被序列化的功能标志。 |
- 守护者集合 | 81 | ~ | (可选) 一系列序列化的守护者结构。 |
- 组计数器 | ~ | 4 | u32 指定使用的组数。 |
- 组 | ~ | ~ | (可选) 一系列表示不同守护者集合的Group 结构。每个组由以下内容定义: |
-- 标签 | ~ | 6 | 组的标签。 |
-- 功能 | ~ | 8 | 指示为该组序列化的哪些守护者的功能标志。 |
-- 守护者集合 | ~ | ~ | (可选) 一系列序列化的守护者结构。 |
由于启用的守护者和组数是可变的,所以账户大小在update
指令期间动态调整,以适应更新的配置。
指令
📄 initialize
此指令创建并初始化一个新的CandyGuard
账户。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
✅ | CandyGuard 账户PDA密钥。PDA是通过种子["candy_guard", base pubkey] 推导出来的。 |
|
基础 |
✅ | 用于PDA推导的基本公钥。 | |
权限 |
糖果守护者权限的公钥。 | ||
付款人 |
✅ | 交易付款人。 | |
系统程序 |
SystemProgram 账户。 |
参数
参数 | 偏移量 | 大小 | 描述 |
---|---|---|---|
数据 |
0 | ~ | 序列化的CandyGuardData 对象,作为[u8] 。 |
该指令使用自定义序列化以保持与先前版本的CandyGuardData
结构的向后兼容性。
📄 mint
(已弃用)
此指令从由糖果守护者“包装”的糖果机中铸造NFT。只有当交易成功验证后,它才会转发到糖果机。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
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 |
收藏的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 |
收藏的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 Gard 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。 |
参数
None。
📄 update
此指令更新Candy Guard配置。由于存在灵活数量的守卫和组可以存在,此指令将相应地调整账户大小,要么增加要么减少账户大小。因此,将会有租金费用或租金lamports的提款。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
✅ | CandyGuard 账户PDA密钥。 |
|
权限 |
Candy Guard 权限的公钥。 | ||
付款人 |
✅ | 交易付款人。 | |
系统程序 |
SystemProgram 账户。 |
参数
参数 | 偏移量 | 大小 | 描述 |
---|---|---|---|
数据 |
0 | ~ | 序列化的CandyGuardData 对象,作为[u8] 。 |
该指令使用自定义序列化以保持与先前版本的CandyGuardData
结构的向后兼容性。
📄 withdraw
此指令从账户中提款租金lamports并关闭它。执行此指令后,Candy Guard账户将不再运行。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
✅ | Candy Guard 账户。 | |
权限 |
✅ | ✅ | Candy Guard 权限的公钥。 |
参数
None。
📄 wrap
本指令为糖果机添加糖果守护者。添加守护者后,只有通过糖果守护者才能进行铸币。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
candy_guard |
CandyGuard 账户PDA密钥。 |
||
权限 |
✅ | Candy Guard 权限的公钥。 | |
candy_machine |
✅ | CandyMachine 账户。 |
|
candy_machine_authority |
✅ | Candy Machine 权限的公钥。 | |
candy_machine_program |
CandyMachine 程序ID。 |
参数
None。
守护者
地址门
pub struct AddressGate {
address: Pubkey,
}
AddressGate
守护者将铸币限制为单个 address
— 该地址必须与铸币事务的付款人地址匹配。
分配
pub struct Allocation {
pub id: u8,
pub size: u16,
}
Allocation
守护者指定一组(守护者集)中允许的最大铸币数量。 id
配置代表分配的唯一标识 — 更改 id
会重置限制,因为将创建不同的跟踪账户。 size
指示分配的最多铸币数量。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
铸币追踪器 |
✅ | 铸币追踪器 PDA。PDA 通过种子 ["allocation", allocation id, candy guard 公钥, candy machine 公钥] 生成。 |
路由指令
在验证第一个铸币事务之前,需要创建分配 PDA。这通过具有以下账户和 RouteArgs
的 route
指令来完成。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
证明 PDA |
✅ | 代表分配的 PDA(种子 ["allocation", allocation id, candy guard 公钥, candy machine 公钥] )。 |
|
权限 |
✅ | 糖果守护者权限 | |
系统程序 |
系统程序账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | 守护者类型.分配 |
- data | 0 | 空 |
允许列表
pub struct AllowList {
pub merkle_root: [u8; 32],
}
AllowList
守护者通过基于 Merkle 树的地址允许列表验证付款人地址。它需要一个 Merkle 树的根作为配置,并且铸币事务必须包含 Merkle 证明的 PDA。如果没有指定证明,事务将失败。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
证明 PDA |
Merkle 证明的 PDA(种子 ["allow_list", Merkle 树根, 铸币者密钥, candy guard 公钥, candy machine 公钥] )。 |
路由指令
必须在铸币事务之前完成 Merkle 证明验证。这通过以下账户和 RouteArgs
的 route
指令来完成。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
证明 PDA |
✅ | 代表 Merkle 证明的 PDA(种子 ["allow_list", Merkle 树根, 付款人/铸币者密钥, candy guard 公钥, candy machine 公钥] )。 |
|
系统程序 |
系统程序账户。 | ||
minter |
(可选)要验证的铸币者账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | 守护者类型.允许列表 |
- data | ~ | Merkle 证明哈希值的 Vec 。 |
机器人税
pub struct BotTax {
pub lamports: u64,
pub last_instruction: bool,
}
BotTax
守护者用于
- 对无效交易征收罚款。罚款金额由
lamports
配置指定。 - 验证铸币事务是最后一个交易(
last_instruction = true
)。
当验证守护者时发生的任何错误都将应用 bot_tax
。
结束日期
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] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
系统程序 |
系统程序账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | 守护者类型.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 | 守护者类型.FreezeSolPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.Thaw |
unlock_funds
:解锁冻结资金。
只有当所有冻结的 NFT 都解冻后,才能启用解锁资金。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结 PDA(种子 ["freeze_escrow", destination pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
destination |
✅ | 接收资金的地址(必须与守卫配置中的 destination 地址匹配)。 |
|
系统程序 |
SystemProgram 账户。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | 守护者类型.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] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
系统程序 |
系统程序账户。 | ||
freeze_ata |
✅ | 冻结 PDA 的关联代币账户(种子 [freeze PDA pubkey, token program pubkey, nft mint pubkey] )。 |
|
token_mint |
代币铸币账户(必须与守卫配置中的 mint 地址匹配)。 |
||
token_program |
spl-token 程序ID。 |
||
associate_token_program |
关联代币程序账户。 | ||
destination_ata |
✅ | 接收资金的地址(必须与守卫配置中的 destination_ata 地址匹配)。 |
参数
参数 | 大小 | 描述 |
---|---|---|
args |
RouteArgs 结构体 |
|
- guard | 1 | 守护者类型.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 | 守护者类型.FreezeTokenPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.Thaw |
unlock_funds
:解锁冻结资金。
只有当所有冻结的 NFT 都解冻后,才能启用解锁资金。
账户
名称 | 可写 | 签名者 | 描述 |
---|---|---|---|
freeze_pda |
✅ | 接收资金的冻结 PDA(种子 ["freeze_escrow", destination_ata pubkey, candy guard pubkey, candy machine pubkey] )。 |
|
权限 |
✅ | 糖果守护者权限。 | |
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 | 守护者类型.FreezeTokenPayment |
- data | 1 | |
-- ix | 1 | FreezeInstruction.UnlockFunds |
门卫
pub struct Gatekeeper {
pub gatekeeper_network: Pubkey,
pub expire_on_use: bool,
}
门卫守卫验证交易付款人是否具有指定网关网络(通常是完成验证码挑战后的 令牌)。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
守卫限制可以出现在铸造交易中的程序。守卫允许铸造所需的程序以及配置中指定的任何其他程序。
RedeemedAmount
pub struct RedeemedAmount {
pub maximum: u64,
}
RedeemedAmount
守卫在 Candy Machine 的 items_redeemed
数量达到配置的 maximum
数量时停止铸造。
SolPayment
pub struct SolPayment {
pub lamports: u64,
pub destination: Pubkey,
}
SolPayment
守卫用于对铸造收取 SOL(拉姆波特)金额。资金被转移到配置的 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 地址。 |
依赖项
~41MB
~701K SLoC