在很多情景下, 合约开发需要先进行测试.
remix/ganache等工具可以在一定程度上帮忙解决合约测试的问题.
但是关于代币交换的合约测试, 一般情况下都选择在testnet
上面进行.
但testnet
`由于是公共的, 存在测试代币少/网络问题/部署延迟等一系列问题, 并不是最优选.
2年前在本地部署过uniswap
`的前端程序用来测试代币的交换, 今天翻出来记录下.
假设你已经部署了Factory/Router/WETH/Multicall合约, 并且已经获取到了init code has值.
在github上面找到uniswap的代码仓库并clone到本地.
git clone https://github.com/Uniswap/interface uniswap-local
// 使用v2的最终版本
git checkout v2.6.5
增加本地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
还需要添加一个本地节点的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')
修改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中的任何合约
合约链接: