部署一个简易去中心化交易所(DEX)
之前只是了解 DEX 的概念和交互,这次想自己部署一个简易版 DEX,把流程走一遍。先记录第一部分:需要哪些合约,以及整体部署顺序。
要部署哪些东西
如果是基于 Uniswap V2 这一套思路,一个最小可用的 DEX 大概需要这些合约:
- ERC20 Token:用于测试交易的代币。
- Factory:负责创建交易对 Pair。
- Pair:真正存放两种 Token 流动性的池子。
- Router:用户一般不直接调用 Pair,而是通过 Router 添加流动性、移除流动性、Swap。
- WETH/WBNB:链上原生币包装合约,用来和 ERC20 统一处理。
如果只是做学习版,不一定一开始就要做前端,先把合约部署和基础调用跑通更重要。
部署顺序
我理解的顺序大概是这样:
- 部署测试 ERC20 Token。
- 部署 WETH 或 WBNB 合约。
- 部署 Factory。
- 部署 Router,构造参数里传入 Factory 和 WETH/WBNB 地址。
- 给测试账号 mint 一些 Token。
- approve 给 Router。
- 通过 Router 添加流动性。
- 再通过 Router 做 Swap 测试。
这里最容易忘的是 approve。因为 Router 要帮你把 Token 转进 Pair 合约,所以用户必须先授权 Router 可以花自己的 Token。
添加流动性
添加流动性的时候,本质上就是把两种 Token 按比例放进池子里。第一次添加流动性会创建 Pair,后面再添加就是往已有 Pair 里继续加资金。
添加成功后会拿到 LP Token,代表你在这个池子里的份额。移除流动性的时候,就是把 LP Token 还回去,再取回对应比例的两种 Token。
Swap
Swap 的时候,Router 会根据路径找到对应 Pair,然后按池子里的储备量计算可以换到多少 Token。
最简单的是:
1 | TokenA -> TokenB |
复杂一点可以跨池:
1 | TokenA -> WBNB -> TokenB |
跨池路径越长,手续费和滑点也会更多,所以实际交易时还是要注意路径。
小结
这篇先把整体流程记下来。部署一个简易 DEX 并不是只部署一个合约,而是一组合约配合起来:
- Factory 负责创建池子。
- Pair 负责保存流动性。
- Router 负责给用户提供统一入口。
- approve 是调用前经常会漏掉的一步。
下一步再补具体部署脚本和测试交易流程。