uniswap-v2部署过程

uniswap-v2的前端以及合约代码均已不再更新,但官方项目中比较零散,为了能更直观的部署,我将所有代码均整合到如下项目中,只需要看该项目即可uniswap-v2 ,本文也是基于该项目进行讲解的。

1. 概述

  1. 本文基于Goerli测试网进行部署,主网部署方式也基本一致,可参考。
  2. 本项目uniswap-v2 的目录结构大体如下:
1
2
3
4
etherscan:将合约整合成一个文件并上传etherscan进行验证
frontnd:存放前端代码,用于和合约进行交互
hardhat:其中存放着4个合约项目。uniswap-factory表示工厂合约、uniswap-router表示路由合约、WETH9顾名思义的协议合约、用于方便调试的ERC20合约
hardhat中的文件token.json是用于uniswap的token列表

在hardhat中,需要先做如下操作生成配置文件:

1
cp hardhat.config.js.backup hardhat.config.js

然后在hardhat.config.js,编辑如下两个字段
INFURA_API_KEY:表示在infura申请的goerli的key
ACCOUNT_PRIVATE_KEY: 你账户的私钥,其中需要有测试环境的ETH,获取方式这里不讲解
下文的部署均默认已完成上述操作。

2. 合约发布

  1. 添加依赖
1
2
cd ./uniswap-v2/hardhat
npm install --force
  1. 先发布WETH合约
1
npx hardhat --network goerli run scripts/deploy_1_weth9.js -h

获取合约地址:WETHAddress

备注:官方不同网络已经提供了相应的WETH合约,如果不想按上面发布该合约,可以直接从链上调用:
主网WETH9地址:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
GÖRLI测试网WETH9地址:0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6

  1. 接着发布factory工厂合约
    ./script/deploy_2_factory.js.js中,修改第30行,把deploy中的地址改为你自己账户的地址,然后:
1
npx hardhat --network goerli run scripts/deploy_2_factory.js 

获取合约地址:FactoryAddress
获取code(上传合约后,在etherscan中查看,或者自己代码调出):INIT_CODE_PAIR_HASH

  1. 发布router路由合约
    ./contract/router/libraries/UniswapV2Library.sol的第26行,更改hex中的内容为上面获取到的INIT_CODE_PAIR_HASH,前缀不用0x
    接着在./script/deploy_3_router.js中,修改第30行,把deploy中的地址改为你自己账户的地址以及上面WETH9的合约地址WETHAddress
    然后:
1
npx hardhat --network goerli run scripts/deploy_3_router.js

获取合约地址:RouterAddress

  1. 最后发布两个erc20合约,Token分别为AAABBB
    修改Token.sol结构体中的token名称和标识,然后即可发布不同的token
1
npx hardhat --network goerli run scripts/deploy_4_erc20.js

获取AAA Token合约地址:AAAAddress
获取BBB Token合约地址:BBBAddress

  1. 至此,合约发布完毕
    我已根据上述操作发布的合约地址如下(Goerli测试网):
    1. WETH9地址 :0xFe33eC9960E430608030e92860264B486Ae99Ef2
    2. UniswapV2Factory合约地址 :0x08b99e6b892da793b3da07db14d83c86337d5b1c
    3. UniswapV2Router02合约地址 :0x4A566ba09a8628d2a3BC7132f6F9F1D3Fe8Aca61
    4. AAA Token :0x41466d52a90dFa935463c38B7D477059D5B04093
    5. BBB Token :0xC180BA5FD897781f5764c1B079e21Be2a77855Ee

另外,UniswapV2Factory的INIT_CODE_PAIR_HASH = 0x6ea2252a145d03633feebbade3509ebd120dbe9d50dbf6bd343c366dc155dc67

3. 发布前端

  1. 下载依赖
1
2
cd frontend
yarn
  1. 官方提供了Goerli测试网的合约地址等信息,可以直接用。当然,如果自行发布了uniswap v2合约,需要根据上文生成的合约地址对前端项目作如下改动:

    1. 修改 frontend/src/constants/index.ts 文件中 ROUTER_ADDRESS 的值为 RouterAddress
    2. 修改 frontend/src/state/swap/hooks.ts文件中 BAD_RECIPIENT_ADDRESSES 数组的值为 [FactoryAddress, , $RouterAddress],数组第2个为空,这是早期的Router合约,目前也不用。
    3. frontend/node_modules/@uniswap/sdk/dist/sdk.cjs.development.jsuniswap-interface/node_modules/@uniswap/sdk/dist/sdk.esm.js uniswap-interface/node_modules/@uniswap/sdk/dist/sdk.cjs.production.min.jsfrontend/node_modules/@uniswap/sdk/dist/constants.d.ts这四个文件中:
      1. FACTORY_ADDRESS 若存在,则改为 FactoryAddress
      2. INIT_CODE_HASH 若存在,则改为 INIT_CODE_PAIR_HASH
      3. 若存在全局变量 WETH,则将其中keyGÖRLI的 Token 类型的地址修改为WETHAddress
  2. 启动

1
2
3
4
5
# 本地启动
yarn start

# 若要发布,可进行编译
yarn build

本地浏览器打开:http://localhost:3000 即可进行交互体验

4. 添加Token列表

./frontend/src/constants/lists.ts中的DEFAULT_LIST_OF_LISTS有一些默认Token列表,但要想进行AAABBB的swap,或者说要想自己控制swap自己的别的Token,就需要自己创建一个列表,该列表可以直接从前端页面上添加。
但是你会发现只能添加url,因此该列表上传到某个服务器,再把url添加进去即可。
该列表是一个json格式,完整的基于AAABBB,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
"name": "Test Tokens List",
"version": {
"major": 1,
"minor": 0,
"patch": 0
},
"logoURI": "https://www.bitxx.top/images/my_head-touch-icon-next.png",
"timestamp": "2022-11-24 00:00:00.000+00:00",
"tokens": [
{
"chainId": 5,
"address": "0x41466d52a90dFa935463c38B7D477059D5B04093",
"name": "AAA Token",
"symbol": "AAA",
"decimals": 18,
"logoURI": "https://www.bitxx.top/images/aaa.png"
},
{
"chainId": 5,
"address": "0xC180BA5FD897781f5764c1B079e21Be2a77855Ee",
"name": "BBB Token",
"symbol": "BBB",
"decimals": 18,
"logoURI": "https://www.bitxx.top/images/bbb.png"
}
]
}

我添加到gist上:https://gist.githubusercontent.com/bitxx/53780a04750e640b6e5171090b7707ac/raw/d77990cd7a69f7bf559dda874d9e401b747fa6a8/token.json
然后回到前端页面,加入上面的链接,即可进行swap等uniswapv2行为

4. 总结

本文编辑完毕

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信