Uniswap v2 路由器代码解析

  • RareSkills
  • 发布于 2023-11-12 20:54
  • 阅读 281

本文详细介绍了Uniswap V2的Router合约,包括其功能如安全地铸造和销毁LP代币、交换代币、处理ETH和滑点检查等,并解释了Router02相对于Router01新增的费转移代币支持功能。文章还探讨了添加和移除流动性的内部机制,以及与UniswapV2Library的交互。

Router 合约为用户提供了一个面向用户的智能合约,用于

  • 安全地 铸造和销毁 LP 代币(添加和移除流动性)
  • 安全地 兑换成对代币
  • 通过与包装以太(WETH)ERC20 合约集成,增加了兑换 Ether 的能力。
  • 增加了核心合约中遗漏的与 滑点 相关的安全检查。
  • 添加了对转账费用代币的支持。

Router02 是 Router01 所有功能的扩展,增加了对转账费用代币的支持

当我们第一次打开外围仓库中的合约文件夹时,我们会看到三个合约。

uniswap v2 router github 截图

Router02 是 Router01,增加了对转账费用代币的附加功能。当我们查看 Router02 的接口时,可以看到它继承自 Router01(红框)(这意味着它实现了所有的功能),并具有以下附加功能,所有这些功能都是用于支持转账费用代币进行操作的(黄色高亮)。

uniswap v2 router 继承

swapExactTokensForTokens 和 swapTokensForExactTokens

让我们从兑换代币的 Router 函数开始。这个功能有两个函数来完成(绿色高亮)。

uniswap v2 router 兑换

这两个函数名称的区别如下:

  • swapExactTokensForTokens 中,“第一个代币是确切的”意味着你兑换的输入代币数量是固定的。
  • swapTokensForExactTokens 中,“第二个代币是确切的”表示你希望接收的输出代币数量是固定的。

如果用户只能兑换两种代币,那么他们将向这些函数提供一个 address[] calldata path 数组(用蓝色高亮标出)[address(tokenIn), address(tokenOut)]。如果他们跨池跳转,则需要指定 [address(tokenIn), address(intermediateToken), …, address(tokenOut)]

swapExactTokensForTokens

swap**Exact**TokensForTokens 的情况下,用户确切地指定他们将存入的第一个代币的数量,以及他们愿意接受的输出代币的最低数量。

例如,假设我们想要以 25 个 token0 兑换 50 个 token1。如果这是当前状态下的确切价格,那么在我们的交易确认之前,价格在变化时没有容错余地,可能会导致回滚。因此,我们改为指定最低输出为 49.5 token1,隐含留下 1% 的容错。

swapTokensForExactTokens

在这种情况下,我们指定我们希望确切获得 50 个 token1,但是我们愿意最多交易 25.5 个 token0 来获取它。

使用哪个兑换函数?

大多数使用 EOA 的用户可能会选择使用确切输入函数,因为他们需要进行批准步骤,如果他们需要输入超过批准的数量,交易就会失败。通过使用确切输入,他们可以批准确切的数量。然而,与 Uniswap 集成的智能合约可能会有更复杂的需求,因此路由器为它们提供了两个选项。

兑换是如何工作的

当输入是确切的(swapExactTokensForTokens)时,该函数预测单个兑换或一系列兑换的预期输出。如果结果输出低于用户指定的数量,函数会回滚。反之对于确切输出:它计算所需输入,并在超过用户指定的阈值时回滚。

然后,两个函数都会将用户的代币转移到成对合约中(请记住,Uniswap V2 Pair 需要在调用成对合约函数 swap() 之前将代币发送到合约)。最后,它们都调用下一个讨论的内部 _swap() 函数。

uniswap v2 router swap exact

_swap() 函数

在内部,所有公开的以 swap() 为名称的函数都会调用下面展示的 _swap() 内部函数。

请记住,核心 swap 函数 的函数签名指定了两个代币的 amountOutamountIn 由函数调用之前转移的金额隐含表示。

uniswap v2 router 内部 swap 函数

_addLiquidity

记住添加流动性的安全检查吗?具体来说,我们希望确保以完全相同的比例存入两种代币,否则我们铸造的 LP 代币数量...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。
该文章收录于 Uniswap V2 之书
14 订阅 9 篇文章

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/