Router 合约的目标很简单:让用户只用 单一资产(比如 USDT) 就能直接申购和赎回 ETF。
这是我的 AI + Web3 实战营的第三篇研发日志,前两篇如下:
另外,关于 AI + Web3 实战营的相关介绍则有如下几篇文章:
上篇日志里我们完成了 BlockETFCore 底层合约,它能处理多资产按比例的申购赎回。问题是,这样的操作对普通用户来说太复杂了:要一次性准备好多种资产,并且还要按比例。
所以我们需要在 Core 合约之上,再搭建一个更友好的入口 —— Router 合约。它的目标很简单:让用户只用 单一资产(比如 USDT) 就能直接申购和赎回 ETF。
一开始我们评估了几种方案:
最终,我们选择了 Router 模式,它能保证 Core 保持干净,Router 负责对接用户体验,两者分工明确。
第一版我们只聚焦几个关键点:
mintWithUSDT()
和 burnToUSDT()
一开始我以为直接上 V3 就行,但发现不同资产的流动性分布差异很大:
所以最后采用了 V2+V3 混合架构。
最初的设计是所有兑换都走 USDT→WBNB→目标资产。但会发现,这样多走了一跳,增加了滑点和 Gas 成本。更重要的是,USDT/WBNB 在 V3 中并没有流动性。
于是改成了:
这个调整大大减少了额外损耗。
从一开始的“所有对统一 0.25%”,到尝试“动态费率算法”,最后回归到最简单的方式:直接配置池地址。实践证明,简单才是最可靠的。
根据资产特性决定走 V2 还是 V3,比如:
Router 内部做了自动判断,用户无感知。
Router 主要暴露了两个函数:
function mintWithUSDT(...) external returns (uint256 shares);
function burnToUSDT(...) external returns (uint256 usdtAmount);
流程很直观:
这中间的优化点在于:
mintExactShares
来提高精度最终架构大致是这样的:
USDT <——> Router <——> Core
│
├─ PancakeSwap V2 (WBNB)
└─ PancakeSwap V3 (BTCB/ETH/XRP/SOL)
它的特性包括:
完成 ETFRouterV1 之后,下一步我们就要实现 RebalanceManager 了,这也是最复杂的一个模块。
📌 小结一下:Router 合约让用户终于可以用一枚 USDT 就轻松申购/赎回 ETF 了。对用户来说体验更直观,对架构来说依旧保持了清晰分离。这是我们实战营迭代中迈出的关键一步。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!