# AI+Web3实战营日志 #8 | 重构ETFRouterV1 **Published by:** [Keegan小钢](https://paragraph.com/@keeganlee/) **Published on:** 2025-09-29 **URL:** https://paragraph.com/@keeganlee/ai-web3-8-etfrouterv1 ## Content 这是我的 AI + Web3 实战营 的第八篇研发日志,前七篇如下: AI+Web3实战营日志 #1|开营 AI+Web3实战营日志 #2 | 完成底层合约 AI+Web3实战营日志 #3 | Router合约 AI+Web3实战营日志 #4 | Rebalancer合约 AI+Web3实战营日志 #5 | 完成合约开发 AI+Web3实战营日志 #6 | 开始合约测试 AI+Web3实战营日志 #7 | 完成Core合约测试另外,关于 AI + Web3 实战营的相关介绍则有如下几篇文章: 我要启动 AI + Web3 实战营了 再谈 AI+Web3 实战营:这到底能带给你什么? AI+Web3实战营,9月15日正式开营前言完成 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 个录播视频,完成了从 核心合约开发 → 测试 → 重构优化 的完整闭环。 这意味着,学员不仅能跟着真实的研发进度学习,还能获得一整套从 理论到实战、从踩坑到优化 的完整经验。这些录播内容本身就相当于一份“避坑指南”,能大幅提升学习效率和实战能力。 在正式开营之前,我就说过:“开营之后,价格会逐步上调”。只是之前没有在日志里公开宣布,所以迟迟没有执行。今天,随着第一阶段的里程碑成果完成,这个承诺终于要兑现了。 👉 从本篇日志开始,实战营价格将从 $299调整为$309。 早期加入的同学,已经锁定了最优价格;而每一次加价,都会与一个关键成果绑定,成为项目成长的见证。 更重要的是:这还只是开始。后续我们还将持续展开 更多合约模块的测试、前端交互优化、实战部署与上线 等一系列内容。随着研发的深入,实战营的价值也会不断提升。 因此,如果你还在观望,现在就是最佳入场时机。 ## Publication Information - [Keegan小钢](https://paragraph.com/@keeganlee/): Publication homepage - [All Posts](https://paragraph.com/@keeganlee/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@keeganlee): Subscribe to updates - [Twitter](https://twitter.com/KKeeganLee): Follow on Twitter