1 个不稳定发布

0.1.0 2022年11月1日

#47 in #pack

自定义许可AGPL-3.0

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版次的用户都拥有一个创建的包装的代金券,可以打开它
  • 激活
    • 在激活状态下,管理员不能更改任何包装数据
    • 用户可以开始打开包装(使用RequestCardForRedeemClaimPack方法)
  • 停用
    • 当包装被停用时,用户不能与之交互,管理员可以更改数据
  • 清理
    • 对存储在PackConfig账户中的权重Vec进行排序
  • 请求兑换卡片
    • 用户调用此指令以接收他可以兑换的卡片索引
    • 程序燃烧用户的代金券令牌账户
    • 程序使用槽位哈希、时间戳和最近的时间戳哈希来计算概率,以决定用户将获得哪张卡片
    • 概率是使用PackConfig账户中的加权列表计算的
    • 下一次兑换卡片索引写入到证明过程账户
    • 证明过程是一个具有种子[pack, "proving", voucher_mint_key]的PDA账户
    • 一旦用户调用此指令,Vec应该使用CleanUp指令进行排序
  • 索赔
    • 用户在从Request card for redeem收到卡片索引后调用此指令
    • 程序将新版本铸造到用户钱包
  • 编辑包装
    • 只有在包装处于非激活状态下才能调用
    • 允许更改包装namedescriptionURI(包装壁纸)和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