{"content":{"title":"使用Uniswap V2部署自己的去中心化交易所","body":"![图片1.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/qHhCXflP6355fd1aa3815.png)\r\nDapp链接：https:\/\/www.chainpip.com\/dapp-view\/6724\r\n\r\n部署UniswapV2前需要准备的智能合约项目:\r\nuniswap-v2-core: 核心合约\r\nuniswap-v2-periphery: 与核心合约交互的边缘合约，主要就是路由合约\r\nuniswap-lib: 工具合约\r\n整合以上三个项目到一个项目中：\r\n\r\n![图片2.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/scstCva16355fd3f95958.png)\r\n# uniswap-v2-core\r\ncore核心主要有三个合约文件:\r\n**UniswapV2Factory.sol**： 工厂合约\r\n**UniswapV2Pair.sol：**配对合约\r\n**UniswapV2ERC20.sol：**LP Token 合约\r\n\r\n**UniswapV2Pair.sol**管理着流动性资金池，不同币对有着不同的实例，比**UniswapV2Pair.sol**, 如 USDT-WETH 这一个币对，就对应一个**UniswapV2Pair.sol**合约地址**,**DAI-WETH **又对应另一个UniswapV2Pair.sol**。\r\n**UniswapV2ERC20.sol**则是用户往资金池里注入流动性的一种凭证，也称为流动性代币，其实也是一种ERC20代币，同样支持转账功能。当用户在Uniswap v2添加两个交易对( 如USDT-WETH)，也就是添加流动性, Uniswap会增加对应UniswapV2ERC20.sol实例(如USDT-WETH LP Token)的余额，Uniswap根据用户持有LP Token的额度，计算手续费收益奖励给用户。\r\n每个UniswapV2Pair.sol都有对应的一种UniswapV2ERC20.sol与之绑定。其实，**UniswapV2Pair** 继承了 **UniswapV2ERC20**，所以配对合约本身其实也是 LP Token 合约。\r\n**UniswapV2Factory.sol**则是用来部署UniswapV2Pair.sol的，通过工厂合约的 createPair() 函数来创建新的配对合约实例。\r\n# uniswap-v2-periphery\r\nperiphery核心有两个合约文件：\r\n**UniswapV2Router01.sol**：路由合约 01 版本\r\n**UniswapV2Router02.sol**：路由合约 02 版本，相比 01 版本主要增加了几个支持交税费用的函数\r\n这两个合约只要部署一个就行，本教程只部署UniswapV2Router01.sol\r\n# uniswap-lib\r\n提供uniswap-v2-periphery的函数库。\r\n\r\n# 开始部署Uniswap V2\r\n在部署Uniswap V2之前，我们需要改下Uniswap V2代码中init code hash值，否则即便部署成功，也使用不了。位于项目contracts\/libraries\/UniswapV2Library.sol文件中的pairFor函数:\r\n\r\n![图片3.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/aIg2lMz36355fdc8776ca.png)\r\ninit code hash是UniswapV2Pair的bytecode通过keccak-256计算的值:\r\n\r\n![图片4.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/IHxAUbmx6355fdcd2ae6d.png)\r\n点击Bytecode按钮,在弹框中复制**Bytecode值,**打开网址 http:\/\/emn178.github.io\/online-tools\/keccak_256.html\r\n\r\n![图片5.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/B1MMjnIe6355fdd74c388.png)\r\n记得选择Input type为\"Hex\",最终得到的\"02253df52a97965e4b0f62119b1048e43d71c7e02dd706e7a1d07655ed5f8642\"，就是我们要的init code hash\r\n# 部署合约\r\n只要部署三个合约:\r\nUniswapV2Factory\r\nWETH (可选, 也可使用链上已有的WETH地址)\r\nUniswapV2Router01\r\n\r\n![图片6.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/fcASDJls6355fde415e35.png)\r\nUniswapV2Factory参数:\r\n_feeToSetter: 设置手续费的管理员，可任选一个钱包地址\r\nUniswapV2Router01参数:\r\n_factory: UniswapV2Factory部署后的合约地址\r\n_WETH: WETH合约地址\r\n# 添加流动池\r\naddLiquidity：该接口支持添加两种 ERC20 代币作为流动性\r\naddLiquidityETH：与上一个接口不同，该接口提供的流动性资产，其中有一个是 ETH\r\n## 添加两个代币流动池\r\n\r\n![图片7.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/74uGXdNB6355fe00e2103.png)\r\n## 添加代币与ETH流动池\r\n\r\n![图片8.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/cjqQ1s3A6355fe06ae235.png)\r\n## 代币授权\r\n在添加流动性时，需要先授权代币给路由合约地址\r\n可以使用一下授权面板，记得修改底部的合约地址为要授权的代币地址\r\n\r\n![图片9.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/6lyCtkpk6355fe1348f52.png)\r\n## 交易\r\n**swapExactTokensForTokens**：用 ERC20 兑换 ERC20，但支付的数量是指定的，而兑换回的数量则是未确定的\r\n**swapTokensForExactTokens**：也是用 ERC20 兑换 ERC20，与上一个函数不同，指定的是兑换回的数量\r\n**swapExactETHForTokens**：指定 ETH 数量兑换 ERC20\r\n**swapTokensForExactETH**：用 ERC20 兑换成指定数量的 ETH\r\n**swapExactTokensForETH**：用指定数量的 ERC20 兑换 ETH\r\n**swapETHForExactTokens**：用 ETH 兑换指定数量的 ERC20\r\n**swapExactTokensForTokensSupportingFeeOnTransferTokens**：指定数量的 ERC20 兑换 ERC20，支持转账时扣费\r\n**swapExactETHForTokensSupportingFeeOnTransferTokens**：指定数量的 ETH 兑换 ERC20，支持转账时扣费\r\n**swapExactTokensForETHSupportingFeeOnTransferTokens**：指定数量的 ERC20 兑换 ETH，支持转账时扣费\r\n## 代币之间交易\r\n\r\n# ![图片10.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/10\/gF0psLiz6355fe416b6da.png)\r\n\r\n原文链接（含可复制代码）：https:\/\/www.chainpip.com\/dynamic\/231"},"author":{"user":"https:\/\/learnblockchain.cn\/people\/7546","address":null},"history":null,"timestamp":1666580164,"version":1}