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