每一枚 Baofa 代币都在核心合约持有的一条恒定乘积联合曲线上交易。曲线有两个虚拟储备:代币与 BNB,二者的乘积在交易前后保持不变。买入者付出 BNB 取走代币,卖出者付出代币取回 BNB,价格就是两个储备之比。
上线配置#
| 参数 | 数值 | 说明 |
|---|---|---|
| 每枚代币总供应量 | 1,000,000,000 枚(6 位小数) | 发行时一次铸造,之后不再增发 |
| 曲线上可售代币 | 793,100,000 | 真实代币储备 |
| 为池子预留的代币 | 206,900,000 | 毕业时转入 PancakeSwap 交易对 |
| 初始虚拟代币储备 | 1,073,000,000 | 定价储备,包含真实储备 |
| 初始虚拟 BNB 储备 | 6 BNB | 定价储备,不是真实 BNB |
| 完成时募集的 BNB | 17.001072 BNB | 由以上储备推导 |
| 计价资产 | BNB | 合约也支持注册的计价代币,上线时未注册 |
当真实代币储备归零时曲线完成,此时恰好有 17.001072 BNB 被买入。下面的数学说明了原因。
公式#
设虚拟代币储备为 (T),虚拟 BNB 储备为 (Q),不变量 (k = T \cdot Q)。买入 (q) BNB(费用前)得到
[ \text{代币} = T - \frac{k}{Q + q} = \frac{T \cdot q}{Q + q} ]
卖出 (t) 枚代币得到
[ \text{BNB} = Q - \frac{k}{T + t} = \frac{Q \cdot t}{T + t} ]
即时价格为 (Q / T) BNB 每枚。市值等于即时价格乘以总供应量。
推算#
| 节点 | 虚拟 BNB | 虚拟代币 | 即时价格(BNB/枚) | 市值 |
|---|---|---|---|---|
| 第一笔交易 | 6 | 1,073,000,000 | 0.00000000559 | 5.592 BNB |
| 完成 | 23.001072 | 279,900,000 | 0.0000000822 | 82.176 BNB |
从第一笔交易到完成的价格倍数为 ((1073 / 279.9)^2 \approx 14.7)。完成时募集的 BNB 等于完成时的虚拟 BNB 减去初始虚拟 BNB:(6 \cdot 1073 / 279.9 - 6 = 17.001) BNB。
费用在曲线之外#
上面的公式使用费用前的金额。买入时协议费(0.95%)与创作者收益(0.30%)加在曲线成本之上,卖出时从所得中扣除。费用不进入储备,因此不改变价格。详见 费用。
整数运算#
曲线的全部运算使用无符号 64 位与 128 位整数、向下取整,并与参考实现保持相同的运算顺序;重写版的测试套件逐向量地把每个函数与独立模型比对。舍入最多向协议方向偏差一个最小单位(百万分之一枚代币,或 1 gwei 的 BNB)。
曲线完成#
当一笔买入需要的代币多于剩余时,它买走全部剩余并完成曲线;买方余下的预算按毕业后池子的开盘价(完成时的储备减去毕业费用)从池子配额中成交,无法成交的部分退回;不带 partialFill 的这类买入则直接回退。真实代币储备归零时曲线发出 Complete,曲线交易停止,代币等待毕业。没有时间限制,也不能取消:代币会一直留在曲线上直到完成。