uniswapV2交易流程简介

uniswapV2交易流程介绍(代码层面)

uniswap V2 协议

V2是uniswap协议的第二版,第一版只支持ETH/ERC20交易对,uniswap应该是目前最大的去中心化交易所,目前常用的是V2,和V3,EVM链的很多去中心化交易所,都是基于uniswap V2改造的,这里先介绍V2(路由合约)。 uniswap V2 提供的功能有,添加流动性,币币兑换,赎回流动性,闪电兑换(不在路由合约)。这里讲解一下,我们添加流动性,赎回流动性,交换币种时都发生了什么,在合约层面调用了哪些方法,不讲细节,只讲重点。

uniswap V2的主要合约:

UniswapV2Router02 路由合约(下文用Router) UniswapV2Factory 工厂合约(下文用Factory) UniswapV2Pair 交易对合约(下文用Pair)

与前端直接交互的是路由合约 router

1.添加流动性

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()

2.币币兑换

币币交换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>

3.赎回流动性

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()

点赞 2
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
stephenCheung
stephenCheung
0xacd5...DA49
java,go,solidity,rust智能合约开发者,专注defi领域研究