Baofa 是一组为 BNB Smart Chain 编写的 EIP-2535 钻石合约,使用 Solidity 0.8.38,面向 Cancun EVM 编译。每个钻石合约是一个职责固定的模块;代币合约与工厂是普通合约。协议是依据对参考 Solana 程序逐指令写成的完整规格重写的,并通过差分测试与之比对;它不是对另一套 EVM 代码的移植。
组成#
| 合约 | 职责 | 持有价值 |
|---|---|---|
BaofaCore |
曲线:发行、买入、卖出、毕业、创作者收益账本、持有者奖励、激励、计价资产注册表、协议参数 | 曲线储备与费用账本,全部以 WBNB 形式 |
BaofaFees |
各消费方的费率与分层、收益分成配置、社交收益账户、捐赠账户、回购划转 | 分成与社交收益账本,以 WBNB 形式 |
BaofaFrenzy |
狂暴模式交易程序:上限、时间窗、交易员角色、划转、时间窗结束时的销毁 | 其金库,以 BNB 形式 |
BaofaRelay |
捐赠中继:活动捐赠、周期关闭、兑换为结算资产并由中继员分发 | 在途捐赠 |
BaofaCoinFactory |
用 CREATE2 为每次发行部署一个 BaofaCoin |
无 |
BaofaCoin |
代币:支持 permit 的 ERC-20,一道毕业时打开的闸门 |
无 |
| Baofa AMM(未部署) | 协议自有的毕业场所,之后可由治理挂接 | 不适用 |
BNB Smart Chain 上的外部依赖:WBNB、PancakeSwap v2 工厂(毕业时创建交易对)与 PancakeSwap v2 路由(中继兑换)。地址见 地址 页。
价值存放在哪里#
曲线储备、创作者收益累计与协议费累计都以 WBNB 形式保存在核心合约中,按代币与按接收方记账。除狂暴模式金库外,没有任何钻石合约静态持有原生 BNB:可支付入口精确包装它所记账的金额,有状态不变量测试套件在每次调用后断言核心、费用与中继钻石合约不持有任何原生余额。两个推论:
- 协议中没有任何东西依赖钻石合约的原始余额,因此直接向钻石合约转 BNB 不会改变任何记账。这类转账是搁浅资金,只有所有者的
rescueNative能退回,且触碰不到账本。 - 每一笔对外支付要么由收款方主动领取(创作者与协议费领取、毕业费用),要么是带 WBNB 回退的推送(持有者奖励、分成分发、社交领取),因此没有任何收款方能阻塞一笔交易或他人的支付。
一笔交易的调用流程#
- 交易者在核心合约上调用
buyExactIn或sell,附带截止时间与滑点下限。 - 核心合约从费用模块读取该代币计价类别与市值分层对应的费率。
- 核心合约以整数运算应用曲线数学,把费用部分划入各自账本,在交易者与曲线之间转移代币,并发出
Trade。 - 若买入耗尽了真实代币储备,核心合约发出
Complete;毕业是另一笔无需许可的migrate调用。
重入锁是每个钻石合约一把的瞬态存储锁,在整个外部调用期间持有。外部代币转账在状态结算之后进行。
可升级性与所有权#
每个钻石合约有一个所有者,可以通过 diamondCut 更换切面,并以两步完成所有权转移(transferOwnership、acceptOwnership)。所有者也可以放弃所有权;连同移除切割选择器,这会使钻石合约不可变。部署时每个钻石合约的所有者都是部署方;取代它的治理结构见 角色与治理。
代币合约与工厂没有所有者,也没有升级路径。
设计拒绝什么#
| 拒绝 | 方式 |
|---|---|
| 暂停曲线上的交易 | 核心合约没有暂停函数 |
| 拉黑交易者或代币 | 不存在这样的函数 |
| 发行后增发代币 | BaofaCoin 没有增发 |
| 预先注入代币的 PancakeSwap 交易对 | 代币在毕业前拒绝转往其交易对 |
| 保留毕业流动性 | 流动性凭证在毕业交易中转入黑洞地址 |
| 收款方挟持交易 | 主动领取,WBNB 回退 |
| 为任意地址免除费用的白名单 | 白名单只能是狂暴模式钻石合约或无人 |
源码与验证#
合约在部署时于 BscScan 验证,使用上述编译器设置,优化器运行次数 200。交给外部审查方的审查包包含与部署相同的 75 个 Solidity 文件;见 保障体系。