Daoleno

UniswapV3 部署指南

July 29, 2021 • ☕️☕️ 9 min read

本文将会介绍如何部署 UniswapV3Goerli 测试网,并与 uniswap-interface 进行交互。

全文分为四个部分:

合约部署

合约验证

前端及SDK修改

前端交互

合约部署

UniswapV3 提供了基于 hardhat 的合约部署插件 uniswap-v3-deploy-plugin,我在此基础上添加了 quoter 合约部署功能,并编写了一个部署模版 deploy-uniswapv3-template,具体使用方式如下:

克隆仓库

git clone https://github.com/daoleno/deploy-uniswapv3-template.git

安装依赖

cd deploy-uniswapv3-template
yarn install

配置环境变量

INFURAAPIKEY 申请地址:https://infura.io/

ETHERSCANAPIKEY 申请地址:https://etherscan.io/myapikey

mv .env.example .env

# Config your MNEMONIC and INFURA_API_KEY in .env
MNEMONIC=test test test test test test test test test test test test
INFURA_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ETHERSCAN_API_KEY=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

部署合约到测试网

npx hardhat deploy-uniswap --network goerli --verbose

部署成功后,会打印合约地址

┌──────────────────────┬────────────────────────────────────────────┐
│ Contract             │ Address                                    │
├──────────────────────┼────────────────────────────────────────────┤
│ weth9                │ 0x28cf6F88282E1A3DdF2AAFB5488a960902914432 │
├──────────────────────┼────────────────────────────────────────────┤
│ factory              │ 0x5558eC0BfAe9760A9b1E9eaeB96b38A9D19ED7F9 │
├──────────────────────┼────────────────────────────────────────────┤
│ quoter               │ 0xcAbae090B6023c22F755E7fDD367ea62B1eABa8d │
├──────────────────────┼────────────────────────────────────────────┤
│ router               │ 0x03463cc9701e20E43BD31DdeC75f97B734D0f6D9 │
├──────────────────────┼────────────────────────────────────────────┤
│ nftDescriptorLibrary │ 0xac3046ba564e6c228C1698d34490913CEB8756F2 │
├──────────────────────┼────────────────────────────────────────────┤
│ positionDescriptor   │ 0xBFc017043DC2d0f77d9317Aea9f073FB7352CDE5 │
├──────────────────────┼────────────────────────────────────────────┤
│ positionManager      │ 0x8eabAbC5dc0040FB4e349CF5D8deAa8DFBd66863 │
└──────────────────────┴────────────────────────────────────────────┘

合约验证

Hardhat 集成了 Etherscan API,合约验证将会调用相关 API 自动化验证合约

# verify factory contract
$ npx hardhat verify --config hardhat.config.factory.ts --network goerli 0x5558eC0BfAe9760A9b1E9eaeB96b38A9D19ED7F9

# verify quoter contract
$ npx hardhat verify --config hardhat.config.router.ts --network goerli 0xcAbae090B6023c22F755E7fDD367ea62B1eABa8d "0x5558eC0BfAe9760A9b1E9eaeB96b38A9D19ED7F9" "0x28cf6F88282E1A3DdF2AAFB5488a960902914432"

# verify router contract
$ npx hardhat verify --config hardhat.config.router.ts --network goerli 0x03463cc9701e20E43BD31DdeC75f97B734D0f6D9 "0x5558eC0BfAe9760A9b1E9eaeB96b38A9D19ED7F9" "0x28cf6F88282E1A3DdF2AAFB5488a960902914432"

# verify nftDescriptorLibrary contract
$ npx hardhat verify --config hardhat.config.nftDescriptor.ts --network goerli 0xac3046ba564e6c228C1698d34490913CEB8756F2

# verify positionDescriptor
$ npx hardhat verify --config hardhat.config.nftDescriptor.ts --network goerli 0xBFc017043DC2d0f77d9317Aea9f073FB7352CDE5 "0x28cf6F88282E1A3DdF2AAFB5488a960902914432"

# verify positionManager
$ npx hardhat verify --config hardhat.config.positionManager.ts --network goerli 0x8eabAbC5dc0040FB4e349CF5D8deAa8DFBd66863 "0x5558eC0BfAe9760A9b1E9eaeB96b38A9D19ED7F9" "0x28cf6F88282E1A3DdF2AAFB5488a960902914432" "0xBFc017043DC2d0f77d9317Aea9f073FB7352CDE5"

验证成功后会打印合约在浏览器上的地址,工厂合约验证成功的结果如下:

Successfully verified contract UniswapV3Factory on Etherscan.
https://goerli.etherscan.io/address/0x5558eC0BfAe9760A9b1E9eaeB96b38A9D19ED7F9#code

前端及SDK修改

克隆仓库

git clone https://github.com/Uniswap/uniswap-interface.git

安装依赖

yarn install

修改合约地址

修改下列文件中的 FACTORY_ADDRESS 为我们部署的工厂合约地址

node_modules/@uniswap/v3-sdk/dist/constants.d.ts

node_modules/@uniswap/v3-sdk/dist/v3-sdk.cjs.development.js

node_modules/@uniswap/v3-sdk/dist/v3-sdk.cjs.development.js.map

node_modules/@uniswap/v3-sdk/dist/v3-sdk.esm.js

node_modules/@uniswap/v3-sdk/dist/v3-sdk.esm.js.map

修改 src/constants/addresses.ts 文件中的下列地址为我们部署的地址

QUOTER_ADDRESSES

NONFUNGIBLE_POSITION_MANAGER_ADDRESSES

SWAP_ROUTER_ADDRESSES

src/constants/tokens.ts 文件的 WETH9_EXTENDED 变量上添加我们部署的 weth9 地址

[SupportedChainId.GOERLI]: new Token(
    SupportedChainId.GOERLI,
    '0x28cf6F88282E1A3DdF2AAFB5488a960902914432',
    18,
    'WETH',
    'Wrapped Ether'
  ),

前端交互

启动项目

yarn start

添加流动性

配置交易对的费用和数量

liquidity1

授权 UNI

approve

添加流动性

liquidity2

流动性添加成功后,可在流动性页面看到详情

liquidity3

执行 Swap

配置 swap 的数量

swap1

确认 swap 操作

swap2

swap 交易发送成功

swap3

收取流动性费用

fee

移除流动性

配置移除的比率

liquidity4

移除流动性交易发送成功

liquidity5