赞
踩
1、软件环境:
ubuntu18.04
npm 版本:8.11.0
node 版本:v16.15.1
2、下载源代码:
git clone https://github.com/Uniswap/uniswap-v2-core.git
git clone https://github.com/Uniswap/uniswap-v2-periphery.git
3、申请一个 api :
https://infura.io
4、编译合约
首先是 uniswap-v2-core 项目,进入目录后拉取依赖然后编译:
cd uniswap-v2-core
yarn
yarn compile
编译后的代码存放在 build 目录,我们需要把它拷贝至之前创建的 uniswap-contracts 目录。
cp -r build …/uniswap-contracts
接下来编译 uniswap-v2-periphery 项目,也是相同的步骤,最后将编译后的代码拷贝到 uniswap-contracts 目录:
cd uniswap-v2-periphery
yarn
yarn compile
cp -r build …/uniswap-contracts
5、部署合约
编译好的合约代码我们已经全部拷贝到 uniswap-contracts 目录。接下来就是部署合约了,这一步稍微麻烦一些,需要我们编写一个脚本。
首先在 uniswap-contracts 目录下创建一个文本文件 deploy.js,并将下面的代码拷贝进去。
以下是我能部署的脚本,跟参考文中的内容稍有不同:
const {Web3} = require(‘web3’)
const WETH9 = require(‘/home/lixin/Desktop/uniswap/uniswap-contracts/build/WETH9.json’) #都是写的绝对路径,相对路径居然不管用
const UniswapV2Pair = require(‘/home/lixin/Desktop/uniswap/uniswap-contracts/build/UniswapV2Pair.json’)
const UniswapV2Factory = require(‘/home/lixin/Desktop/uniswap/uniswap-contracts/build/UniswapV2Factory.json’)
const UniswapV2Router01 = require(‘/home/lixin/Desktop/uniswap/uniswap-contracts/build/UniswapV2Router01.json’)
const UniswapV2Router02 = require(‘/home/lixin/Desktop/uniswap/uniswap-contracts/build/UniswapV2Router02.json’)
const endpoint = ‘https://sepolia.infura.io/v3/6ac7856aebfd44c489’; # https://infura.io 网申请的一个api
const hexPrivateKey = ‘’; #钱包私匙
async function sendTransaction(web3, chainId, account, data, nonce, gasPrice) {
const message = {
from: account.address,
gas: 7000000,
gasPrice: gasPrice,
data: data.startsWith(‘0x’) ? data : ‘0x’ + data,
nonce: nonce,
chainId: chainId
}
const transaction = await account.signTransaction(message)
return web3.eth.sendSignedTransaction(transaction.rawTransaction)
}
(async () => {
const options = { timeout: 1000 * 30 }
const web3 = new Web3(endpoint)
const account = web3.eth.accounts.privateKeyToAccount(hexPrivateKey)
const chainId = await web3.eth.getChainId() const gasPrice = await web3.eth.getGasPrice() let nonce = await web3.eth.getTransactionCount(account.address) // deploy WETH contract let weth = null { const contract = new web3.eth.Contract(WETH9.abi) const data = contract.deploy({ data: WETH9.bytecode }).encodeABI() const receipt = await sendTransaction(web3, chainId, account, data, nonce, gasPrice) console.info('WETH:', weth = receipt.contractAddress) nonce = Number(nonce) nonce = nonce + 1 } // deploy UniswapV2Factory contract let factory = null { const contract = new web3.eth.Contract(UniswapV2Factory.abi) const options = { data: UniswapV2Factory.bytecode, arguments: [account.address] } const data = contract.deploy(options).encodeABI() const receipt = await sendTransaction(web3, chainId, account, data, nonce, gasPrice) console.info('UniswapV2Factory:', factory = receipt.contractAddress) nonce = Number(nonce) nonce = nonce + 1 } // deploy UniswapV2Router01 contract { const contract = new web3.eth.Contract(UniswapV2Router01.abi) const options = { data: UniswapV2Router01.bytecode, arguments: [factory, weth] } const data = contract.deploy(options).encodeABI() const receipt = await sendTransaction(web3, chainId, account, data, nonce, gasPrice) console.info('UniswapV2Router01:', receipt.contractAddress) nonce = Number(nonce) nonce = nonce + 1 } // deploy UniswapV2Router02 contract { const contract = new web3.eth.Contract(UniswapV2Router02.abi) const options = { data: UniswapV2Router02.bytecode, arguments: [factory, weth] } const data = contract.deploy(options).encodeABI() const receipt = await sendTransaction(web3, chainId, account, data, nonce, gasPrice) console.info('UniswapV2Router02:', receipt.contractAddress) nonce = Number(nonce) nonce = nonce + 1 } let data = UniswapV2Pair.bytecode if (!data.startsWith('0x')) data = '0x' + data console.info('INIT_CODE_HASH:', web3.utils.keccak256(data))
})()
在与 deploy.js 文件同目录下执行拉取依赖命令
npm init -f
npm install web3
执行部署合约脚本
node deploy.js
lixin@ubuntu:~/Desktop/uniswap/uniswap-contracts/build$ node deploy.js
WETH: 0x380218198cfb54d8f1b86e9f6cffb6280f1b552a
UniswapV2Factory: 0x51c6bbb8d7d3adbade4ee9e191a416d59270e601
UniswapV2Router01: 0x4a108b0b88f6f79448ac628773d29e4492350a06
UniswapV2Router02: 0x9ac070709cd3443dccc837e99e90d52570f8b1f6
INIT_CODE_HASH: 0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f
正常情况下,会出现上面的输出,如果有异常,估计是钱包中测试币不够,部署上面几个合约大致要 0.3个 ETH测试币
6、部署前端
下载前端代码:git clone https://github.com/Uniswap/uniswap-interface.git
拉取依赖:
cd uniswap-interface
yarn
由于我们部署了新的合约,而前端配置里面还是 uniswap 官方的合约地址,所以需要进行如下修改:
修改 uniswap-interface/src/constants/index.ts 文件中 ROUTER_ADDRESS 的值为
U
n
i
s
w
a
p
V
2
R
o
u
t
e
r
02
。修改
u
n
i
s
w
a
p
−
i
n
t
e
r
f
a
c
e
/
s
r
c
/
s
t
a
t
e
/
s
w
a
p
/
h
o
o
k
s
.
t
s
文件中
B
A
D
R
E
C
I
P
I
E
N
T
A
D
D
R
E
S
S
E
S
数组的值为
[
{UniswapV2Router02}。 修改 uniswap-interface/src/state/swap/hooks.ts文件中 BAD_RECIPIENT_ADDRESSES 数组的值为 [
UniswapV2Router02。修改uniswap−interface/src/state/swap/hooks.ts文件中BADRECIPIENTADDRESSES数组的值为[{UniswapV2Factory}, ${UniswapV2Router01}, ${UniswapV2Router02}]。
修改 uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.cjs.development.js 和 uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.esm.js 文件中 FACTORY_ADDRESS 为 ${UniswapV2Factory}。
修改 uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.cjs.development.js 和 uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.esm.js 文件中 INIT_CODE_HASH 为 ${INIT_CODE_HASH}。
修改 uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.cjs.development.js 和 uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.esm.js 文件中全局变量 WETH,将其中 key 为 GÖRLI 的 Token 类型的地址修改为 ${WETH}。
上面就是最后一行,我不确定是不是修改对了,其它的直接用部署合约时控制台打印出来的合约地址替换
7、运行前端程序
yarn start
我是输出如下:
You can now view @uniswap/interface in the browser.
Local: http://localhost:3000
On Your Network: http://192.168.198.129:3000
Note that the development build is not optimized.
To create a production build, use yarn build.
8、在浏览器中输入 http://192.168.198.129:3000 查看效果。
我在虚拟机中用火狐 能正常运行前端,,但在外面主机上用谷哥就运行不了,不知什么原因
9、遇到的问题与解决方法
编译合约的时候,遇到编译不过,但也没有解决,第二天早上再来编译居然可以编译通过,不知什么情况 ,其实官网上已有编译好的,可以直接下载后直接部署,这个只是没试过
部署合约的时候,主要是上面部署脚本中的 gas 可能会小了,取决于网络拥堵情况吧,不差币的话,调大一点
部署合约的时候还遇到 nonce = nonce + 1 报错,然后问AI ,AI建议 nonce = Number(nonce) 转换一下,居然跟网上的参考文中的不一样,不知差异是如何引起的
部署合约的时候跟原文部署脚本中不一样的地方有二个,下面是我能成功部署的修改
const {Web3} = require(‘web3’)
const web3 = new Web3(endpoint) 创建 web3对象的语句跟原文不一样
10、参考链接:
https://segmentfault.com/a/1190000040401731
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。