使用Uniswap V2部署自己的去中心化交易所

chainpip發表於2022-10-22

Dapp連結:https://www.chainpip.com/dapp-view/6724

 

部署UniswapV2前需要準備的智慧合約專案:

uniswap-v2-core: 核心合約

uniswap-v2-periphery: 與核心合約互動的邊緣合約,主要就是路由合約

uniswap-lib: 工具合約

整合以上三個專案到一個專案中:

 

 

uniswap-v2-core

core核心主要有三個合約檔案:

UniswapV2Factory.sol 工廠合約

l **UniswapV2Pair.sol**配對合約

l **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 hashUniswapV2Pairbytecode透過keccak-256計算的值:

 

 

點選Bytecode按鈕,在彈框中複製**Bytecode,**開啟網址 http://emn178.github.io/online-tools/keccak_256.html

 

 

記得選擇Input type"Hex",最終得到的"02253df52a97965e4b0f62119b1048e43d71c7e02dd706e7a1d07655ed5f8642",就是我們要的init code hash

部署合約

只要部署三個合約:

l UniswapV2Factory

l WETH (可選, 也可使用鏈上已有的WETH地址)

l UniswapV2Router01

 

 

UniswapV2Factory引數:

l _feeToSetter: 設定手續費的管理員,可任選一個錢包地址

UniswapV2Router01引數:

l _factory: UniswapV2Factory部署後的合約地址

l _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

 

 

 

 

相關文章