# AI+Web3实战营日志 #8 | 重构ETFRouterV1

By [Keegan小钢](https://paragraph.com/@keeganlee) · 2025-09-29

---

这是我的 [**AI + Web3 实战营**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495279&idx=1&sn=4369256be0f5ad49989242a35eab3a04&scene=21#wechat_redirect) 的第八篇研发日志，前七篇如下：

[**AI+Web3实战营日志 #1｜开营**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495285&idx=1&sn=49acd14afddf10e8bd0e0813f07f90a0&scene=21#wechat_redirect)

[**AI+Web3实战营日志 #2 | 完成底层合约**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495299&idx=1&sn=bf08bcdf92558408615ca17c097f46ba&scene=21#wechat_redirect)

[**AI+Web3实战营日志 #3 | Router合约**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495306&idx=1&sn=0d618257cb93b52d90ea9ba790223823&scene=21#wechat_redirect)

[**AI+Web3实战营日志 #4 | Rebalancer合约**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495313&idx=1&sn=414daa096b58785018aa00dc6e3dc70c&scene=21#wechat_redirect)

[**AI+Web3实战营日志 #5 | 完成合约开发**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495320&idx=1&sn=4484cec86a4c52d147f4336dd82a5187&scene=21#wechat_redirect)

[**AI+Web3实战营日志 #6 | 开始合约测试**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495326&idx=1&sn=9c66af2a09d9a67d04f78e2b79054646&scene=21#wechat_redirect)

[**AI+Web3实战营日志 #7 | 完成Core合约测试**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495332&idx=1&sn=96f39b45560d90b6ac259f4719971f23&scene=21#wechat_redirect)

* * *

另外，关于 AI + Web3 实战营的相关介绍则有如下几篇文章：

[**我要启动 AI + Web3 实战营了**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495268&idx=1&sn=c226a51bc06d180858a41fa9becbf752&scene=21#wechat_redirect)

[**再谈 AI+Web3 实战营：这到底能带给你什么？**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495273&idx=1&sn=628a703d76cc808a0484f576234f2c7a&scene=21#wechat_redirect)

[**AI+Web3实战营，9月15日正式开营**](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652495279&idx=1&sn=4369256be0f5ad49989242a35eab3a04&scene=21#wechat_redirect)

* * *

**前言**
------

完成 Core 合约测试后，我们紧接着把 **PriceOracle** 的测试也跑完了。由于 PriceOracle 逻辑较为简单，测试同样顺利，没有发现问题。

随后转入 **Router** 合约测试。在此过程中，我们发现铸造函数的实现流程存在设计缺陷，并据此对整个铸造路径进行了重构。本文主要分享这次重构的思考与结果。

**重构前的铸造流程**
------------

重构前仅有一个铸造函数 `mintWithUSDT`，支持用户用 USDT 一键申购 ETF 份额。该函数采用“**输入驱动**”的设计——用户给定投入的 USDT 数量，系统计算应得的 ETF 份额。流程如下：

1.  **转入 USDT**：通过 `transferFrom` 将用户的 USDT 转入合约。
    
2.  **计算预期份额**：基于预言机价格，并对份额 **下调 3%** 作为滑点缓冲。
    
3.  **计算所需底层资产**：按预期份额推导各底层资产的需求量。
    
4.  **逐资产执行交换**：
    
    *   以需求量为基准，用预言机价格并 **上调 3%** 估算所需 USDT；
        
    *   在 DEX 上买入底层资产，且最小接收量再 **下调 3%** 做保护。
        
5.  **铸造份额**：按第 2 步的预期份额为用户铸造 ETF 份额。
    
6.  **退还多余 USDT**：若仍有剩余则返还。
    

该方案存在多处问题：

*   **价格源不一致**：实际成交发生在 DEX，但多处计算依赖预言机价格，天然存在偏差。
    
*   **用户收益不友好**：预期份额直接按 **\-3%** 扣减并用于最终铸造，例如净值 10 USDT 时，投入 1000 USDT 本可获得 100 份，却只能拿到 97 份。
    
*   **波动场景易失败**：价格快速波动导致 DEX 成交量低于预期需求时，铸造会失败（全回滚）。
    

归纳为四类核心问题：

1.  **时间差风险**：预言机更新有延迟，行情快变时估算价与成交价偏离加大。
    
2.  **滑点缓冲不对称**：估算按总价值 **\-3%** ，执行对每个资产 **+3%** ；多资产叠加后缓冲可能仍不足。
    
3.  **缺乏实时报价**：估算阶段未直接查询 DEX 实时可成交价格。
    
4.  **全有或全无**：任一资产购买失败即整笔回滚，缺少部分执行或动态调整机制。
    

**换一种思路：从“金额驱动”到“份额驱动”**
------------------------

经分析后，我们引入“**份额驱动**”路径：由用户指定要铸造的份额数，而不是投入金额。

### **新增** `mintExactShares`

核心流程：

1.  用户指定目标份额 `shares` 与可接受的 USDT 上限 `maxUSDT`；
    
2.  将 `maxUSDT` 转入合约；
    
3.  计算实现 `shares` 所需的各底层资产**精确数量**`amounts`；
    
4.  直接在 DEX 逐一买入这些资产并累计实际支付的 USDT；
    
5.  为用户铸造精确的 `shares`；
    
6.  返还未用完的 USDT。
    

除 `maxUSDT` 是**上限**外，其余步骤均为**确定量**。为便于前端估算，我们提供只读函数 `usdtNeededForShares`，其计算逻辑与实际执行一致，返回精确的 `usdtAmount`：

1.  按 `shares` 反推所需底层资产精确数量；
    
2.  以 DEX **实时价格**计算买齐这些资产所需的 USDT。
    

如果在**同一笔交易**内先调用 `usdtNeededForShares` 再执行 `mintExactShares`，两者的 USDT 结果将完全一致。

实际前端交互存在时间差，DEX 价格可能变动，因此 `maxUSDT` 通常在估算结果上再增加用户可配置的滑点（如 0.5%、1%、5% 等）。**合约负责精确计算，滑点交给前端与用户控制**，体验与 Uniswap 一致。

**重构** `mintWithUSDT`（金额驱动的简化版）
-------------------------------

在完成 `mintExactShares` / `usdtNeededForShares` 后，我们也重构了 `mintWithUSDT` 及其配套只读函数，使其计算路径更直接，避免多层嵌套的滑点处理：

**执行流程：**

1.  用户给定投入 `usdtAmount` 与可接受的最小份额 `minShares`；
    
2.  基于**预言机价格 + 底层资产储备**，计算各资产的**最新权重**；
    
3.  按最新权重将 `usdtAmount` 分配到各资产的购买预算；
    
4.  在 DEX 逐一买入对应资产；
    
5.  将买入资产转入 Core 合约；
    
6.  以实际转入的资产数量为基准为用户铸造份额；
    
7.  若仍有多余资产，则卖回 USDT 并返还给用户。
    

**只读估算函数** `usdtToShares`：

1.  用预言机与储备计算各资产最新权重；
    
2.  将 `usdtAmount` 按权重拆分为各资产预算；
    
3.  以 DEX 实时可成交量推算可买入的资产数量；
    
4.  基于这些数量由 Core 计算可铸造的份额。
    

若两者在**同一笔交易**内依次调用，最终份额结果将保持一致。前端在实际申购时，可在 `usdtToShares` 的结果上**下调**一定比例设置 `minShares`，以覆盖成交过程中的价格波动并提升成交成功率。

**小结与价格调整**
-----------

到目前为止，我们已经累计投入 **28 小时**，产出了 **19 个录播视频**，完成了从 **核心合约开发 → 测试 → 重构优化** 的完整闭环。

这意味着，学员不仅能跟着真实的研发进度学习，还能获得一整套从 **理论到实战、从踩坑到优化** 的完整经验。这些录播内容本身就相当于一份“避坑指南”，能大幅提升学习效率和实战能力。

在正式开营之前，我就说过：**“开营之后，价格会逐步上调”**。只是之前没有在日志里公开宣布，所以迟迟没有执行。今天，随着第一阶段的里程碑成果完成，这个承诺终于要兑现了。

👉 从本篇日志开始，实战营价格将从 **$299调整为$309**。

早期加入的同学，已经锁定了最优价格；而每一次加价，都会与一个关键成果绑定，成为项目成长的见证。

更重要的是：这还只是开始。后续我们还将持续展开 **更多合约模块的测试、前端交互优化、实战部署与上线** 等一系列内容。随着研发的深入，实战营的价值也会不断提升。

因此，如果你还在观望，现在就是最佳入场时机。

---

*Originally published on [Keegan小钢](https://paragraph.com/@keeganlee/ai-web3-8-etfrouterv1)*
