FairLaunchCell|基于 CKB 的公平发射平台

基于countdowncell延伸出来的,原文可看

项目简介

FairLaunchCell 是一个基于 Nervos CKB 的「公平发射」平台:创建者将 xUDT 配置并铸造到 Fair Launch Lock,在设定的延时周期内持续按区块分发;当延时结束后,开启 Swap(常数乘积池),用户即可在固定池中按 k = x * y 的规则与 CKB 进行兑换。

前端基于 Next.js + TailwindCSS;钱包连接与交易构建使用 @ckb-ccc/connector-react

核心概念

  • xUDT 代币:包含 symboldecimals(当前固定为 8),用于展示与换算。

  • 一次性密封(Single‑Use‑Seals,SUS):用于实现总量不可增发的机制,参考:https://talk.nervos.org/t/en-cn-misc-single-use-seals/8279

  • 发射结束区块(endBlock):到达后延时分发结束,Swap 开启。

  • 每块铸币(mintPerBlock):延时期间,每区块分发的 xUDT(展示单位,按 decimals 转为原子单位)。

  • 池最低余额(minPoolXudt):为常数乘积池预留的 xUDT 最小余额(展示单位)。

  • 常数乘积池(k = x * y):价格随池内 xUDT 与 CKB 的相对数量动态变化。

流程与规则

  • 创建:在「创建」页配置 xUDT 基本信息(symbolnamedecimals 当前固定为 8),设置 mintPerBlockminPoolXudt,并准备初始资金。

  • 延时分发(未到期):当用户追加 CKB 延长 endBlock 时,按「延长的区块数 × mintPerBlock」实时分发对应数量的 xUDT 到该用户地址(展示单位,按 decimals 换算)。

  • 开启兑换(到期后):到达 endBlock 即开启 Swap,采用常数乘积池 k = x * y 进行 xUDT ↔ CKB 的兑换。

  • 费用:交易需满足矿池费率要求(足够的手续费),平台不收取额外手续费。

合约与实现要点(摘要)

  • Fair Launch Cell 通过 lock type 脚本约束状态过渡(创建、延时分发、到期开启 Swap )。

  • 不可增发:结合一次性密封(SUS),实现不可增发控制。

交易流程示意

  • 创建(Fair Launch 配置与初始资金):
    Inputs: 用户普通 Cell →Outputs: FairLaunch Cell(lock=fair_launch locktype=xudtdata=xudt amount)。

  • 延时追加并分发 xUDT(未到期):

    Inputs: FairLaunch Cell + 付款人普通 Cell →Outputs: 更新后的 FairLaunch Cell(endBlock 增长, capacity 增加);用户 xUDT Cell(分发:延长区块数 × mintPerBlock)。

  • 到期开启 Swap(常数乘积池初始化):

  • 用 CKB 兑换 xUDT:

    Inputs: FairLaunch Cell + 交易者 CKB Cell →Outputs: 更新后的 FairLaunch Cell(储备变动,k 近似保持常数);交易者 xUDT Cell(按储备比例定价与滑点)。

  • 用 xUDT 兑换 CKB:

    Inputs: FairLaunch Cell + 交易者 xUDT Cell →Outputs: 更新后的 FairLaunch Cell(储备变动,k 近似保持常数);交易者 CKB Cell。

操作指引

  1. 连接钱包(JoyID 或其他 CKB 钱包)。

  2. 在「创建」页配置代币信息并设置每块铸币与池最低余额(展示单位,按 8 位小数换算)。

  3. 在首页选择未到期条目,输入 CKB 追加以延长分发周期,并获取对应数量的 xUDT。

  4. 当到期后,前往「Swap」页面按常数乘积池规则进行 xUDT ↔ CKB 兑换。

免责声明

  • 本项目仅供学习,90%代码由AI生成,10%人工审核与调试,如有错误或不当之处,敬请谅解并及时反馈。

  • 本项目为示例与实验性玩法,请谨慎参与,切勿用于生产。区块链交易不可逆,请确保理解相关风险与规则。若启用测试模式,仅代表前端行为变化,链上验证仍以合约为准。

特别致谢

  • OffCKB:本地 CKB 开发网络与部署工具,便于快速启动 Devnet、部署与调试合约。

仓库:https://github.com/ckb-devrel/offckb

  • CCC:一站式 JS/TS 生态工具集与钱包连接组件,简化交易组合与签名、前端接入。

仓库:https://github.com/ckb-devrel/ccc/

8 Likes

这个机制有可以让玩家fomo的点吗?比如越早参与额度越高,但最后一个输入ckb的用户得到最多?

