import { BigNumber } from 'ethers' import { ethers } from 'hardhat' import { MockTimeUniswapV3Pool } from '../../typechain/MockTimeUniswapV3Pool' import { TestERC20 } from '../../typechain/TestERC20' import { UniswapV3Factory } from '../../typechain/UniswapV3Factory' import { TestUniswapV3Callee } from '../../typechain/TestUniswapV3Callee' import { TestUniswapV3Router } from '../../typechain/TestUniswapV3Router' import { MockTimeUniswapV3PoolDeployer } from '../../typechain/MockTimeUniswapV3PoolDeployer' import { Fixture } from 'ethereum-waffle' interface FactoryFixture { factory: UniswapV3Factory } async function factoryFixture(): Promise { const factoryFactory = await ethers.getContractFactory('UniswapV3Factory') const factory = (await factoryFactory.deploy()) as UniswapV3Factory return { factory } } interface TokensFixture { token0: TestERC20 token1: TestERC20 token2: TestERC20 } async function tokensFixture(): Promise { const tokenFactory = await ethers.getContractFactory('TestERC20') const tokenA = (await tokenFactory.deploy(BigNumber.from(2).pow(255))) as TestERC20 const tokenB = (await tokenFactory.deploy(BigNumber.from(2).pow(255))) as TestERC20 const tokenC = (await tokenFactory.deploy(BigNumber.from(2).pow(255))) as TestERC20 const [token0, token1, token2] = [tokenA, tokenB, tokenC].sort((tokenA, tokenB) => tokenA.address.toLowerCase() < tokenB.address.toLowerCase() ? -1 : 1 ) return { token0, token1, token2 } } type TokensAndFactoryFixture = FactoryFixture & TokensFixture interface PoolFixture extends TokensAndFactoryFixture { swapTargetCallee: TestUniswapV3Callee swapTargetRouter: TestUniswapV3Router createPool( fee: number, tickSpacing: number, firstToken?: TestERC20, secondToken?: TestERC20 ): Promise } // Monday, October 5, 2020 9:00:00 AM GMT-05:00 export const TEST_POOL_START_TIME = 1601906400 export const poolFixture: Fixture = async function (): Promise { const { factory } = await factoryFixture() const { token0, token1, token2 } = await tokensFixture() const MockTimeUniswapV3PoolDeployerFactory = await ethers.getContractFactory('MockTimeUniswapV3PoolDeployer') const MockTimeUniswapV3PoolFactory = await ethers.getContractFactory('MockTimeUniswapV3Pool') const calleeContractFactory = await ethers.getContractFactory('TestUniswapV3Callee') const routerContractFactory = await ethers.getContractFactory('TestUniswapV3Router') const swapTargetCallee = (await calleeContractFactory.deploy()) as TestUniswapV3Callee const swapTargetRouter = (await routerContractFactory.deploy()) as TestUniswapV3Router return { token0, token1, token2, factory, swapTargetCallee, swapTargetRouter, createPool: async (fee, tickSpacing, firstToken = token0, secondToken = token1) => { const mockTimePoolDeployer = (await MockTimeUniswapV3PoolDeployerFactory.deploy()) as MockTimeUniswapV3PoolDeployer const tx = await mockTimePoolDeployer.deploy( factory.address, firstToken.address, secondToken.address, fee, tickSpacing ) const receipt = await tx.wait() const poolAddress = receipt.events?.[0].args?.pool as string return MockTimeUniswapV3PoolFactory.attach(poolAddress) as MockTimeUniswapV3Pool }, } }