import { task } from 'hardhat/config'; import { deployATokensAndRatesHelper, deployStableAndVariableTokensHelper, deployAaveProtocolDataProvider, deployLendingPoolAddressesProvider, //Test } from '../../helpers/contracts-deployments'; import { deployUniswapLendingPoolAddressesProvider, deployUniswapLendingPool, deployUniswapLendingPoolConfigurator, deployUniswapPriceOracle, deployUniswapAaveOracle, deployUniswapLendingRateOracle, deployUniswapLendingPoolCollateralManager, deployUniswapMockFlashLoanReceiver, deployUniswapWETHGateway, deployUniswapWalletBalancerProvider, } from '../../helpers/uniswap-contracts-deployments'; import { tEthereumAddress, eContractid, AavePools, ICommonConfiguration, iAssetBase, TokenContractId, IMarketRates, } from '../../helpers/types'; import { getLendingPoolAddressesProviderRegistry, getLendingPoolAddressesProvider, //Test getLendingPool, getLendingPoolConfiguratorProxy, getAllMockedTokens, getPairsTokenAggregator, } from '../../helpers/contracts-getters'; import { waitForTx, filterMapBy } from '../../helpers/misc-utils'; import { UniswapConfig } from '../../markets/uniswap'; import { insertContractAddressInDb } from '../../helpers/contracts-helpers'; import { setInitialAssetPricesInOracle, deployAllMockAggregators, setInitialMarketRatesInRatesOracleByHelper, } from '../../helpers/oracles-helpers'; import {getAllAggregatorsAddresses, getAllTokenAddresses} from '../../helpers/mock-helpers'; import { ConfigNames, getReservesConfigByPool, getTreasuryAddress, loadPoolConfig, getWethAddress, } from '../../helpers/configuration'; import { configureReservesByHelper, initReservesByHelper, } from '../../helpers/init-helpers'; import { ZERO_ADDRESS } from '../../helpers/constants'; const pool = ConfigNames.Uniswap; /** * @dev addressesProvider is actually created here, so we don't need to use getAddressesProvider */ task( 'dev:deploy-uniswap-market', 'Deploy uniswap market' ) .addFlag('verify', 'Verify contracts at Etherscan') .setAction(async ({ verify }, localBRE) => { await localBRE.run('set-DRE'); const admin = await (await localBRE.ethers.getSigners())[0].getAddress(); const testProvider = await getLendingPoolAddressesProvider(); console.log("Addresses provider from function (pre re-deploy):", testProvider.address); const addressesProvider = await deployLendingPoolAddressesProvider(UniswapConfig.MarketId, verify); console.log("Addresses provider in execution::", addressesProvider.address) const testProviderPost = await getLendingPoolAddressesProvider(); console.log("Addresses provider from function (pre re-deploy):", testProviderPost.address); console.log("Addresses provider from function (post re-deploy) should be different:") await waitForTx(await addressesProvider.setPoolAdmin(admin)); const addressesProviderRegistry = await getLendingPoolAddressesProviderRegistry(); await waitForTx( await addressesProviderRegistry.registerAddressesProvider(addressesProvider.address, 1) ); console.log(addressesProvider.address); /** * LENDING POOL DEPLOYMENT */ const lendingPoolImpl = await deployUniswapLendingPool(verify); await waitForTx(await addressesProvider.setLendingPoolImpl(lendingPoolImpl.address)); const address = await addressesProvider.getLendingPool(); console.log("UNISWAP MARKET LENDING POOL:", address); const lendingPoolProxy = await getLendingPool(address); await insertContractAddressInDb(eContractid.UniswapLendingPool, lendingPoolProxy.address); const lendingPoolConfiguratorImpl = await deployUniswapLendingPoolConfigurator(verify); // Set lending pool conf impl to Address Provider await waitForTx( await addressesProvider.setLendingPoolConfiguratorImpl(lendingPoolConfiguratorImpl.address) ); const lendingPoolConfiguratorProxy = await getLendingPoolConfiguratorProxy( await addressesProvider.getLendingPoolConfigurator() ); await insertContractAddressInDb( eContractid.UniswapLendingPoolConfigurator, lendingPoolConfiguratorProxy.address ); // Deploy deployment helpers await deployStableAndVariableTokensHelper( [lendingPoolProxy.address, addressesProvider.address], verify ); await deployATokensAndRatesHelper( [lendingPoolProxy.address, addressesProvider.address, lendingPoolConfiguratorProxy.address], verify ); /** * @dev Oracle deployment section */ console.log("Uniswap oracle deployment beginning.") const poolConfig = loadPoolConfig(pool); console.log("Initialized pool config..."); const { Mocks: {AllAssetsInitialPrices}, ProtocolGlobalParams: {UsdAddress, MockUsdPriceInWei}, LendingRateOracleRatesCommon, } = poolConfig as ICommonConfiguration; console.log("Initialized mocks, global params and lending rate oracle rates"); const defaultTokenList = { ...Object.fromEntries(Object.keys(TokenContractId).map((symbol) => [symbol, ''])), USD: UsdAddress, } as iAssetBase; console.log("Initialized defaultTokenList"); const mockTokens = await getAllMockedTokens(); console.log("Initialized mock tokens"); const mockTokensAddress = Object.keys(mockTokens).reduce>((prev, curr) => { prev[curr as keyof iAssetBase] = mockTokens[curr].address; return prev; }, defaultTokenList); console.log(mockTokensAddress); console.log("Initialized mock tokens addresses"); // No need to re-initialize addressesProvider and admin const fallbackOracle = await deployUniswapPriceOracle(verify); console.log("Deployed fallback price oracle"); await waitForTx(await fallbackOracle.setEthUsdPrice(MockUsdPriceInWei)); console.log("set fallback ETH USD price"); await setInitialAssetPricesInOracle(AllAssetsInitialPrices, mockTokensAddress, fallbackOracle); console.log("Set initial asset prices in oracle"); const mockAggregators = await deployAllMockAggregators(AllAssetsInitialPrices, verify); console.log("Deployed mock aggregators"); const allTokenAddresses = getAllTokenAddresses(mockTokens); console.log("Got all mock token addresses"); const allAggregatorsAddresses = getAllAggregatorsAddresses(mockAggregators); console.log("Got all aggregator addresses"); console.log("allTokenAddresses object: \n", allTokenAddresses); //Should modify this to potentially contain only the tokens in the Uniswap market // const [tokens, aggregators] = getPairsTokenAggregator( // allTokenAddresses, // allAggregatorsAddresses // ); // console.log("Got \"pairsToken aggregator\""); // console.log("Tokens: \n", tokens); // const assetAddressIndex = Object.keys(allReservesAddresses).findIndex( // (value) => value === assetSymbol // ); // const [, assetAddress] = (Object.entries(assetsAddresses) as [string, string][])[ // assetAddressIndex // ]; // assetAddresses.push(assetAddress); // await deployUniswapAaveOracle( // [tokens, aggregators, fallbackOracle.address, await getWethAddress(poolConfig)], // verify // ); console.log("Deployed Uniswap Aave oracle"); await waitForTx(await addressesProvider.setPriceOracle(fallbackOracle.address)); console.log("Set price oracle in addresses provider"); const lendingRateOracle = await deployUniswapLendingRateOracle(verify); console.log("Deployed lendingRateOracle"); await waitForTx(await addressesProvider.setLendingRateOracle(lendingRateOracle.address)); console.log("Set lending rate oracle in addresses provider"); const {USD, ...tokensAddressesWithoutUsd} = allTokenAddresses; console.log("Initialized object with token addresses & usd") const allReservesAddresses = { ...tokensAddressesWithoutUsd, }; console.log("Initialized object with all reserve addresses, allReservesAddresses:"); console.log(allReservesAddresses); console.log("LendingRateOracleRatesCommon: \n", LendingRateOracleRatesCommon); // // -- test // const [tokens, aggregators] = getPairsTokenAggregator( allTokenAddresses, allAggregatorsAddresses ); console.log("Got \"pairsToken aggregator\""); console.log("Tokens: \n", tokens); const assetAddresses: string[] = []; const aggregatorAddresses: string[] = []; for (const [assetSymbol, {borrowRate}] of Object.entries(LendingRateOracleRatesCommon) as [ string, IMarketRates ][]) { const assetAddressIndex = Object.keys(allReservesAddresses).findIndex( (value) => value === assetSymbol ); const [, assetAddress] = (Object.entries(allReservesAddresses) as [string, string][])[ assetAddressIndex ]; const [, aggregatorAddress] = (Object.entries(allAggregatorsAddresses) as [string, string][])[ assetAddressIndex ]; aggregatorAddresses.push(aggregatorAddress); assetAddresses.push(assetAddress); } console.log("\nPRICE ORACLE PARAMS:\nassetAddresses: %s\naggregatorAddresses: %s", assetAddresses, aggregatorAddresses); await deployUniswapAaveOracle( [assetAddresses, aggregatorAddresses, fallbackOracle.address, await getWethAddress(poolConfig)], verify ); // // -- test end // console.log("TEST END-----------------------------------------------------------------------"); await setInitialMarketRatesInRatesOracleByHelper( LendingRateOracleRatesCommon, allReservesAddresses, lendingRateOracle, admin ); console.log("Task complete"); /** * @dev Initialization */ // No need to initialize poolConfig, mockTokens, allTokenAddresses, admin and // addressesProvider and protoReservesAddresses (we use allReserveAddresses) const testHelpers = await deployAaveProtocolDataProvider(addressesProvider.address, verify); const reservesParams = getReservesConfigByPool(AavePools.uniswap); const treasuryAddress = await getTreasuryAddress(poolConfig); await initReservesByHelper( addressesProvider, reservesParams, allReservesAddresses, admin, treasuryAddress, ZERO_ADDRESS, verify ); await configureReservesByHelper( addressesProvider, reservesParams, allReservesAddresses, testHelpers, admin ); const collateralManager = await deployUniswapLendingPoolCollateralManager(verify); await waitForTx( await addressesProvider.setLendingPoolCollateralManager(collateralManager.address) ); const mockFlashLoanReceiver = await deployUniswapMockFlashLoanReceiver( addressesProvider.address, verify ); await insertContractAddressInDb( eContractid.UniswapMockFlashLoanReceiver, mockFlashLoanReceiver.address ); await deployUniswapWalletBalancerProvider(verify); await insertContractAddressInDb(eContractid.AaveProtocolDataProvider, testHelpers.address); const lendingPoolAddress = await addressesProvider.getLendingPool(); const wethAddress = await getWethAddress(poolConfig); await deployUniswapWETHGateway([wethAddress, lendingPoolAddress]); });