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 神奇豆

Download history 7/week @ 2024-04-22 7/week @ 2024-04-29 16/week @ 2024-05-06 11/week @ 2024-05-13 96/week @ 2024-05-20 22/week @ 2024-05-27 19/week @ 2024-06-03 11/week @ 2024-06-10 22/week @ 2024-06-17 16/week @ 2024-06-24 5/week @ 2024-07-08 23/week @ 2024-07-15 13/week @ 2024-07-22 13/week @ 2024-07-29 19/week @ 2024-08-05

每月下载 69
用于 sugar-cli

自定义许可证

385KB
5.5K SLoC

Metaplex Candy Guard


💡 更新

从Candy Guard v0.2.0开始,initializeupdate 指令的参数序列化逻辑期望一个表示自定义序列化结构的 [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 CoreCandy Machine V3)账户结合使用。当Candy Guard与Candy Machine结合使用时,它成为其铸币权限,铸币只能通过Candy Guard进行。

程序是如何工作的?

image

Candy Guard程序的主要目的是在用户从糖果机铸币之前,持有铸币守卫的配置并应用它们。如果所有启用的守卫条件都有效,铸币交易将被转发到Candy Machine。

当接收到铸币交易时,程序执行以下步骤

  1. 验证交易与所有启用的守卫。
    • 如果此时有任何守卫失败,交易将受到BotTax(当启用了BotTax守卫时)的影响,并且交易将被终止。
  2. 在评估所有守卫都有效后,它对每个守卫调用pre_actions函数。此函数负责执行铸币前的任何操作(例如,收取铸币费用)。
  3. 然后,将交易转发到Candy Machine程序以铸造NFT。
  4. 最后,它对每个启用的守卫调用post_actions函数。此函数负责执行铸币后的任何操作(例如,冻结NFT,更改更新权限)。

守卫是一块模块化代码,可以轻松添加到Candy Guard程序中,提供极大的灵活性和简单性,以支持特定功能而无需直接修改Candy Machine程序。通过符合特定接口支持添加新守卫,更改被隔离到单个守卫——例如,每个守卫可以独立创建和修改。这种架构还提供了灵活性,无需代码更改即可启用/禁用守卫,因为每个守卫都有一个启用/禁用“开关”。

Candy Guard程序包含一组可启用/禁用的核心访问控制守卫

  • AddressGate:限制铸币仅对单个地址
  • Allocation:指定组(守卫集)中的最大铸币数量
  • AllowList:使用钱包地址列表确定谁允许铸币
  • BotTax:对无效交易可配置的税费(金额)
  • EndDate:确定铸币结束的日期
  • FreezeSolPayment:以SOL价格设置铸币并带有冻结期
  • FreezeTokenPayment:以spl-token金额设置铸币价格并带有冻结期
  • Gatekeeper:验证码集成
  • MintLimit:指定每个钱包的铸币数量限制
  • NftBurn:限制铸币为特定收藏的持有者,需要销毁NFT
  • NftGate:限制铸币为特定收藏的持有者
  • 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表示派生的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。这是通过具有以下账户和 RouteArgsroute 指令完成的

账户
名称 可写 签署者 描述
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树根,铸造者密钥,糖果守护者公钥,糖果机器公钥])。

路由指令

在铸造交易之前需要完成默克尔证明的验证。这是通过具有以下账户和RouteArgsroute指令完成的。

账户
名称 可写 签署者 描述
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表示允许的最大铸造数量。

pub struct MintLimit {
    pub id: u8,
    pub limit: u16,
}

铸造计数

账户
名称 可写 签署者 描述
铸造计数PDA。PDA使用种子 ["mint_limit", mint guard id, payer key, candy guard pubkey, candy machine pubkey] 派生。 NftBurn

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