这个可以实现的,就看怎么设计xudt的分发了,目前是按区块固定数量,也可以实现按照百分比,比如说剩余 xudt数量的 千分之一,越到后面获取的会越少,也可以固定最后一个人获取固定的数量

嗯哈,感觉怎么设计分发挺重要的,fomo3d当初就是越早参与越有利,最后一个发大财,让游戏的fomo属性贯穿始终,一直有可玩性。

3 Likes

@tianlitao 太高产了!这两个demo都很有意思,一会儿没看,界面又有了大调整,越来越好了!:+1:

2 Likes

可以把发射分成几个阶段,类似传统融资A,B,C轮, A阶段周期内区块分发数量多,如上面说的一部分添加Swap, 甚至作者也可以拿走一定比例回报。再间隔一定时间的区块,到B阶段周期,BC阶段周期分发数量都递减。当产品没达到预期,或说价格没起来 ,BC阶段自然就没人买单了,代币总量就锁定A周期的那些了。如果失败,也就伤害到一少部分人,A阶段本是高风险阶段也承担高收益阶段,如果项目顺利,或说项目为了能执行BC阶段, 主动买入提升价格,这也保护了A阶段的人,成为增量

所以目前 udt/ckb 的兑换价格是通过一开始设置好的每区块分发数量 + 每区块需要的 CKB来决定好的,对吧?

如果能在创建的时候,允许用户选择不同的模式,比如

  • 目前这种固定模式
  • bonding curve 那样的模式
  • 其他…

感觉会更有意思。

另外对于并发的问题,我觉得用链式交易不是个好方法。因为引入一个额外的后端来做,争抢时怎么决定谁排在前面,本质上还是个中心化服务。如果支持 bonding curve 这种先到多得的模式,顺序又很重要。

简单的想下,只要把一个总的 udt cell 分成 N 个等额的 udt cell,每份都套上相同的 fairLaunchLock,似乎就能直接实现 N 倍的并发了?因为每个 udt cell 额度相同、mint 设置相同,所以用户在上面操作的效果也相同,不会产生不一致。到期后 swap 也不影响,相当于每个 UDT 都有 N 个池子可以 swap。

目前的兑换价格也不是固定的,用的 常数乘积池(k = x * y),swap的价格,取决于最终这个 fairLaunchLock cell剩余的ckb和xudt容量。
关于并发:如果分成N个 fairLaunchLock cell的话,mint阶段没问题可以按照规则分发,到swap阶段的会无法确定目前池子里剩余总的xudt和ckb容量,每次swap都要把N个fairLaunchLock cell都引入的话又无法并发

这是正确的方向

比特币出现的最大意义就是对货币权的归属和如何落地的思考,这个世界的全部价值是由所有人共同创造,铸币权理所应当应该属于全体所有人,比特币本身就是中本聪以及其他同道伙伴对铸币权的开创性同时也相对粗糙的思考呈现,其开创性不言而喻,其粗糙性在于当时条件下需要先生存下来的实际环境,后续接力者需要做的就是不断完善这个粗糙的部分

整个目标可以用一句话来概括:在铸币权属于所有人这个理念下,分发好和对接好一个货币,完成这个目标的最佳载体是一条全新的公链(但难度也很大)同时退而求其次在一条公链之上来完成作为过渡也可以接受

前面的讨论我认为大方向是正确的,同时给出一些自己的思考:

一个全新的代币xUDT不用说,交易对另一个

当然可以是CKB,其实也可以是某个法币的映射币xUSD或者XCNY等等,我更倾向于后者

xUDT的总量分成两个部分,分发池部分和兑换池部分,可以各占一半,分发池部分的分发可以上面帖子说的在分成平等的N个来分发,而且这个N个越大越好,分发的时间越长越好

兑换池可以是一个也可以分成几个,比如xUDT/xUSD xUDT/XCNY xUDT/xEUR 这个xUDT有几个国家的法币映射币兑换池就是对这个经济体的增益同时也是对自己的增益

其中xUSD/XCNY/xEUR等币由团队在一开始直接生成(一个极大的固定量)锁定在交易对或者合约里,包括团队在内的任何人都无法控制和转移而只能通过xUDT兑换(这是去中心化映射币的真正涵义)

在分发池的部分,可以把分发条件做到最低以便让参与的团体人数最大化,比如把它简化到只需要一个花费十秒钟的链上交互即可,这样的极致机制让即便没有特别的宣传也会不断有人会参与进来,参与的成本就是若干个十秒

