这是我的 AI + Web3 实战营 的第八篇研发日志,前七篇如下:
AI+Web3实战营日志 #4 | Rebalancer合约
另外,关于 AI + Web3 实战营的相关介绍则有如下几篇文章:
前言
完成 Core 合约测试后,我们紧接着把 PriceOracle 的测试也跑完了。由于 PriceOracle 逻辑较为简单,测试同样顺利,没有发现问题。
随后转入 Router 合约测试。在此过程中,我们发现铸造函数的实现流程存在设计缺陷,并据此对整个铸造路径进行了重构。本文主要分享这次重构的思考与结果。
重构前的铸造流程
重构前仅有一个铸造函数 mintWithUSDT,支持用户用 USDT 一键申购 ETF 份额。该函数采用“输入驱动”的设计——用户给定投入的 USDT 数量,系统计算应得的 ETF 份额。流程如下:
- 转入 USDT:通过
transferFrom将用户的 USDT 转入合约。 - 计算预期份额:基于预言机价格,并对份额 下调 3% 作为滑点缓冲。
- 计算所需底层资产:按预期份额推导各底层资产的需求量。
- 逐资产执行交换:
- 以需求量为基准,用预言机价格并 上调 3% 估算所需 USDT;
- 在 DEX 上买入底层资产,且最小接收量再 下调 3% 做保护。
- 铸造份额:按第 2 步的预期份额为用户铸造 ETF 份额。
- 退还多余 USDT:若仍有剩余则返还。
该方案存在多处问题:
- 价格源不一致:实际成交发生在 DEX,但多处计算依赖预言机价格,天然存在偏差。
- 用户收益不友好:预期份额直接按 -3% 扣减并用于最终铸造,例如净值 10 USDT 时,投入 1000 USDT 本可获得 100 份,却只能拿到 97 份。
- 波动场景易失败:价格快速波动导致 DEX 成交量低于预期需求时,铸造会失败(全回滚)。
归纳为四类核心问题:
- 时间差风险:预言机更新有延迟,行情快变时估算价与成交价偏离加大。
- 滑点缓冲不对称:估算按总价值 -3% ,执行对每个资产 +3% ;多资产叠加后缓冲可能仍不足。
- 缺乏实时报价:估算阶段未直接查询 DEX 实时可成交价格。
- 全有或全无:任一资产购买失败即整笔回滚,缺少部分执行或动态调整机制。
换一种思路:从“金额驱动”到“份额驱动”
经分析后,我们引入“份额驱动”路径:由用户指定要铸造的份额数,而不是投入金额。
新增 mintExactShares
核心流程:
- 用户指定目标份额
shares与可接受的 USDT 上限maxUSDT; - 将
maxUSDT转入合约; - 计算实现
shares所需的各底层资产精确数量amounts; - 直接在 DEX 逐一买入这些资产并累计实际支付的 USDT;
- 为用户铸造精确的
shares; - 返还未用完的 USDT。
除 maxUSDT 是上限外,其余步骤均为确定量。为便于前端估算,我们提供只读函数 usdtNeededForShares,其计算逻辑与实际执行一致,返回精确的 usdtAmount:
- 按
shares反推所需底层资产精确数量; - 以 DEX 实时价格计算买齐这些资产所需的 USDT。
如果在同一笔交易内先调用 usdtNeededForShares 再执行 mintExactShares,两者的 USDT 结果将完全一致。
实际前端交互存在时间差,DEX 价格可能变动,因此 maxUSDT 通常在估算结果上再增加用户可配置的滑点(如 0.5%、1%、5% 等)。合约负责精确计算,滑点交给前端与用户控制,体验与 Uniswap 一致。
重构 mintWithUSDT(金额驱动的简化版)
在完成 mintExactShares / usdtNeededForShares 后,我们也重构了 mintWithUSDT 及其配套只读函数,使其计算路径更直接,避免多层嵌套的滑点处理:
执行流程:
- 用户给定投入
usdtAmount与可接受的最小份额minShares; - 基于预言机价格 + 底层资产储备,计算各资产的最新权重;
- 按最新权重将
usdtAmount分配到各资产的购买预算; - 在 DEX 逐一买入对应资产;
- 将买入资产转入 Core 合约;
- 以实际转入的资产数量为基准为用户铸造份额;
- 若仍有多余资产,则卖回 USDT 并返还给用户。
只读估算函数 usdtToShares:
- 用预言机与储备计算各资产最新权重;
- 将
usdtAmount按权重拆分为各资产预算; - 以 DEX 实时可成交量推算可买入的资产数量;
- 基于这些数量由 Core 计算可铸造的份额。
若两者在同一笔交易内依次调用,最终份额结果将保持一致。前端在实际申购时,可在 usdtToShares 的结果上下调一定比例设置 minShares,以覆盖成交过程中的价格波动并提升成交成功率。
小结与价格调整
到目前为止,我们已经累计投入 28 小时,产出了 19 个录播视频,完成了从 核心合约开发 → 测试 → 重构优化 的完整闭环。
这意味着,学员不仅能跟着真实的研发进度学习,还能获得一整套从 理论到实战、从踩坑到优化 的完整经验。这些录播内容本身就相当于一份“避坑指南”,能大幅提升学习效率和实战能力。
在正式开营之前,我就说过:“开营之后,价格会逐步上调”。只是之前没有在日志里公开宣布,所以迟迟没有执行。今天,随着第一阶段的里程碑成果完成,这个承诺终于要兑现了。
👉 从本篇日志开始,实战营价格将从 299U 调整为 309U。
早期加入的同学,已经锁定了最优价格;而每一次加价,都会与一个关键成果绑定,成为项目成长的见证。
更重要的是:这还只是开始。后续我们还将持续展开 更多合约模块的测试、前端交互优化、实战部署与上线 等一系列内容。随着研发的深入,实战营的价值也会不断提升。
因此,如果你还在观望,现在就是最佳入场时机。