import { task } from 'hardhat/config'; import { getParamPerNetwork } from '../../helpers/contracts-helpers'; import { deployAaveOracleV2, deployLendingRateOracle } from '../../helpers/contracts-deployments'; import { setInitialMarketRatesInRatesOracleByHelper } from '../../helpers/oracles-helpers'; import { ICommonConfiguration, eNetwork, SymbolMap } from '../../helpers/types'; import { waitForTx, notFalsyOrZeroAddress } from '../../helpers/misc-utils'; import { ConfigNames, loadPoolConfig, getWethAddress, getGenesisPoolAdmin, getLendingRateOracles, getQuoteCurrency, } from '../../helpers/configuration'; import { getAaveOracle, getLendingPoolAddressesProvider, getLendingRateOracle, getPairsTokenAggregator, } from '../../helpers/contracts-getters'; import { AaveOracle, AaveOracleV2, LendingRateOracle } from '../../types'; import { isAddress } from 'ethers/lib/utils'; task('full:deploy-oracles', 'Deploy oracles for dev enviroment') .addFlag('verify', 'Verify contracts at Etherscan') .addParam('pool', `Pool name to retrieve configuration, supported: ${Object.values(ConfigNames)}`) .setAction(async ({ verify, pool }, DRE) => { try { await DRE.run('set-DRE'); const network = DRE.network.name; const poolConfig = loadPoolConfig(pool); const { ProtocolGlobalParams: { UsdAddress }, ReserveAssets, FallbackOracle, ChainlinkAggregator, } = poolConfig as ICommonConfiguration; const lendingRateOracles = getLendingRateOracles(poolConfig); const addressesProvider = await getLendingPoolAddressesProvider(); const admin = await getGenesisPoolAdmin(poolConfig); const aaveOracleAddress = getParamPerNetwork(poolConfig.AaveOracle, network); const lendingRateOracleAddress = getParamPerNetwork(poolConfig.LendingRateOracle, network); const fallbackOracleAddress = await getParamPerNetwork(FallbackOracle, network); const reserveAssets = await getParamPerNetwork(ReserveAssets, network); const chainlinkAggregators = await getParamPerNetwork(ChainlinkAggregator, network); const tokensToWatch: SymbolMap = { ...reserveAssets, USD: UsdAddress, }; const [tokens, aggregators] = getPairsTokenAggregator( tokensToWatch, chainlinkAggregators, poolConfig.OracleQuoteCurrency ); let aaveOracle: AaveOracle | AaveOracleV2; let lendingRateOracle: LendingRateOracle; if (notFalsyOrZeroAddress(aaveOracleAddress)) { aaveOracle = await await getAaveOracle(aaveOracleAddress); await waitForTx(await aaveOracle.setAssetSources(tokens, aggregators)); } else { aaveOracle = await deployAaveOracleV2( [ tokens, aggregators, fallbackOracleAddress, await getQuoteCurrency(poolConfig), poolConfig.OracleQuoteUnit, ], verify ); await waitForTx(await aaveOracle.setAssetSources(tokens, aggregators)); } if (notFalsyOrZeroAddress(lendingRateOracleAddress)) { lendingRateOracle = await getLendingRateOracle(lendingRateOracleAddress); } else { lendingRateOracle = await deployLendingRateOracle(verify); const { USD, ...tokensAddressesWithoutUsd } = tokensToWatch; await setInitialMarketRatesInRatesOracleByHelper( lendingRateOracles, tokensAddressesWithoutUsd, lendingRateOracle, admin ); } console.log('Aave Oracle: %s', aaveOracle.address); console.log('Lending Rate Oracle: %s', lendingRateOracle.address); // Register the proxy price provider on the addressesProvider await waitForTx(await addressesProvider.setPriceOracle(aaveOracle.address)); await waitForTx(await addressesProvider.setLendingRateOracle(lendingRateOracle.address)); } catch (error) { if (DRE.network.name.includes('tenderly')) { const transactionLink = `https://dashboard.tenderly.co/${DRE.config.tenderly.username}/${ DRE.config.tenderly.project }/fork/${DRE.tenderly.network().getFork()}/simulation/${DRE.tenderly.network().getHead()}`; console.error('Check tx error:', transactionLink); } throw error; } });