import { AavePools, iMultiPoolsAssets, IReserveParams, PoolConfiguration, iBasicDistributionParams, ICommonConfiguration, eEthereumNetwork, IMarketRates, } from './types'; import {getParamPerPool} from './contracts-helpers'; import {AaveConfig} from '../config/aave'; import {UniswapConfig} from '../config/uniswap'; import {CommonsConfig} from '../config/commons'; import {ZERO_ADDRESS} from './constants'; import {DRE, filterMapBy} from './misc-utils'; import {tEthereumAddress} from './types'; import {getParamPerNetwork} from './contracts-helpers'; import {deployWETHMocked} from './contracts-deployments'; export enum ConfigNames { Commons = 'Commons', Aave = 'Aave', Uniswap = 'Uniswap', } export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => { switch (configName) { case ConfigNames.Aave: return AaveConfig; case ConfigNames.Uniswap: return UniswapConfig; case ConfigNames.Commons: return CommonsConfig; default: throw new Error(`Unsupported pool configuration: ${Object.values(ConfigNames)}`); } }; // ---------------- // PROTOCOL PARAMS PER POOL // ---------------- export const getReservesConfigByPool = (pool: AavePools): iMultiPoolsAssets => getParamPerPool>( { [AavePools.proto]: { ...AaveConfig.ReservesConfig, }, [AavePools.secondary]: { ...UniswapConfig.ReservesConfig, }, }, pool ); export const getGenesisPoolAdmin = async ( config: ICommonConfiguration ): Promise => { const currentNetwork = DRE.network.name; const targetAddress = getParamPerNetwork(config.PoolAdmin, currentNetwork); if (targetAddress) { return targetAddress; } const addressList = await Promise.all( (await DRE.ethers.getSigners()).map((signer) => signer.getAddress()) ); const addressIndex = config.PoolAdminIndex; return addressList[addressIndex]; }; export const getEmergencyAdmin = async ( config: ICommonConfiguration ): Promise => { const currentNetwork = DRE.network.name; const targetAddress = getParamPerNetwork(config.EmergencyAdmin, currentNetwork); if (targetAddress) { return targetAddress; } const addressList = await Promise.all( (await DRE.ethers.getSigners()).map((signer) => signer.getAddress()) ); const addressIndex = config.EmergencyAdminIndex; return addressList[addressIndex]; }; export const getATokenDomainSeparatorPerNetwork = ( network: eEthereumNetwork, config: ICommonConfiguration ): tEthereumAddress => getParamPerNetwork(config.ATokenDomainSeparator, network); export const getWethAddress = async (config: ICommonConfiguration) => { const currentNetwork = DRE.network.name; const wethAddress = getParamPerNetwork(config.WETH, currentNetwork); if (wethAddress) { return wethAddress; } if (currentNetwork.includes('main')) { throw new Error('WETH not set at mainnet configuration.'); } const weth = await deployWETHMocked(); return weth.address; }; export const getLendingRateOracles = (poolConfig: ICommonConfiguration) => { const { ProtocolGlobalParams: {UsdAddress}, LendingRateOracleRatesCommon, ReserveAssets, } = poolConfig; const MAINNET_FORK = process.env.MAINNET_FORK === 'true'; const network = MAINNET_FORK ? 'main' : DRE.network.name; return filterMapBy(LendingRateOracleRatesCommon, (key) => Object.keys(ReserveAssets[network]).includes(key) ); };