本文详细介绍了Uniswap V2的Router合约,包括其功能如安全地铸造和销毁LP代币、交换代币、处理ETH和滑点检查等,并解释了Router02相对于Router01新增的费转移代币支持功能。文章还探讨了添加和移除流动性的内部机制,以及与UniswapV2Library的交互。
Router 合约为用户提供了一个面向用户的智能合约,用于
当我们第一次打开外围仓库中的合约文件夹时,我们会看到三个合约。
Router02 是 Router01,增加了对转账费用代币的附加功能。当我们查看 Router02 的接口时,可以看到它继承自 Router01(红框)(这意味着它实现了所有的功能),并具有以下附加功能,所有这些功能都是用于支持转账费用代币进行操作的(黄色高亮)。
让我们从兑换代币的 Router 函数开始。这个功能有两个函数来完成(绿色高亮)。
这两个函数名称的区别如下:
swapExactTokensForTokens
中,“第一个代币是确切的”意味着你兑换的输入代币数量是固定的。swapTokensForExactTokens
中,“第二个代币是确切的”表示你希望接收的输出代币数量是固定的。如果用户只能兑换两种代币,那么他们将向这些函数提供一个 address[] calldata path
数组(用蓝色高亮标出)[address(tokenIn), address(tokenOut)]
。如果他们跨池跳转,则需要指定 [address(tokenIn), address(intermediateToken), …, address(tokenOut)]
。
在 swap**Exact**TokensForTokens
的情况下,用户确切地指定他们将存入的第一个代币的数量,以及他们愿意接受的输出代币的最低数量。
例如,假设我们想要以 25 个 token0
兑换 50 个 token1
。如果这是当前状态下的确切价格,那么在我们的交易确认之前,价格在变化时没有容错余地,可能会导致回滚。因此,我们改为指定最低输出为 49.5 token1
,隐含留下 1% 的容错。
在这种情况下,我们指定我们希望确切获得 50 个 token1
,但是我们愿意最多交易 25.5 个 token0
来获取它。
大多数使用 EOA 的用户可能会选择使用确切输入函数,因为他们需要进行批准步骤,如果他们需要输入超过批准的数量,交易就会失败。通过使用确切输入,他们可以批准确切的数量。然而,与 Uniswap 集成的智能合约可能会有更复杂的需求,因此路由器为它们提供了两个选项。
当输入是确切的(swapExactTokensForTokens)时,该函数预测单个兑换或一系列兑换的预期输出。如果结果输出低于用户指定的数量,函数会回滚。反之对于确切输出:它计算所需输入,并在超过用户指定的阈值时回滚。
然后,两个函数都会将用户的代币转移到成对合约中(请记住,Uniswap V2 Pair 需要在调用成对合约函数 swap()
之前将代币发送到合约)。最后,它们都调用下一个讨论的内部 _swap()
函数。
在内部,所有公开的以 swap()
为名称的函数都会调用下面展示的 _swap()
内部函数。
请记住,核心 swap 函数 的函数签名指定了两个代币的 amountOut
,amountIn
由函数调用之前转移的金额隐含表示。
记住添加流动性的安全检查吗?具体来说,我们希望确保以完全相同的比例存入两种代币,否则我们铸造的 LP 代币数量...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!