uniswapV2交易流程介绍(代码层面)
V2是uniswap协议的第二版,第一版只支持ETH/ERC20交易对,uniswap应该是目前最大的去中心化交易所,目前常用的是V2,和V3,EVM链的很多去中心化交易所,都是基于uniswap V2改造的,这里先介绍V2(路由合约)。 uniswap V2 提供的功能有,添加流动性,币币兑换,赎回流动性,闪电兑换(不在路由合约)。这里讲解一下,我们添加流动性,赎回流动性,交换币种时都发生了什么,在合约层面调用了哪些方法,不讲细节,只讲重点。
UniswapV2Router02 路由合约(下文用Router) UniswapV2Factory 工厂合约(下文用Factory) UniswapV2Pair 交易对合约(下文用Pair)
与前端直接交互的是路由合约 router
addLiquidity addLiquidityETH 这两个方法区别在于,两种币之中,如果有一个是ETH的,前端就会调用addLiquidityETH。如果是两个普通ERC20的币种,就用addLiquidity。(实际上,addLiquidityETH里也是把ETH也是要换成WETH,最后还是变成ERC20/ERC20交易对) 添加流动性时,如果是第一次添加会判断是否存在这两种币对,不存在就调用工厂合约Factory的createPair方法创建交易对地址。 添加的tokenA和tokenB数量会存到交易对地址里,然后通过交易对合约Pair 铸造一定数量的凭证pairToken给用户,到时用这些pairToken赎回tokenA和tokenB。 代码层面流程(省略参数): UniswapV2Router02.addLiquidity() - 如果不存在交易对 Factory.createPair() - Pair.mint()
币币交换Router V2合约提供了很多方法,大部分从V1遗留的。为了简洁,下面方法不给出参数 swapExactTokensForTokens() // ERC20Token直接的兑换 swapTokensForExactTokens() // 同上 swapExactETHForTokens() // WETH换ERC20 swapTokensForExactETH() // ERC20换WETH swapExactTokensForETH() // ERC20换ETH swapETHForExactTokens() // ETH换ERC20 swapExactTokensForTokensSupportingFeeOnTransferTokens() // 支持收取费用的token swapExactETHForTokensSupportingFeeOnTransferTokens() // 同上,换成了ETH而已 swapExactTokensForETHSupportingFeeOnTransferTokens() // 同上
总结一下以上方法规律,含有ETH,就是可兑换ETH交易对的,其中ExtraETH就是WETH,最后三个带SupportingFee的方法是V2新增的,意思是支持转账时收取费用的token,和前面方法计算输入token数量方式不一样。 代码层面流程: Router.swapExactTokensForTokens() - (中间涉及计算输出数量UniswapV2Library.getAmountsOut ) Pair.swap() swap涉及到一个计算公式:x * y = k,恒定乘积算法 例如 A 换 B,池子里的流动性乘积 k 在交易前后是不变的。这里不考虑流动性挖矿的费用。如 交易对A/B 里有100 A ,200 B,现在用10A能换多少B呢,
输出B数量 =数量B - k / (A + 输入A数量) = 200 - (100 * 200) / (100+10) = 18.1
</br>
removeLiquidity removeLiquidityETH removeLiquidityWithPermit removeLiquidityETHWithPermit removeLiquidityETHSupportingFeeOnTransferTokens removeLiquidityETHWithPermitSupportingFeeOnTransferTokens 区别在于,如果赎回token中有ETH,则用 removeLiquidityETH。没带permit的用户要先授权给Router合约可以转走pairToken,带permit的把签名做参数一起传输,少一步授权交易。SupportingFee和兑换一样,支持转账收手续费的token。 上面添加流动性说过,赎回流动性,是用pairToken换回tokenA和tokenB, Pair会销毁用户的pairToken,计算出能换回的两种token数量,转给用户。 代码流程: Pair.approve() , Router.removeLiquidity() - Pair. burn()
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!