1 个不稳定发布
0.1.0 | 2022年11月1日 |
---|
#47 in #pack
215KB
4.5K SLoC
Metaplex NFT packs Solana程序
支持创建在“打开”后才揭晓的“神秘”NFT包装,类似于你在商店购买棒球卡包装时的体验。
NFT packs操作
- 管理员初始化包装
- 包装账户是包含种子[“nft-pack”,nft_pack_program_id,store,pack_admin_key,pack_name]的PDA
- 存储地址保存在包装中
- 设置分发类型(max_supply,weighted,unlimited)
- 设置可兑换的金额
- 设置是否可变
- 设置日期(兑换开始和结束)
- 添加卡片
- 添加卡片意味着我们将MasterEdition转移到程序账户,这样我们就能在用户打开包装时铸造版次
- 每个卡片账户都是包含种子[pack_key,"card",index]的PDA
- 添加代金券
- 保存MasterEdition数据(键)以便我们在用户打开包装时将版次与这个Master版次匹配
- 包装可以有多种不同的代金券,并且每个代金券都有相同的价值,并为用户提供相同数量的卡片
- 代金券在Metaplex中是指版次,但在nft-packs程序中是指包含一些数据的种子[pack_key,"voucher",index]的PDA账户
- 我们只能添加我们拥有的代金券
- 总之,当我们向包装中添加代金券时,我们将MasterEdition密钥保存在包装中,并且每个拥有该MasterEdition版次的用户都拥有一个创建的包装的代金券,可以打开它
- 激活
- 在激活状态下,管理员不能更改任何包装数据
- 用户可以开始打开包装(使用
RequestCardForRedeem
和ClaimPack
方法)
- 停用
- 当包装被停用时,用户不能与之交互,管理员可以更改数据
- 清理
- 对存储在PackConfig账户中的权重Vec进行排序
- 请求兑换卡片
- 用户调用此指令以接收他可以兑换的卡片索引
- 程序燃烧用户的代金券令牌账户
- 程序使用槽位哈希、时间戳和最近的时间戳哈希来计算概率,以决定用户将获得哪张卡片
- 概率是使用PackConfig账户中的加权列表计算的
- 下一次兑换卡片索引写入到证明过程账户
- 证明过程是一个具有种子[pack, "proving", voucher_mint_key]的PDA账户
- 一旦用户调用此指令,Vec应该使用
CleanUp
指令进行排序
- 索赔
- 用户在从
Request card for redeem
收到卡片索引后调用此指令 - 程序将新版本铸造到用户钱包
- 用户在从
- 编辑包装
- 只有在包装处于非激活状态下才能调用
- 允许更改包装
name
、description
、URI
(包装壁纸)和mutable
字段
- 关闭包装
- 如果包装没有兑换结束日期,或者只有在兑换结束日期之后,可以随时调用
- 如果管理员在兑换结束日期之前尝试调用此指令,程序将返回
EndDateNotArrived
错误 - 不可逆的包装状态更改
- 删除卡片
- 只有当包装处于关闭状态时才能删除卡片
- 删除卡片意味着将MasterEdition转回管理员,清零PackCard账户并清空卡片余额
- 删除凭证
- 只有在包装处于关闭状态下才能删除凭证
- 清空余额
- 删除包装
- 只有当所有卡片和凭证都被删除时才能删除包装
- 清空余额
账户
包装集
参数 | 类型 | 描述 |
---|---|---|
存储 | 公钥 | 存储 |
名称 | [u8; 32] | 包装名称 |
描述 | 字符串 | 包装描述 |
img_link | 字符串(限制为200) | Arweave封面图像链接 |
权限 | 公钥 | 包装权限 |
pack_cards | u32 | 卡片主计数器 |
pack_vouchers | u32 | 包装凭证计数器 |
total_weight | u64 | 总权重 |
total_editions | u64 | 包装可以铸造的版本总数 |
可变 | bool | 如果为真,权限可以在非激活阶段进行更改 |
pack_state | 枚举 | [未激活,激活,非激活,结束] |
发行类型 | 枚举 | [最大供应量,加权,无限] |
允许兑换的金额 | u32 | 用户可以尝试兑换的卡片数量 |
兑换开始日期 | u64 | 用户可以开始兑换卡片的日期 |
兑换结束日期 | Option(u64) | 包装集无效的日期 |
包装卡
PDA与种子['card', pack_key, index]
参数 | 类型 | 描述 |
---|---|---|
包装集 | 公钥 | 包装密钥 |
主 | 公钥 | 主版式账户 |
元数据 | 公钥 | 元数据账户 |
token_account | 公钥 | 程序令牌账户,持有主版式令牌 |
最大供应量 | u32 | 这张卡片可以铸造多少版 |
重量 | u16 | 卡片重量。用于固定和无限发行类型的概率计算 |
包装凭证
PDA与种子['voucher', pack_key, index]
参数 | 类型 | 描述 |
---|---|---|
包装集 | 公钥 | 包装集密钥 |
主 | 公钥 | 主版式账户 |
元数据 | 公钥 | 元数据账户 |
证明过程
PDA与种子['proving', pack_key, voucher_edition_mint]
参数 | 类型 | 描述 |
---|---|---|
钱包密钥 | 公钥 | 用户钱包密钥 |
is_exhausted | bool | 凭证中是否还有卡片 |
包装集 | 公钥 | 包装集密钥 |
voucher_mint | 公钥 | 凭证铸造 |
已兑换卡片 | u32 | 用户已经兑换的卡片数量 |
待兑换卡片 | BTreeMap(u32, u32) | BTreeMap,包含待兑换的卡片和已兑换的状态 |
包装配置
PDA与种子['config', pack_key]
参数 | 类型 | 描述 |
---|---|---|
重量 | Vec<(u32, u32, u32)> | 权重Vec(u32卡片索引,u32最大供应量或重量,u32加权卡的最大供应量) |
操作要执行 | 枚举[更改,排序,无] | CleanUp 指令需要执行的操作 |
发行类型
-
无限
概率由用户设置,为每张卡分配权重(揭示机会)。
供应量——无限(卡片永不耗尽),用户不能选择包装中每张卡的数量。
可以用于包装中的无限版卡片。
-
加权
概率由用户设置,为每张卡分配权重(揭示机会)。
供应量——有限,用户可以选择包装中每张卡的数量。
包装中可以使用有限和无限版(用户需要为无限版设置最大供应量)的卡片。
-
供应量
概率根据每张卡的供应量自动设置。
供应量——有限,用户可以选择包装中每张卡的数量。
包装中可以使用有限和无限版(用户需要为无限版设置最大供应量)的卡片。
依赖关系
~27–38MB
~655K SLoC