同时在兑换池xUDT/xUSD xUDT/XCNY会有一个价格(也会不断变化),最后我们可以看到的最好结果是,xUDT的价格缓慢的上升(而非大涨大跌)同时有原生的去中心化的法币映射币xUSD,XCNY,其在一众映射币里的竞争力也不言而喻

xUDT和xUSD/XCNY会完成一个互相赋能的过程(另一个极端是一起归零)而我认为其会互相赋能而非归零的原因和底气在于其分发方式上最简化让其可以一直保持人气和关注度,不断增涨持币人数,这些因素会让xUDT的价格是一个缓慢的上升通道(既不会大涨也不会大跌),这是很多人需要的宝贵的确定性,同时与xUSD XCNY等的交易对完成了与现实世界的对接

快要结尾了,我想很多人都会发现一个问题,作为创建这个项目的团队的收益在哪里?似乎没有体现

是的,如果整个项目就这样运作,那么可以说是在铸币权属于所有人的理念下,在中本聪及其同道中人的道路上继续往前走,即完成了整个项目的理念和落地,但是没有为自己谋取特殊的利益,而是和其他人一样作为整个生态的普通一员来通过贡献换取收益

当然,团队如果需要一开始就获取特别收益也是可以理解的,方法也很简单,在xUDT的总量分配时,给自己预留一部分就是了

同时,如果团队不给自己预留,用功成不居的态度和高度来完成它的话,会让整个项目打消很多人也许永远不会说出口但肯定存在的顾虑,从而达到一个当前所有项目都没有达到的新高度

而这种贡献和价值最后终将会返回到你的身上,用你可能想到但更多的是想不到的方式

1 Like

ok 我这样理解对吗:

mint 价格 = 每区块需要的 ckb 数量 / 每区块分发的 udt 数量  // 通过参数设置写死

swap 价格 = mint 收到的所有 ckb 数量 / 剩余 udt 数量
   = (mint 价格 * mint 数量) / (代币总量 - mint 数量)
   = (每区块需要的 ckb 数量 / 每区块分发的 udt 数量 * mint 数量) / (代币总量 - mint 数量)

这样 mint 越多,swap 的价格就越高?看起来这本身就已经是个 bonding curve 函数了?这样的话,确实拆分 cell 做并发的方案行不通。


发现这里我作为一个用户,会下意识去算, 我mint 时固定好的价格去 mint 到底会不会比最终 swap 时的价格来得高还是低

这说的有点像早期的算法稳定币呢 ,理念很好 就是容易脱锚,可以去找下之前的算法稳定币代表 单币模式,双币模式 ,三币模式都实验过 :grinning_face: 。还有这里的 三个池子会导致池子不集中而太浅问题

对的,是这样的

提个 ui 建议,这里能否加一列显示计算后的价格,会比较直观。

这是一个很多人都被误导的一个问题,只能说你只是其中一个

脱锚的确是一个不得不考虑的问题

但其关键在于不管是这个稳定币本身还是用作锚定物的东西能否被个人所私自移动

不管是之前的UST还是当前的几个脱锚的美元稳定币,其脱锚的核心是其运营团队或者可以随意凭空生成或者可以随意挪用,而不是什么算法不算法的称呼,换句话说,就算用实体黄金作为锚定物,一旦有人可以私自挪用这些黄金,那么这个稳定币就一定会暴雷和脱锚,这只是时间问题

我说的这里的核心是任何人都不能私自挪用,所以除非这个代币归零(而因为一直持续在免费分发的缘故会吸引很多人低成本的进入会持续存在)这个币的生命力会比很多其他稳定币好,唯一的不足只是前期其流通量不会大,会有个慢慢增加的过程

市面上当前的多数稳定币,一部分会暴雷而快速倒下,一部分会因为渐渐无人参与(所谓超额质押稳定币)而煎熬等死

交易池的深度问题由代币总量在分成分发池和交易池这个步骤里的具体分发步骤上解决

由比特币举例,总量2100万个,换成sat就是2100万亿sat

新的代币xUDT总量设定为4200万亿个,其中分发池2100万亿个,交易池2100万亿个

分发池的2100万亿分为一万年平均分发,每年2100亿个,然后到每一天就是大约五亿多不到六亿,取个大约算六亿

即每天分发代币也就六亿,而交易池里的深度是2100万亿(稳定币XUSD XCNY则更是一个巨大的总量在一开始就已经被生成一起放在交易池里)完全不存在深度不够的问题

一句话总结:交易池的深度问题一定要在一开始就考虑周到,而不是后面让用户用自己的代币去组建交易池把潜在风险转移给用户

好的,已加