# 本地部署uniswap v2

By [kuimale](https://paragraph.com/@kuimale) · 2024-08-12

---

在很多情景下, 合约开发需要先进行测试.

remix/ganache等工具可以在一定程度上帮忙解决合约测试的问题.

但是关于代币交换的合约测试, 一般情况下都选择在`testnet`上面进行.

但`testnet`\`由于是公共的, 存在测试代币少/网络问题/部署延迟等一系列问题, 并不是最优选.

2年前在本地部署过`uniswap`\`的前端程序用来测试代币的交换, 今天翻出来记录下.

假设你已经部署了Factory/Router/WETH/Multicall合约, 并且已经获取到了init code has值.

1.  在[github](https://github.com/Uniswap/interface)上面找到uniswap的代码仓库并clone到本地.
    
        git clone https://github.com/Uniswap/interface uniswap-local
        // 使用v2的最终版本
        git checkout v2.6.5
        
    
2.  增加本地ganache节点, 修改以下文件:
    
        假设新增节点名为GANACHE.
        
        打开src/constants/index.ts, 在ChainTokenList末尾加上[ChainId.GANACHE]: [WETH[ChainId.GANACHE]]
        
        打开src/constants/v1/index.ts, 在V1_FACTORY_ADDRESSES末尾加上[ChainId.GANACHE]: ''  (如果你会用到uniswap v1)
        
        打开src/constants/multicall/index.ts, 在MULTICALL_NETWORKS末尾加上[ChainId.GANACHE]: '你的Multicall合约地址'
        
        打开src/state/lists/hooks.ts, 在TokenAddressMap末尾加上[ChainId.GANACHE]: {}
        
        打开src/utils/index.ts, 在ETHERSCAN_PREFIXES末尾加上1337: 'ganache.'
        
        打开src/components/Header/index.tsx, 在NETWORK_LABELS加上[ChainId.GANACHE]: 'Ganache'  (这里是在页面右上角显示的节点名称)
        
        打开src/connectors/index.ts, 在supportedChainIds: [1, 3, 4, 5, 42]末尾加上1337
        
        由于ChainId是从@uniswap/sdk中引用的, 所以还需要修改一下文件:
        
        打开node_modules/@uniswap/sdk/dist/sdk.cjs.development.js, 找到function (ChainId)函数, 在末尾加上ChainId[ChainId["GANACHE"] = 1337] = "GANACHE";
        
        打开node_modules/@uniswap/sdk/dist/sdk.esm.js, 找到function (ChainId)函数, 在末尾加上ChainId[ChainId["GANACHE"] = 1337] = "GANACHE";
        
        打开node_modules/@uniswap/sdk/dist/constants.d.ts, 在ChainId末尾加上GANACHE = 1337
        
    
3.  还需要添加一个本地节点的WETH:
    
        打开node_modules/@uniswap/sdk/dist/sdk.cjs.development.js, 在WETH末尾添加_WETH[exports.ChainId.GANACHE] = /*#__PURE__*/new Token(exports.ChainId.GANACHE, '你的WETH合约地址', 18, 'WETH', 'Wrapped Ether')
        
        打开node_modules/@uniswap/sdk/dist/sdk.esm.js, 在WETH末尾添加_WETH[ChainId.GANACHE] = /*#__PURE__*/new Token(ChainId.GANACHE, '你的WETH合约地址', 18, 'WETH', 'Wrapped Ether')
        
    
4.  修改uniswap v2文件:
    
        打开src/constants/multicall/index.ts, 将MULTICALL_NETWORKS中的[ChainId.GANACHE]替换为你部署的Multicall合约地址
        
        打开src/constants/index.ts, 将ROUTER_ADDRESS替换为你部署的Router合约地址
        
        打开src/state/swap/hooks.ts, 将BAD_RECIPIENT_ADDRESSES里面的Factory和Router合约地址替换为你自己部署的
        
        打开node_modules/@uniswap/sdk/dist/sdk.cjs.development.js, 将FACTORY_ADDRESS替换为你部署的Factory合约地址;
        将INIT_CODE_HASH替换为你自己的init code hash
        
        打开node_modules/@uniswap/sdk/dist/sdk.esm.js, 将FACTORY_ADDRESS替换为你部署的Factory合约地址;
        将INIT_CODE_HASH替换为你自己的init code hash
        
    

最后, 执行yarn install安装依赖, 再执行yarn运行程序即可.

不要忘记启动本地ganache服务.

另外, 你还可以通过免费的ipfs服务提供快速代币列表, 在 `src/constants/lists.ts` 文件中的 `DEFAULT_LIST_OF_LISTS` 中添加你的ipfs文件链接即可.

注意, multicall合约必须存在, 否则本地uniswap v2程序中将无法检索你部署到ganache中的任何合约

合约链接:

[WETH合约](https://cn.etherscan.com/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code)

[Factory合约](https://cn.etherscan.com/address/0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f#code)

[Router合约](https://cn.etherscan.com/address/0x7a250d5630b4cf539739df2c5dacb4c659f2488d#code)

[bytecode转initcode](https://emn178.github.io/online-tools/keccak_256.html)

---

*Originally published on [kuimale](https://paragraph.com/@kuimale/uniswap-v2)*
