uniswap合约解读和部署
了解uniswap
==========================================
uniswap-V2-core
1. uniswap-V2-core是做什么的?
uniswap-V2-core主要做編譯和部署合約到指定的以太坊網(wǎng)絡(luò),其中最主要的合約是工廠合約UniswapV2Factory,主要是創(chuàng)建交易對(duì),依賴于配對(duì)合約UniswapV2Pair。
2. 視頻教程
手把手教你開(kāi)發(fā)去中心化交易所:手把手教你開(kāi)發(fā)去中心化交易所#1 Uniswap交易所開(kāi)發(fā)課 - 知乎
3. 源代碼執(zhí)行步驟
1. 確保nodejs版本為10以后版本 2. 可以將tsconfig.josn文件的target修改為es6 3. 執(zhí)行yarn,此時(shí)生成node_modules // 清除緩存的命令是:yarn cache clwan --force 4. 執(zhí)行yarn compile,此時(shí)將編譯合約文件,在build文件夾里面 5. 執(zhí)行yarn test,此時(shí)測(cè)試部署合約文件================================
uniswap-V2-periphery
1. uniswap-V2-periphery是做什么的?
uniswap-v2-periphery主要做編譯和部署合約到指定的以太坊網(wǎng)絡(luò),其中最主要的是路由合約UniswapV2Router02,工廠合約UniswapV2Factory和配對(duì)合約UniswapV2Pair需要通過(guò)路由合約UniswapV2Router02調(diào)用才能更好的完成交易所的全部功能。
2. 源代碼執(zhí)行步驟
1. 確保nodejs版本為10以后版本 2. 可以將tsconfig.josn文件的target修改為es6 3. 執(zhí)行yarn,此時(shí)生成node_modules // 清除緩存的命令是:yarn cache clwan --force 4. 執(zhí)行yarn compile,此時(shí)將編譯合約文件,在build文件夾里面 5. 執(zhí)行yarn test,此時(shí)測(cè)試部署合約文件=============================================
uniswap_deploy
1. uniswap_deploy是做什么的?
主要是通過(guò)truffle框架編譯部署工廠合約,路由合約,WETH合約,通過(guò)連接主網(wǎng)絡(luò)或者是測(cè)試網(wǎng)絡(luò),實(shí)現(xiàn)合約的百編譯部署,編譯部署合約得到合約地址,可供前端代碼uniswap-front-interface使用
2. 文檔教程
手把手教你部署自己的uniswap交易所:手把手教你部署自己的uniswap交易所 - 知乎
源碼結(jié)構(gòu)
Uniswap在Github上面開(kāi)源了全部合約代碼,其中包括核心合約,周邊合約兩部分.Uniswap還開(kāi)源了前端代碼,前端代碼使用React開(kāi)發(fā)
- 核心合約
- 周邊合約
- 前端代碼
在Uniswap的核心代碼中,主要包含3個(gè)合約:工廠合約,配對(duì)合約,ERC20合約.其中配對(duì)合約繼承了ERC20合約,我們可以把它們看作一個(gè)合約.工廠合約通過(guò)create2方法部署配對(duì)合約,所以在部署合約時(shí)只需要部署工廠合約.?周邊合約中包括一些示例代碼,例如價(jià)格預(yù)言機(jī),閃電交換,其中最重要的是路由合約.在周邊合約的代碼庫(kù)中,包含兩個(gè)路由合約:UnsiwapV2Router01,UnsiwapV2Router02.工廠合約和配對(duì)合約需要通過(guò)路由合約調(diào)用才能更好的完成交易所的全部功能,所以我們還要部署路由合約
兩個(gè)合約大部分相同,有小部分不同,如果將兩個(gè)合約的差異化合并成一個(gè)合約,部署的時(shí)候?qū)?huì)出現(xiàn)out of gas,所以才被分成了兩個(gè)合約.常用功能兩個(gè)合約中都包括,所以我們部署其中任意一個(gè)路由合約都可以
graph TD A(ERC20合約) B(配對(duì)合約) C(工廠合約) D(路由合約) A-->|繼承|B B-->|引用|C D-->|調(diào)用|C從瀏覽器中下載合約源碼
如果你對(duì)合約代碼并不熟悉,也可以跳過(guò)上面這部分,接下來(lái)我們將從以太坊瀏覽器中直接拷貝線上版合約源碼
- 工廠合約
- 路由合約01[可選]
- 路由合約02
部署合約
- 部署合約使用remix部署,因?yàn)椴煌暮霞s版本用truffle進(jìn)行部署的話比較麻煩。工廠合約和路由合約的源碼我保存在了uniswap_deploy/test目錄
安裝truffle
我們可以使用truffle作為部署合約的環(huán)境,其他的環(huán)境也可以,如果已經(jīng)安裝過(guò)truffle可以跳過(guò)這一步
$ npm install truffle -g創(chuàng)建項(xiàng)目
- 初始化目錄
- 目錄結(jié)構(gòu):
準(zhǔn)備部署賬戶
鏈接:手把手教你開(kāi)發(fā)去中心化交易所-Uniswap交易所開(kāi)發(fā)課程 以太坊區(qū)塊鏈智能合約系列課程 學(xué)習(xí)去中心化金融DeFi 去中心化交易所Dex 最專業(yè)視頻_嗶哩嗶哩_bilibili
Uniswap的路由合約部署在以太坊的主網(wǎng)和Ropsten,Rinkeby,Goerli,Kovan幾個(gè)測(cè)試網(wǎng)的合約地址都是相同的,這樣可以使Uniswap的前端不管切換到任何一個(gè)網(wǎng)絡(luò),路由地址都不會(huì)變.要想實(shí)現(xiàn)這個(gè)相同地址的部署,我們需要準(zhǔn)備一個(gè)全新的賬戶用來(lái)部署合約.全新的賬戶指的是在部署合約之前的nonce值為0.因?yàn)楹霞s的地址是根據(jù)你的賬戶地址和nonce值計(jì)算出來(lái)的,所以在不同網(wǎng)絡(luò)中,如果nonce值相同,部署出的合約地址也相同.
通過(guò)助記詞生成新賬戶
可以通過(guò)我之前錄制的視頻學(xué)習(xí)操作方法
- B站視頻
- 油管視頻
生成好助記詞之后,記得用英文助記詞,保存好助記詞,還有助記詞對(duì)應(yīng)的賬戶地址
向新地址轉(zhuǎn)帳ETH
部署合約需要的gas費(fèi)約為0.18個(gè)Ether,目前主網(wǎng)可能需要的更多.?通過(guò)一個(gè)已有Ether的賬戶向新賬戶轉(zhuǎn)帳.測(cè)試網(wǎng)的Ether可以通過(guò)每個(gè)測(cè)試網(wǎng)的水龍頭申請(qǐng)到測(cè)試幣.
- [獲取測(cè)試幣方法](跳轉(zhuǎn)中...?Lesson 03%232獲取ropsten測(cè)試幣)
轉(zhuǎn)賬完成后,將助記詞導(dǎo)入到Metamask中
準(zhǔn)備WETH合約地址
在部署路由合約時(shí),構(gòu)造函數(shù)中需要填入工廠合約的地址和WETH合約的地址,由于WETH合約的地址在主網(wǎng)和測(cè)試網(wǎng)的地址都不相同,所以需要找到每個(gè)網(wǎng)絡(luò)中WETH合約的地址.?WETH合約用于將Eth交換為erc20的Eth,由于Eth不是erc20的token,所以我們必須使用WETH作為交換媒介
{mainnet:'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',ropsten:'0xc778417E063141139Fce010982780140Aa0cD5Ab',rinkeby:'0xc778417E063141139Fce010982780140Aa0cD5Ab',goerli:'0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',kovan:'0xd0A1E359811322d97991E03f863a0C30C2cF029C' }申請(qǐng)infuraKey
在部署合約之前,我們還需要使用infura作為免費(fèi)節(jié)點(diǎn),所以需要申請(qǐng)一個(gè)infuraKey
- 申請(qǐng)地址:infura.io
- [申請(qǐng)方法](跳轉(zhuǎn)中...?Lesson 03%234注冊(cè)infura獲取測(cè)試網(wǎng)或主網(wǎng)的key)
使用remix部署合約
將工廠合約和路由合約的線上版本導(dǎo)入到remix中,在編譯合約的選項(xiàng)中,EVM VERSION選擇istanbul,COMPILER CONFIGURATION中選擇Enable optimization
配置truffle-congif.js
安裝@truffle/hdwallet-provider模塊,用于打開(kāi)助記詞的錢包,在項(xiàng)目目錄中運(yùn)行命令:
$ npm install @truffle/hdwallet-provider如果我們需要在每個(gè)網(wǎng)絡(luò)中都部署上Uniswap合約,就需要配置truffle-congif.js,可以將以下代碼全部拷貝粘貼到文件中,覆蓋原有代碼.
然后別忘了修改infuraKey和mnemonic助記詞
$ vim truffle-config.js const HDWalletProvider = require('@truffle/hdwallet-provider'); const infuraKey = "填寫(xiě)infuraKey"; const mnemonic = "填寫(xiě)助記詞"; module.exports = {networks: {mainnet: {provider: () => new HDWalletProvider(mnemonic, `https://mainnet.infura.io/v3/` infuraKey),network_id: 1,gas: 5500000,confirmations: 2,timeoutBlocks: 200,skipDryRun: true}, ropsten: {provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/` infuraKey),network_id: 3,gas: 5500000,confirmations: 2,timeoutBlocks: 200,skipDryRun: true}, rinkeby: {provider: () => new HDWalletProvider(mnemonic, `https://rinkeby.infura.io/v3/` infuraKey),network_id: 4,gas: 5500000,confirmations: 2,timeoutBlocks: 200,skipDryRun: true}, goerli: {provider: () => new HDWalletProvider(mnemonic, `https://goerli.infura.io/v3/` infuraKey),network_id: 5,gas: 5500000,confirmations: 2,timeoutBlocks: 200,skipDryRun: true}, kovan: {provider: () => new HDWalletProvider(mnemonic, `https://kovan.infura.io/v3/` infuraKey),network_id: 42,gas: 5500000,confirmations: 2,timeoutBlocks: 200,skipDryRun: true},},mocha: {// "timeout": 100000,},compilers: {solc: {version: "0.5.16", // Fetch exact version from solc-bin (default: truffle's version)// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)// settings: { // See the solidity docs for advice about optimization and evmVersion// optimizer: {// enabled: false,// runs: 200// },// evmVersion: "byzantium"// }}} }部署腳本
在編寫(xiě)truffle的部署腳本之前,先準(zhǔn)備一個(gè)你的常用賬戶作為設(shè)置交易所手續(xù)費(fèi)收取賬戶的管理員地址
然后在項(xiàng)目目錄中運(yùn)行命令,或者用編輯器創(chuàng)建文件migrations/2_deploy_contract.js
$ vim migrations/2_deploy_contract.js const UniswapV2Factory = artifacts.require("UniswapV2Factory"); const UniswapV2Router02 = artifacts.require("UniswapV2Router02"); const feeToSetter = '設(shè)置手續(xù)費(fèi)賬戶的管理員地址'; const WETH = {mainnet:'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',ropsten:'0xc778417E063141139Fce010982780140Aa0cD5Ab',rinkeby:'0xc778417E063141139Fce010982780140Aa0cD5Ab',goerli:'0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6',kovan:'0xd0A1E359811322d97991E03f863a0C30C2cF029C' }; module.exports = (deployer, network, accounts) => {deployer.deploy(UniswapV2Factory, feeToSetter).then((FactoryInstance)=>{return deployer.deploy(UniswapV2Router02,FactoryInstance.address,WETH[network]);}); };// 部署UniswapV2Router02會(huì)遇到Error: PollingBlockTracker - encountered an error while attempting to update latest block: 未解決。部署合約
在項(xiàng)目目錄運(yùn)行命令:
$ truffle migrate -f 2 --network mainnet $ truffle migrate -f 2 --network repsten $ truffle migrate -f 2 --network rinkeby $ truffle migrate -f 2 --network goerli $ truffle migrate -f 2 --network kovannpm i --save @uniswap/lib npm i --save @uniswap/v2-core我的truffle版本是5.1.44,solc版本為0.5.17現(xiàn)在我們就已經(jīng)將Uniswap的路由合約和工廠合約都部署在所有的網(wǎng)絡(luò)中了,你可以在控制臺(tái)的信息中找到兩個(gè)合約的地址,也可以在以太坊瀏覽器中找到,在以太坊瀏覽器中搜索新賬戶的地址,顯示出來(lái)的新賬戶的交易信息中,將會(huì)顯示兩個(gè)創(chuàng)建合約的交易,第二個(gè)創(chuàng)建的合約是路由合約,將路由合約的地址記錄下來(lái)
部署順序和構(gòu)造函數(shù)
- 構(gòu)造函數(shù)的參數(shù)是一個(gè)自己常用的賬戶地址
- 構(gòu)造函數(shù)的參數(shù)1是工廠合約的地址
- 參數(shù)2 是當(dāng)前網(wǎng)絡(luò)中WETH合約的地址,參考前文
=============================================
uniswap-front-interface
1. 源代碼執(zhí)行步驟
1. 將代碼中的工廠合約地址,路由地址改為自己部署過(guò)的地址 2. 打開(kāi)infura.io創(chuàng)建一個(gè)自己的rinkeby網(wǎng)絡(luò) 3. 在 .env 和 .env.local 文件,將REACT_APP_CHAIN_ID和REACT_APP_NETWORK_URL修改為自己在infura.io創(chuàng)建的id和key 4.執(zhí)行yarn,此時(shí)生成node_modules // 清除緩存的命令是:yarn cache clwan --force 5. 執(zhí)行yarn start2. 文檔教程
手把手教你部署自己的uniswap交易所:手把手教你部署自己的uniswap交易所 - 知乎
部署Uniswap前端
克隆前端代碼
在項(xiàng)目目錄運(yùn)行命令:
$ git clone https://github.com/Uniswap/uniswap-interface.git安裝依賴庫(kù)
在項(xiàng)目目錄運(yùn)行命令:
$ cd uniswap-interface $ yarn安裝完成后,可以先測(cè)試運(yùn)行一下,在uniswap-interface目錄運(yùn)行命令
$ yarn start如果運(yùn)行成功,將會(huì)打開(kāi)一個(gè)瀏覽器,同時(shí)打開(kāi)Uniswap的前端界面
修改路由地址
在Uniswap的前端中以常量的形式定義了Uniswap的路由地址,我們只需要修改路由地址就可以讓前端鏈接到你的路由合約中?修改文件:?項(xiàng)目目錄/uniswap-interface/src/constants/index.ts?第6行
import { AbstractConnector } from '@web3-react/abstract-connector' import { ChainId, JSBI, Percent, Token, WETH } from '@uniswap/sdk'import { fortmatic, injected, portis, walletconnect, walletlink } from '../connectors'export const ROUTER_ADDRESS = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' //修改成你的路由合約地址 ......保存后運(yùn)行yarn start即可看到效果
將代碼部署到GitHub Pages
創(chuàng)建GitHub項(xiàng)目
創(chuàng)建項(xiàng)目的方法就不在這里講了,不會(huì)的同學(xué)可以去搜索一下
將前端代碼添加到GitHub項(xiàng)目倉(cāng)庫(kù)
首先要?jiǎng)h除原先Uniswap項(xiàng)目中的.git目錄,在項(xiàng)目目錄運(yùn)行命令:
$ cd uniswap-interface $ rm -rf .git然后初始化git,并將Unsiwap前端代碼添加到自己的項(xiàng)目倉(cāng)庫(kù)中
git init git remote add origin https://github.com/用戶名/項(xiàng)目名.git安裝并部署gh-pages
我們將通過(guò)gh-pages模塊將前端代碼部署到github.io,在前端代碼的目錄運(yùn)行:
$ yarn add gh-pages接下來(lái)要編譯react和部署gh-pages,在前端代碼的目錄運(yùn)行:
$ yarn build修改前端代碼目錄中的package.json
$ vim package.json {"name": "@uniswap/interface","description": "Uniswap Interface","homepage": "https://用戶名.github.io/項(xiàng)目名稱",//修改這里 ......// 添加部署的腳本,還是在package.json中 ...... "scripts": {......"deploy": "gh-pages -d build" //添加這一行},保存退出之后,在前端代碼的目錄運(yùn)行:
$ git add . $ git commit -m "first commit" $ git push $ yarn deploy現(xiàn)在在瀏覽器中打開(kāi)https://用戶名.github.io/項(xiàng)目名稱/index.html就可以打開(kāi)自己的交易所啦.?如果不輸入地址結(jié)尾的index.html在項(xiàng)目剛部署之后會(huì)報(bào)錯(cuò),過(guò)一段時(shí)間就可以不輸入了.
擴(kuò)展
部署自己的weth
可以將以太坊瀏覽器中的weth源碼拷貝下來(lái),自己部署一個(gè)屬于自己的weth合約
可信token列表
Uniswap有一個(gè)自己的可信token列表,同樣被設(shè)置在項(xiàng)目目錄/uniswap-interface/src/constants/index.ts文件中,在最后一行就是.你可以將這個(gè)鏈接地址的文件拷貝下來(lái),設(shè)置成自己需要的可信token地址列表,然后上傳到github目錄中,再修改index.ts文件中的鏈接地址,這樣就可以讓你自己的交易所中擁有自己設(shè)置的可信token列表了
=========================================
在uniswap發(fā)行ERC20代幣
1. 執(zhí)行步驟
1. 因?yàn)槲疫B接的是rinkeby網(wǎng)絡(luò),所以,我是在rinkeby網(wǎng)絡(luò)發(fā)行的ERC20代幣,得到ERC20代幣的合約地址 2. 將前端代碼提起來(lái)后,將部署后的代幣合約地址在添加流動(dòng)性的選擇代幣欄里粘貼后就會(huì)出現(xiàn)自己部署的代幣,然后在代幣那點(diǎn)擊添加就可以了2. 圖案教程
https://www.icointime.com/post/908252215416.html
===================================
手把手教你搭建Token-List | 解決uniswap上幣沒(méi)有l(wèi)ogo的問(wèn)題
1. 文檔鏈接
鏈接:手把手教你搭建Token-List | 解決uniswap上幣沒(méi)有l(wèi)ogo的問(wèn)題_BUG設(shè)計(jì)師-CSDN博客_tokenlist
=========================================
如何創(chuàng)建一個(gè)ERC20代幣并將其接入U(xiǎn)niswap去中心化 交換協(xié)議以便增減這個(gè)代幣的流動(dòng)性。
1. 文檔鏈接
Uniswap接入開(kāi)發(fā)指南 | 學(xué)習(xí)軟件編程
2. 源碼
https://github.com/oceanprotocol/Nautilus/tree/master/3-uniswap
==========================================
cuiswap-master
1. cuiswap-master是什么?
是模仿uniswap去中心化交易所的一個(gè)產(chǎn)品
====================================
總結(jié)
后端代碼
將工廠合約,路由合約,weth合約進(jìn)行部署得到合約地址
前端代碼
將ETH換成SAR ------> 連接的是rinkeby網(wǎng)絡(luò),所以顯示的是ETH的代幣符號(hào), 如果連接自己的網(wǎng)絡(luò)有自己的SAR代幣就會(huì)顯示自己的SAR代幣 (有問(wèn)題:不能連接以太坊網(wǎng)絡(luò)之外的網(wǎng)絡(luò),需要修改前端代碼邏輯,前端react和ts代碼不熟,就沒(méi)有繼續(xù)了)
發(fā)個(gè)CCMD的erc20代幣 ------> 將CCMD的erc20代幣部署到自己想要部署的網(wǎng)絡(luò)中, 然后將部署后的代幣合約地址在添加流動(dòng)性的選擇代幣欄里粘貼后就會(huì) 出現(xiàn)自己部署的代幣,然后在代幣那點(diǎn)擊添加就可以了
首次添加代幣后,可以在添加流動(dòng)性頁(yè)面自定義兩個(gè)資產(chǎn)的兌換比例
?
總結(jié)
以上是生活随笔為你收集整理的uniswap合约解读和部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不安全的文件上传基本原理(Unsafe
- 下一篇: 基于STM32F4的CANOpen移植教