diff --git a/helpers/configuration.ts b/helpers/configuration.ts index 925f9365..13baa35a 100644 --- a/helpers/configuration.ts +++ b/helpers/configuration.ts @@ -25,10 +25,10 @@ export const loadPoolConfig = (configName: ConfigNames): PoolConfiguration => { switch (configName) { case ConfigNames.Aave: return AaveConfig; + case ConfigNames.Uniswap: + return UniswapConfig; case ConfigNames.Commons: return CommonsConfig; - case ConfigNames.Uniswap: - return UniswapConfig; default: throw new Error(`Unsupported pool configuration: ${Object.values(ConfigNames)}`); } @@ -44,6 +44,9 @@ export const getReservesConfigByPool = (pool: AavePools): iMultiPoolsAssets { [tokenSymbol, tokenSymbol, configData ? configData.reserveDecimals : decimals], verify ); + await registerContractInJsonDb(tokenSymbol.toUpperCase(), tokens[tokenSymbol]); console.log("deployAllMockTokens: deployed", tokenSymbol); } return tokens; diff --git a/helpers/contracts-getters.ts b/helpers/contracts-getters.ts index 22c1784b..34b0d134 100644 --- a/helpers/contracts-getters.ts +++ b/helpers/contracts-getters.ts @@ -153,7 +153,7 @@ export const getAllMockedTokens = async () => { const tokens: MockTokenMap = await Object.keys(TokenContractId).reduce>( async (acc, tokenSymbol) => { const accumulator = await acc; - console.log("getAllMockedTokens: got accumulator"); + console.log("getAllMockedTokens: got accumulator, next token:", tokenSymbol.toUpperCase()); const address = db.get(`${tokenSymbol.toUpperCase()}.${DRE.network.name}`).value().address; console.log("getAllMockedTokens: Initialized address for %s, address: %s", tokenSymbol, address); accumulator[tokenSymbol] = await getMintableERC20(address); @@ -177,6 +177,8 @@ export const getPairsTokenAggregator = ( const aggregatorAddressIndex = Object.keys(aggregatorsAddresses).findIndex( (value) => value === tokenSymbol ); + //console.log("getPairsTokenAggregator: tokenSymbol:", tokenSymbol); + //console.log("getPairsTokenAggregator: aggregatorsAddresses:\n\n", aggregatorsAddresses); const [, aggregatorAddress] = (Object.entries(aggregatorsAddresses) as [ string, tEthereumAddress diff --git a/helpers/contracts-helpers.ts b/helpers/contracts-helpers.ts index 93f6bb30..df306c2a 100644 --- a/helpers/contracts-helpers.ts +++ b/helpers/contracts-helpers.ts @@ -157,10 +157,12 @@ export const getParamPerNetwork = ( } }; -export const getParamPerPool = ({ proto }: iParamsPerPool, pool: AavePools) => { +export const getParamPerPool = ({ proto, uniswap }: iParamsPerPool, pool: AavePools) => { switch (pool) { case AavePools.proto: return proto; + case AavePools.uniswap: + return uniswap; default: return proto; } diff --git a/helpers/init-helpers.ts b/helpers/init-helpers.ts index e80d2f91..96ec9df7 100644 --- a/helpers/init-helpers.ts +++ b/helpers/init-helpers.ts @@ -25,6 +25,7 @@ import { } from './contracts-deployments'; import { ZERO_ADDRESS } from './constants'; import { isZeroAddress } from 'ethereumjs-util'; +import { LendingPoolAddressesProvider } from '../types'; const chooseATokenDeployment = (id: eContractid) => { switch (id) { @@ -38,6 +39,7 @@ const chooseATokenDeployment = (id: eContractid) => { }; export const initReservesByHelper = async ( + addressProvider: LendingPoolAddressesProvider, reservesParams: iMultiPoolsAssets, tokenAddresses: { [symbol: string]: tEthereumAddress }, admin: tEthereumAddress, @@ -49,7 +51,7 @@ export const initReservesByHelper = async ( const stableAndVariableDeployer = await getStableAndVariableTokensHelper(); const atokenAndRatesDeployer = await getATokensAndRatesHelper(); - const addressProvider = await getLendingPoolAddressesProvider(); + //const addressProvider = await getLendingPoolAddressesProvider(); const poolAddress = await addressProvider.getLendingPool(); // Set aTokenAndRatesDeployer as temporal admin @@ -80,6 +82,7 @@ export const initReservesByHelper = async ( Object.entries(reservesParams).length * 4 } txs` ); + console.log("initReservesByHelper: tokenAddresses:", tokenAddresses); for (let reservesChunk of reservesChunks) { // Prepare data const tokens: string[] = []; @@ -95,13 +98,15 @@ export const initReservesByHelper = async ( const reservesDecimals: string[] = []; for (let [assetSymbol, { reserveDecimals }] of reservesChunk) { + console.log("initReservesByHelper: assetSymbol:\n%s", assetSymbol); const assetAddressIndex = Object.keys(tokenAddresses).findIndex( (value) => value === assetSymbol ); + console.log("initReservesByHelper: assetAddressIndex:\n%s", assetAddressIndex); const [, tokenAddress] = (Object.entries(tokenAddresses) as [string, string][])[ assetAddressIndex ]; - + console.log("initReservesByHelper: tokenAddress:\n%s", assetAddressIndex); const reserveParamIndex = Object.keys(reservesParams).findIndex( (value) => value === assetSymbol ); @@ -131,6 +136,7 @@ export const initReservesByHelper = async ( } // Deploy stable and variable deployers and save implementations + // PARAMS HANG IN LOCALHOST console.log("Hanging params:\ntokens:\n %s\n symbols:\n %s \n incentivesController: \n %s ", tokens, symbols, incentivesController); const tx1 = await waitForTx( await stableAndVariableDeployer.initDeployment(tokens, symbols, incentivesController) ); @@ -300,12 +306,13 @@ export const getPairsTokenAggregator = ( }; export const configureReservesByHelper = async ( + addressProvider: LendingPoolAddressesProvider, reservesParams: iMultiPoolsAssets, tokenAddresses: { [symbol: string]: tEthereumAddress }, helpers: AaveProtocolDataProvider, admin: tEthereumAddress ) => { - const addressProvider = await getLendingPoolAddressesProvider(); + //const addressProvider = await getLendingPoolAddressesProvider(); const atokenAndRatesDeployer = await getATokensAndRatesHelper(); const tokens: string[] = []; const symbols: string[] = []; diff --git a/helpers/oracles-helpers.ts b/helpers/oracles-helpers.ts index 242161e4..aaa19976 100644 --- a/helpers/oracles-helpers.ts +++ b/helpers/oracles-helpers.ts @@ -28,6 +28,7 @@ export const setInitialMarketRatesInRatesOracleByHelper = async ( string, IMarketRates ][]) { + console.log("Current asset symbol:", assetSymbol); const assetAddressIndex = Object.keys(assetsAddresses).findIndex( (value) => value === assetSymbol ); diff --git a/helpers/types.ts b/helpers/types.ts index 30c628e6..9c15dd13 100644 --- a/helpers/types.ts +++ b/helpers/types.ts @@ -22,36 +22,47 @@ export enum EthereumNetworkNames { export enum AavePools { proto = 'proto', + uniswap = 'uniswap', } export enum eContractid { Example = 'Example', LendingPoolAddressesProvider = 'LendingPoolAddressesProvider', + UniswapLendingPoolAddressesProvider = 'UniswapLendingPoolAddressesProvider', MintableERC20 = 'MintableERC20', MintableDelegationERC20 = 'MintableDelegationERC20', LendingPoolAddressesProviderRegistry = 'LendingPoolAddressesProviderRegistry', LendingPoolParametersProvider = 'LendingPoolParametersProvider', LendingPoolConfigurator = 'LendingPoolConfigurator', + UniswapLendingPoolConfigurator = 'UniswapLendingPoolConfigurator', ValidationLogic = 'ValidationLogic', ReserveLogic = 'ReserveLogic', GenericLogic = 'GenericLogic', LendingPool = 'LendingPool', + UniswapLendingPool = 'UniswapLendingPool', PriceOracle = 'PriceOracle', + UniswapPriceOracle = 'UniswapPriceOracle', Proxy = 'Proxy', MockAggregator = 'MockAggregator', LendingRateOracle = 'LendingRateOracle', + UniswapLendingRateOracle = 'UniswapLendingRateOracle', AaveOracle = 'AaveOracle', + UniswapAaveOracle = 'UniswapAaveOracle', DefaultReserveInterestRateStrategy = 'DefaultReserveInterestRateStrategy', LendingPoolCollateralManager = 'LendingPoolCollateralManager', + UniswapLendingPoolCollateralManager = 'UniswapLendingPoolCollateralManager', InitializableAdminUpgradeabilityProxy = 'InitializableAdminUpgradeabilityProxy', MockFlashLoanReceiver = 'MockFlashLoanReceiver', + UniswapMockFlashLoanReceiver = 'UniswapMockFlashLoanReceiver', WalletBalanceProvider = 'WalletBalanceProvider', + UniswapWalletBalanceProvider = 'UniswapWalletBalanceProvider', AToken = 'AToken', MockAToken = 'MockAToken', DelegationAwareAToken = 'DelegationAwareAToken', MockStableDebtToken = 'MockStableDebtToken', MockVariableDebtToken = 'MockVariableDebtToken', AaveProtocolDataProvider = 'AaveProtocolDataProvider', + UniswapAaveProtocolDataProvider = 'UniswapAaveProtocolDataProvider', IERC20Detailed = 'IERC20Detailed', StableDebtToken = 'StableDebtToken', VariableDebtToken = 'VariableDebtToken', @@ -61,12 +72,16 @@ export enum eContractid { ATokensAndRatesHelper = 'ATokensAndRatesHelper', UiPoolDataProvider = 'UiPoolDataProvider', WETHGateway = 'WETHGateway', + UniswapWETHGateway = 'UniswapWETHGateway', WETH = 'WETH', WETHMocked = 'WETHMocked', SelfdestructTransferMock = 'SelfdestructTransferMock', LendingPoolImpl = 'LendingPoolImpl', + UniswapLendingPoolImpl = 'UniswapLendingPoolImpl', LendingPoolConfiguratorImpl = 'LendingPoolConfiguratorImpl', + UniswapLendingPoolConfiguratorImpl = 'UniswapLendingPoolConfiguratorImpl', LendingPoolCollateralManagerImpl = 'LendingPoolCollateralManagerImpl', + UniswapLendingPoolCollateralManagerImpl = 'UniswapLendingPoolCollateralManagerImpl', } /* @@ -200,8 +215,13 @@ export interface iAssetBase { USD: T; REN: T; ENJ: T; - WETHDAI: T; - WETHWBTC: T; + UNI_WETH: T; + UNI_WBTC: T; + UNI_DAI: T; + UNI_USDC: T; + UNI_USDT: T; + UNI_WETHDAI: T; + UNI_WETHWBTC: T; } export type iAssetsWithoutETH = Omit, 'ETH'>; @@ -234,13 +254,13 @@ export type iAavePoolAssets = Pick< export type iUniswapPoolAssets = Pick< iAssetsWithoutUSD, - | 'DAI' - | 'USDC' - | 'USDT' - | 'WBTC' - | 'WETH' - | 'WETHDAI' - | 'WETHWBTC' + | 'UNI_DAI' + | 'UNI_USDC' + | 'UNI_USDT' + | 'UNI_WBTC' + | 'UNI_WETH' + | 'UNI_WETHDAI' + | 'UNI_WETHWBTC' >; export type iMultiPoolsAssets = iAssetCommon | iAavePoolAssets; @@ -271,8 +291,13 @@ export enum TokenContractId { YFI = 'YFI', UNI = 'UNI', ENJ = 'ENJ', - WETHDAI = 'WETHDAI', - WETHWBTC = 'WETHWBTC', + UNI_WETH = 'WETH', + UNI_WBTC = 'WBTC', + UNI_DAI = 'DAI', + UNI_USDC = 'USDC', + UNI_USDT = 'USDT', + UNI_WETHDAI = 'WETHDAI', + UNI_WETHWBTC = 'WETHWBTC', } export interface IReserveParams extends IReserveBorrowParams, IReserveCollateralParams { @@ -313,6 +338,7 @@ export interface iParamsPerNetwork { export interface iParamsPerPool { [AavePools.proto]: T; + [AavePools.uniswap]: T; } export interface iBasicDistributionParams { diff --git a/helpers/uniswap-contracts-deployments.ts b/helpers/uniswap-contracts-deployments.ts new file mode 100644 index 00000000..0c28b324 --- /dev/null +++ b/helpers/uniswap-contracts-deployments.ts @@ -0,0 +1,241 @@ +import { Contract } from 'ethers'; +import { DRE } from './misc-utils'; +import { + tEthereumAddress, + eContractid, + tStringTokenSmallUnits, + AavePools, + TokenContractId, + iMultiPoolsAssets, + IReserveParams, + PoolConfiguration, + eEthereumNetwork, +} from './types'; + +import { MintableERC20 } from '../types/MintableERC20'; +import { MockContract } from 'ethereum-waffle'; +import { getReservesConfigByPool } from './configuration'; +import { getFirstSigner } from './contracts-getters'; +import { ZERO_ADDRESS } from './constants'; +import { + AaveProtocolDataProviderFactory, + ATokenFactory, + ATokensAndRatesHelperFactory, + AaveOracleFactory, + DefaultReserveInterestRateStrategyFactory, + DelegationAwareATokenFactory, + InitializableAdminUpgradeabilityProxyFactory, + LendingPoolAddressesProviderFactory, + LendingPoolAddressesProviderRegistryFactory, + LendingPoolCollateralManagerFactory, + LendingPoolConfiguratorFactory, + LendingPoolFactory, + LendingRateOracleFactory, + MintableDelegationERC20Factory, + MintableERC20Factory, + MockAggregatorFactory, + MockATokenFactory, + MockFlashLoanReceiverFactory, + MockStableDebtTokenFactory, + MockVariableDebtTokenFactory, + PriceOracleFactory, + ReserveLogicFactory, + SelfdestructTransferFactory, + StableDebtTokenFactory, + VariableDebtTokenFactory, + WalletBalanceProviderFactory, + WETH9MockedFactory, + WETHGatewayFactory, +} from '../types'; +import { + withSaveAndVerify, + registerContractInJsonDb, + linkBytecode, + insertContractAddressInDb, +} from './contracts-helpers'; +import { StableAndVariableTokensHelperFactory } from '../types/StableAndVariableTokensHelperFactory'; +import { MintableDelegationERC20 } from '../types/MintableDelegationERC20'; +import { readArtifact as buidlerReadArtifact } from '@nomiclabs/buidler/plugins'; +import { HardhatRuntimeEnvironment } from 'hardhat/types'; +import { LendingPoolLibraryAddresses } from '../types/LendingPoolFactory'; + +const readArtifact = async (id: string) => { + if (DRE.network.name === eEthereumNetwork.buidlerevm) { + return buidlerReadArtifact(DRE.config.paths.artifacts, id); + } + return (DRE as HardhatRuntimeEnvironment).artifacts.readArtifact(id); +}; + +export const deployUniswapLendingPoolAddressesProvider = async (marketId: string, verify?: boolean) => + withSaveAndVerify( + await new LendingPoolAddressesProviderFactory(await getFirstSigner()).deploy(marketId), + eContractid.UniswapLendingPoolAddressesProvider, + [marketId], + verify + ); + +export const deployUniswapLendingPoolConfigurator = async (verify?: boolean) => { + const lendingPoolConfiguratorImpl = await new LendingPoolConfiguratorFactory( + await getFirstSigner() + ).deploy(); + await insertContractAddressInDb( + eContractid.UniswapLendingPoolConfiguratorImpl, + lendingPoolConfiguratorImpl.address + ); + return withSaveAndVerify( + lendingPoolConfiguratorImpl, + eContractid.UniswapLendingPoolConfigurator, + [], + verify + ); +}; + +export const deployUniswapLendingPool = async (verify?: boolean) => { + const libraries = await deployAaveLibraries(verify); + const lendingPoolImpl = await new LendingPoolFactory(libraries, await getFirstSigner()).deploy(); + await insertContractAddressInDb(eContractid.UniswapLendingPoolImpl, lendingPoolImpl.address); + return withSaveAndVerify(lendingPoolImpl, eContractid.LendingPool, [], verify); +}; + +export const deployReserveLogicLibrary = async (verify?: boolean) => + withSaveAndVerify( + await new ReserveLogicFactory(await getFirstSigner()).deploy(), + eContractid.ReserveLogic, + [], + verify + ); + +export const deployGenericLogic = async (reserveLogic: Contract, verify?: boolean) => { + const genericLogicArtifact = await readArtifact(eContractid.GenericLogic); + + const linkedGenericLogicByteCode = linkBytecode(genericLogicArtifact, { + [eContractid.ReserveLogic]: reserveLogic.address, + }); + + const genericLogicFactory = await DRE.ethers.getContractFactory( + genericLogicArtifact.abi, + linkedGenericLogicByteCode + ); + + const genericLogic = await (await genericLogicFactory.deploy()).deployed(); + return withSaveAndVerify(genericLogic, eContractid.GenericLogic, [], verify); +}; + +export const deployValidationLogic = async ( + reserveLogic: Contract, + genericLogic: Contract, + verify?: boolean +) => { + const validationLogicArtifact = await readArtifact(eContractid.ValidationLogic); + + const linkedValidationLogicByteCode = linkBytecode(validationLogicArtifact, { + [eContractid.ReserveLogic]: reserveLogic.address, + [eContractid.GenericLogic]: genericLogic.address, + }); + + const validationLogicFactory = await DRE.ethers.getContractFactory( + validationLogicArtifact.abi, + linkedValidationLogicByteCode + ); + + const validationLogic = await (await validationLogicFactory.deploy()).deployed(); + + return withSaveAndVerify(validationLogic, eContractid.ValidationLogic, [], verify); +}; + +export const deployAaveLibraries = async ( + verify?: boolean +): Promise => { + const reserveLogic = await deployReserveLogicLibrary(verify); + const genericLogic = await deployGenericLogic(reserveLogic, verify); + const validationLogic = await deployValidationLogic(reserveLogic, genericLogic, verify); + + // Hardcoded solidity placeholders, if any library changes path this will fail. + // The '__$PLACEHOLDER$__ can be calculated via solidity keccak, but the LendingPoolLibraryAddresses Type seems to + // require a hardcoded string. + // + // how-to: + // 1. PLACEHOLDER = solidityKeccak256(['string'], `${libPath}:${libName}`).slice(2, 36) + // 2. LIB_PLACEHOLDER = `__$${PLACEHOLDER}$__` + // or grab placeholdes from LendingPoolLibraryAddresses at Typechain generation. + // + // libPath example: contracts/libraries/logic/GenericLogic.sol + // libName example: GenericLogic + return { + ['__$de8c0cf1a7d7c36c802af9a64fb9d86036$__']: validationLogic.address, + ['__$22cd43a9dda9ce44e9b92ba393b88fb9ac$__']: reserveLogic.address, + }; +}; + +export const deployUniswapPriceOracle = async (verify?: boolean) => + withSaveAndVerify( + await new PriceOracleFactory(await getFirstSigner()).deploy(), + eContractid.UniswapPriceOracle, + [], + verify + ); + +export const deployUniswapLendingRateOracle = async (verify?: boolean) => + withSaveAndVerify( + await new LendingRateOracleFactory(await getFirstSigner()).deploy(), + eContractid.UniswapLendingRateOracle, + [], + verify + ); + +export const deployUniswapAaveOracle = async ( + args: [tEthereumAddress[], tEthereumAddress[], tEthereumAddress, tEthereumAddress], + verify?: boolean +) => + withSaveAndVerify( + await new AaveOracleFactory(await getFirstSigner()).deploy(...args), + eContractid.UniswapAaveOracle, + args, + verify + ); + +export const deployUniswapLendingPoolCollateralManager = async (verify?: boolean) => { + const collateralManagerImpl = await new LendingPoolCollateralManagerFactory( + await getFirstSigner() + ).deploy(); + await insertContractAddressInDb( + eContractid.UniswapLendingPoolCollateralManagerImpl, + collateralManagerImpl.address + ); + return withSaveAndVerify( + collateralManagerImpl, + eContractid.UniswapLendingPoolCollateralManager, + [], + verify + ); +}; + +export const deployUniswapMockFlashLoanReceiver = async ( + addressesProvider: tEthereumAddress, + verify?: boolean +) => + withSaveAndVerify( + await new MockFlashLoanReceiverFactory(await getFirstSigner()).deploy(addressesProvider), + eContractid.UniswapMockFlashLoanReceiver, + [addressesProvider], + verify + ); + +export const deployUniswapWalletBalancerProvider = async (verify?: boolean) => + withSaveAndVerify( + await new WalletBalanceProviderFactory(await getFirstSigner()).deploy(), + eContractid.UniswapWalletBalanceProvider, + [], + verify + ); + +export const deployUniswapWETHGateway = async ( + args: [tEthereumAddress, tEthereumAddress], + verify?: boolean +) => + withSaveAndVerify( + await new WETHGatewayFactory(await getFirstSigner()).deploy(...args), + eContractid.UniswapWETHGateway, + args, + verify + ); diff --git a/markets/aave/commons.ts b/markets/aave/commons.ts index fecd714f..e059c961 100644 --- a/markets/aave/commons.ts +++ b/markets/aave/commons.ts @@ -23,8 +23,13 @@ const MOCK_CHAINLINK_AGGREGATORS_PRICES = { WBTC: oneEther.multipliedBy('47.332685').toFixed(), YFI: oneEther.multipliedBy('22.407436').toFixed(), ZRX: oneEther.multipliedBy('0.001151').toFixed(), - WETHDAI: oneEther.multipliedBy('22.407436').toFixed(), - WETHWBTC: oneEther.multipliedBy('22.407436').toFixed(), + UNI_WETH:oneEther.toFixed(), + UNI_WBTC: oneEther.multipliedBy('47.332685').toFixed(), + UNI_DAI: oneEther.multipliedBy('0.00369068412860').toFixed(), + UNI_USDC: oneEther.multipliedBy('0.00367714136416').toFixed(), + UNI_USDT: oneEther.multipliedBy('0.00369068412860').toFixed(), + UNI_WETHDAI: oneEther.multipliedBy('22.407436').toFixed(), + UNI_WETHWBTC: oneEther.multipliedBy('22.407436').toFixed(), USD: '5848466240000000', }; // ---------------- diff --git a/markets/uniswap/commons.ts b/markets/uniswap/commons.ts index 939b32ee..c12b4570 100644 --- a/markets/uniswap/commons.ts +++ b/markets/uniswap/commons.ts @@ -23,8 +23,13 @@ const MOCK_CHAINLINK_AGGREGATORS_PRICES = { WBTC: oneEther.multipliedBy('47.332685').toFixed(), YFI: oneEther.multipliedBy('22.407436').toFixed(), ZRX: oneEther.multipliedBy('0.001151').toFixed(), - WETHDAI: oneEther.multipliedBy('22.407436').toFixed(), - WETHWBTC: oneEther.multipliedBy('22.407436').toFixed(), + UNI_WETH:oneEther.toFixed(), + UNI_WBTC: oneEther.multipliedBy('47.332685').toFixed(), + UNI_DAI: oneEther.multipliedBy('0.00369068412860').toFixed(), + UNI_USDC: oneEther.multipliedBy('0.00367714136416').toFixed(), + UNI_USDT: oneEther.multipliedBy('0.00369068412860').toFixed(), + UNI_WETHDAI: oneEther.multipliedBy('22.407436').toFixed(), + UNI_WETHWBTC: oneEther.multipliedBy('22.407436').toFixed(), USD: '5848466240000000', }; // ---------------- @@ -54,67 +59,25 @@ export const CommonsConfig: ICommonConfiguration = { }, // TODO: reorg alphabetically, checking the reason of tests failing LendingRateOracleRatesCommon: { - WETH: { + UNI_WETH: { borrowRate: oneRay.multipliedBy(0.03).toFixed(), }, - DAI: { + UNI_DAI: { borrowRate: oneRay.multipliedBy(0.039).toFixed(), }, - TUSD: { - borrowRate: oneRay.multipliedBy(0.035).toFixed(), - }, - USDC: { + UNI_USDC: { borrowRate: oneRay.multipliedBy(0.039).toFixed(), }, - SUSD: { + UNI_USDT: { borrowRate: oneRay.multipliedBy(0.035).toFixed(), }, - USDT: { - borrowRate: oneRay.multipliedBy(0.035).toFixed(), - }, - BAT: { + UNI_WBTC: { borrowRate: oneRay.multipliedBy(0.03).toFixed(), }, - AAVE: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - LINK: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - KNC: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - MKR: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - MANA: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - WBTC: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - ZRX: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - SNX: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - YFI: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - REN: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - UNI: { - borrowRate: oneRay.multipliedBy(0.03).toFixed(), - }, - BUSD: { + UNI_WETHDAI: { borrowRate: oneRay.multipliedBy(0.05).toFixed(), }, - WETHDAI: { - borrowRate: oneRay.multipliedBy(0.05).toFixed(), - }, - WETHWBTC: { + UNI_WETHWBTC: { borrowRate: oneRay.multipliedBy(0.05).toFixed(), }, }, @@ -267,6 +230,8 @@ export const CommonsConfig: ICommonConfiguration = { YFI: '0x7c5d4F8345e66f68099581Db340cd65B078C41f4', ZRX: '0x2Da4983a622a8498bb1a21FaE9D8F6C664939962', USD: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419', + WETHDAI: ZERO_ADDRESS, + WETHWBTC: ZERO_ADDRESS, }, [EthereumNetwork.tenderlyMain]: { AAVE: '0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012', diff --git a/markets/uniswap/index.ts b/markets/uniswap/index.ts index 37daa4af..d92518df 100644 --- a/markets/uniswap/index.ts +++ b/markets/uniswap/index.ts @@ -21,13 +21,13 @@ export const UniswapConfig: IUniswapConfiguration = { MarketId: 'Uniswap V2 market', ProviderId: 2, ReservesConfig: { - DAI: strategyDAI, - USDC: strategyUSDC, - USDT: strategyUSDT, - WBTC: strategyWBTC, - WETH: strategyWETH, - WETHDAI: strategyWETHDAI, - WETHWBTC: strategyWETHWBTC + UNI_DAI: strategyDAI, + UNI_USDC: strategyUSDC, + UNI_USDT: strategyUSDT, + UNI_WBTC: strategyWBTC, + UNI_WETH: strategyWETH, + UNI_WETHDAI: strategyWETHDAI, + UNI_WETHWBTC: strategyWETHWBTC }, ReserveAssets: { [eEthereumNetwork.buidlerevm]: {}, diff --git a/package.json b/package.json index d3c73712..cd9c9e3e 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "aave:kovan:full:initialize": "npm run hardhat:kovan -- full:initialize-lending-pool --verify --pool Aave", "aave:ropsten:full:migration": "npm run compile && npm run hardhat:ropsten -- aave:mainnet --verify", "aave:fork:main:tenderly": "npm run compile && npm run hardhat:tenderly-main -- aave:mainnet", - "aave:fork:main": "npm run compile && MAINNET_FORK=true hardhat aave:mainnet", + "aave:fork:main": "npm run compile && MAINNET_FORK=true hardhat aave:mainnet", + "uniswap:fork:main": "npm run compile && MAINNET_FORK=true hardhat uniswap:mainnet", "aave:main:full:migration": "npm run compile && npm run hardhat:main -- aave:mainnet --verify", "aave:main:full:initialize": "npm run compile && MAINNET_FORK=true full:initialize-tokens --pool Aave", "dev:prettier": "prettier --write .", diff --git a/tasks/dev/4_lending_pool.ts b/tasks/dev/3_lending_pool.ts similarity index 92% rename from tasks/dev/4_lending_pool.ts rename to tasks/dev/3_lending_pool.ts index b1aeb58c..692c8386 100644 --- a/tasks/dev/4_lending_pool.ts +++ b/tasks/dev/3_lending_pool.ts @@ -18,15 +18,17 @@ task('dev:deploy-lending-pool', 'Deploy lending pool for dev enviroment') .addFlag('verify', 'Verify contracts at Etherscan') .setAction(async ({verify}, localBRE) => { await localBRE.run('set-DRE'); - + // TEST--- CURRENTLY FAILS BECAUSE ALREADY HAS AN IMPLEMENTATION, SHOULD BE DONE BEFORE UNI MARKET TASK const addressesProvider = await getLendingPoolAddressesProvider(); - + const lendingPoolImpl = await deployLendingPool(verify); // Set lending pool impl to Address Provider await waitForTx(await addressesProvider.setLendingPoolImpl(lendingPoolImpl.address)); const address = await addressesProvider.getLendingPool(); + console.log("AAVE MARKET LENDING POOL:", address); + const lendingPoolProxy = await getLendingPool(address); await insertContractAddressInDb(eContractid.LendingPool, lendingPoolProxy.address); diff --git a/tasks/dev/3_uniswap_address_provider.ts b/tasks/dev/3_uniswap_address_provider.ts deleted file mode 100644 index 5898b4bb..00000000 --- a/tasks/dev/3_uniswap_address_provider.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { task } from 'hardhat/config'; -import { - deployLendingPoolAddressesProvider, - //deployLendingPoolAddressesProviderRegistry, -} from '../../helpers/contracts-deployments'; -import { getLendingPoolAddressesProviderRegistry } from '../../helpers/contracts-getters' -import { waitForTx } from '../../helpers/misc-utils'; -import { UniswapConfig } from '../../markets/uniswap'; - -task( - 'dev:deploy-uniswap-address-provider', - 'Deploy uniswap market address provider' -) - .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 addressesProvider = await deployLendingPoolAddressesProvider(UniswapConfig.MarketId, verify); - await waitForTx(await addressesProvider.setPoolAdmin(admin)); - - const addressesProviderRegistry = await getLendingPoolAddressesProviderRegistry(); - await waitForTx( - await addressesProviderRegistry.registerAddressesProvider(addressesProvider.address, 1) - ); - console.log(addressesProvider.address); - }); diff --git a/tasks/dev/5_oracles.ts b/tasks/dev/4_oracles.ts similarity index 97% rename from tasks/dev/5_oracles.ts rename to tasks/dev/4_oracles.ts index d0d2cd08..b8c29660 100644 --- a/tasks/dev/5_oracles.ts +++ b/tasks/dev/4_oracles.ts @@ -58,7 +58,7 @@ task('dev:deploy-oracles', 'Deploy oracles for dev enviroment') const addressesProvider = await getLendingPoolAddressesProvider(); - console.log("Got the addresses provider"); + console.log("Got the addresses provider (check if different both times):", addressesProvider.address); const admin = await addressesProvider.getPoolAdmin(); diff --git a/tasks/dev/6_initialize.ts b/tasks/dev/5_initialize.ts similarity index 98% rename from tasks/dev/6_initialize.ts rename to tasks/dev/5_initialize.ts index c62f31ce..9a3896a5 100644 --- a/tasks/dev/6_initialize.ts +++ b/tasks/dev/5_initialize.ts @@ -53,6 +53,7 @@ task('dev:initialize-lending-pool', 'Initialize lending pool configuration.') const treasuryAddress = await getTreasuryAddress(poolConfig); await initReservesByHelper( + addressesProvider, reservesParams, protoPoolReservesAddresses, admin, @@ -61,6 +62,7 @@ task('dev:initialize-lending-pool', 'Initialize lending pool configuration.') verify ); await configureReservesByHelper( + addressesProvider, reservesParams, protoPoolReservesAddresses, testHelpers, diff --git a/tasks/dev/7_wallet_balance_provider.ts b/tasks/dev/6_wallet_balance_provider.ts similarity index 100% rename from tasks/dev/7_wallet_balance_provider.ts rename to tasks/dev/6_wallet_balance_provider.ts diff --git a/tasks/dev/7_uniswap_market.ts b/tasks/dev/7_uniswap_market.ts new file mode 100644 index 00000000..aa73fc40 --- /dev/null +++ b/tasks/dev/7_uniswap_market.ts @@ -0,0 +1,322 @@ +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]); + }); diff --git a/tasks/full/3_oracles.ts b/tasks/full/3_oracles.ts index b064328f..093ea43c 100644 --- a/tasks/full/3_oracles.ts +++ b/tasks/full/3_oracles.ts @@ -1,5 +1,5 @@ import { task } from 'hardhat/config'; -import { getParamPerNetwork } from '../../helpers/contracts-helpers'; +import { getParamPerNetwork, getParamPerPool } from '../../helpers/contracts-helpers'; import { deployAaveOracle, deployLendingRateOracle } from '../../helpers/contracts-deployments'; import { setInitialMarketRatesInRatesOracleByHelper } from '../../helpers/oracles-helpers'; import { ICommonConfiguration, eEthereumNetwork, SymbolMap } from '../../helpers/types'; @@ -32,6 +32,8 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') FallbackOracle, ChainlinkAggregator, } = poolConfig as ICommonConfiguration; + + //console.log("------------------------------------------------ReserveAssets:\n", ReserveAssets); const lendingRateOracles = getLendingRateOracles(poolConfig); const addressesProvider = await getLendingPoolAddressesProvider(); const admin = await getGenesisPoolAdmin(poolConfig); @@ -40,13 +42,14 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') const fallbackOracleAddress = await getParamPerNetwork(FallbackOracle, network); const reserveAssets = await getParamPerNetwork(ReserveAssets, network); const chainlinkAggregators = await getParamPerNetwork(ChainlinkAggregator, network); + //console.log("------------------------------------------------reserveAssets:\n", reserveAssets); const tokensToWatch: SymbolMap = { ...reserveAssets, USD: UsdAddress, }; const [tokens, aggregators] = getPairsTokenAggregator(tokensToWatch, chainlinkAggregators); - + console.log("tokens:\n %s \n aggregators: \n %s", tokens, aggregators); const aaveOracle = notFalsyOrZeroAddress(aaveOracleAddress) ? await getAaveOracle(aaveOracleAddress) : await deployAaveOracle( diff --git a/tasks/full/5_initialize.ts b/tasks/full/5_initialize.ts index 444f55d8..77672bdc 100644 --- a/tasks/full/5_initialize.ts +++ b/tasks/full/5_initialize.ts @@ -36,6 +36,7 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.') const testHelpers = await getAaveProtocolDataProvider(); + console.log("reserveAssets:\n", reserveAssets); const admin = await addressesProvider.getPoolAdmin(); if (!reserveAssets) { throw 'Reserve assets is undefined. Check ReserveAssets configuration at config directory'; @@ -43,8 +44,8 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.') const treasuryAddress = await getTreasuryAddress(poolConfig); - await initReservesByHelper(ReservesConfig, reserveAssets, admin, treasuryAddress, ZERO_ADDRESS, verify); - await configureReservesByHelper(ReservesConfig, reserveAssets, testHelpers, admin); + await initReservesByHelper(addressesProvider, ReservesConfig, reserveAssets, admin, treasuryAddress, ZERO_ADDRESS, verify); + await configureReservesByHelper(addressesProvider, ReservesConfig, reserveAssets, testHelpers, admin); const collateralManager = await deployLendingPoolCollateralManager(verify); await waitForTx( diff --git a/tasks/migrations/aave.dev.ts b/tasks/migrations/aave.dev.ts index e77e3e11..e92d894d 100644 --- a/tasks/migrations/aave.dev.ts +++ b/tasks/migrations/aave.dev.ts @@ -22,22 +22,22 @@ task('aave:dev', 'Deploy development enviroment') console.log('2. Deploy Aave market address provider'); await localBRE.run('dev:deploy-address-provider', {verify}); - - console.log('3. Deploy Uniswap market address provider'); - await localBRE.run('dev:deploy-uniswap-address-provider', {verify}); - console.log('4. Deploy Aave lending pool'); + console.log('3. Deploy Aave lending pool'); await localBRE.run('dev:deploy-lending-pool', {verify}); - console.log('5. Deploy oracles'); + console.log('4. Deploy oracles'); await localBRE.run('dev:deploy-oracles', {verify, pool: POOL_NAME}); - console.log('6. Deploy Uniswap market oracles'); - await localBRE.run('dev:deploy-oracles', {verify, pool: "Uniswap"}); + // console.log('6. Deploy Uniswap market oracles'); + // await localBRE.run('dev:deploy-oracles', {verify, pool: "Uniswap"}); - console.log('6. Initialize lending pool'); + console.log('5. Initialize lending pool'); await localBRE.run('dev:initialize-lending-pool', {verify, pool: POOL_NAME}); + console.log('6. Deploy Uniswap market'); + await localBRE.run('dev:deploy-uniswap-market', {verify}); + console.log('\nFinished migration'); printContracts(); }); diff --git a/tasks/migrations/uniswap.mainnet.ts b/tasks/migrations/uniswap.mainnet.ts new file mode 100644 index 00000000..7945dca6 --- /dev/null +++ b/tasks/migrations/uniswap.mainnet.ts @@ -0,0 +1,59 @@ +import {task} from 'hardhat/config'; +import {ExternalProvider} from '@ethersproject/providers'; +import {checkVerification} from '../../helpers/etherscan-verification'; +import {ConfigNames} from '../../helpers/configuration'; +import {EthereumNetworkNames} from '../../helpers/types'; +import {printContracts} from '../../helpers/misc-utils'; + +task('uniswap:mainnet', 'Deploy development enviroment') + .addFlag('verify', 'Verify contracts at Etherscan') + .setAction(async ({verify}, DRE) => { + const POOL_NAME = ConfigNames.Uniswap; + const network = DRE.network.name; + await DRE.run('set-DRE'); + + // Prevent loss of gas verifying all the needed ENVs for Etherscan verification + if (verify) { + checkVerification(); + } + + if (network.includes('tenderly')) { + console.log('- Setting up Tenderly provider'); + await DRE.tenderlyRPC.initializeFork(); + const provider = new DRE.ethers.providers.Web3Provider(DRE.tenderlyRPC as any); + DRE.ethers.provider = provider; + } + + console.log('Migration started\n'); + + console.log('1. Deploy address provider'); + await DRE.run('full:deploy-address-provider', {pool: POOL_NAME}); + + console.log('2. Deploy lending pool'); + await DRE.run('full:deploy-lending-pool'); + + console.log('3. Deploy oracles'); + await DRE.run('full:deploy-oracles', {pool: POOL_NAME}); + + console.log('4. Deploy Data Provider'); + await DRE.run('full:data-provider', {pool: POOL_NAME}); + + console.log('5. Initialize lending pool'); + await DRE.run('full:initialize-lending-pool', {pool: POOL_NAME}); + + if (verify) { + printContracts(); + console.log('4. Veryfing contracts'); + await DRE.run('verify:general', {all: true, pool: POOL_NAME}); + + console.log('5. Veryfing aTokens and debtTokens'); + await DRE.run('verify:tokens', {pool: POOL_NAME}); + } + + if (network.includes('tenderly')) { + const postDeployHead = DRE.tenderlyRPC.getHead(); + console.log('Tenderly UUID', postDeployHead); + } + console.log('\nFinished migrations'); + printContracts(); + }); diff --git a/test/__setup.spec.ts b/test/__setup.spec.ts index 45479bb7..51542de9 100644 --- a/test/__setup.spec.ts +++ b/test/__setup.spec.ts @@ -159,6 +159,13 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { REN: mockTokens.REN.address, UNI: mockTokens.UNI.address, ENJ: mockTokens.ENJ.address, + UNI_WETH: mockTokens.WETH.address, + UNI_WBTC: mockTokens.WBTC.address, + UNI_DAI: mockTokens.DAI.address, + UNI_USDC: mockTokens.USDC.address, + UNI_USDT: mockTokens.USDT.address, + UNI_WETHDAI: mockTokens.UNI_WETHDAI.address, + UNI_WETHWBTC: mockTokens.UNI_WETHWBTC.address, USD: USD_ADDRESS, }, fallbackOracle @@ -213,8 +220,9 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { const treasuryAddress = await getTreasuryAddress(config); - await initReservesByHelper(reservesParams, allReservesAddresses, admin, treasuryAddress, ZERO_ADDRESS, false); + await initReservesByHelper(addressesProvider, reservesParams, allReservesAddresses, admin, treasuryAddress, ZERO_ADDRESS, false); await configureReservesByHelper( + addressesProvider, reservesParams, allReservesAddresses, testHelpers, diff --git a/test/test b/test/test new file mode 100644 index 00000000..6b201f6c --- /dev/null +++ b/test/test @@ -0,0 +1,153 @@ +N# Contracts: 152 +MintableERC20: 0xB00cC45B4a7d3e1FEE684cFc4417998A1c183e6d +LendingPoolAddressesProvider: 0x0459c841b02Aee8730730C737582c53B20a27288 +LendingPoolAddressesProviderRegistry: 0x22474D350EC2dA53D717E30b96e9a2B7628Ede5b +ReserveLogic: 0x7fAeC7791277Ff512c41CA903c177B2Ed952dDAc +GenericLogic: 0x33958cC3535Fc328369EAC2B2Bebd120D67C7fa1 +ValidationLogic: 0x2cBbbBE1B75Ad7848F0844215816F551f429c64f +LendingPoolImpl: 0x8456161947DFc1fC159A0B26c025cD2b4bba0c3e +LendingPool: 0xbAc762e2000b6815268587b081Fd17aC25519aD5 +LendingPoolConfiguratorImpl: 0x5F6CaC05CDF893f029b29F44d368eAeD40e573B6 +LendingPoolConfigurator: 0x2C4603396dE2F08642354A3A102760827FfFe113 +StableAndVariableTokensHelper: 0xadcD6f616fCEEbEd731B2B3F01B8bd51A08b5CbD +ATokensAndRatesHelper: 0x603A373A1571783bD82b708C20a5A4b019BAB78F +DAI: 0x7c2C195CD6D34B8F845992d380aADB2730bB9C6F +AAVE: 0x8858eeB3DfffA017D4BCE9801D340D36Cf895CCf +TUSD: 0x0078371BDeDE8aAc7DeBfFf451B74c5EDB385Af7 +BAT: 0xf4e77E5Da47AC3125140c470c71cBca77B5c638c +WETHMocked: 0x09d728F76D543DB1925f7d1Fd8823e4e82700F99 +WETH: 0xf784709d2317D872237C4bC22f867d1BAe2913AB +USDC: 0x3619DbE27d7c1e7E91aA738697Ae7Bc5FC3eACA5 +USDT: 0x038B86d9d8FAFdd0a02ebd1A476432877b0107C8 +SUSD: 0x1A1FEe7EeD918BD762173e4dc5EfDB8a78C924A8 +ZRX: 0x500D1d6A4c7D8Ae28240b47c8FCde034D827fD5e +MKR: 0xc4905364b78a742ccce7B890A89514061E47068D +WBTC: 0xD6C850aeBFDC46D7F4c207e445cC0d6B0919BDBe +LINK: 0x8B5B7a6055E54a36fF574bbE40cf2eA68d5554b3 +KNC: 0xEcc0a6dbC0bb4D51E4F84A315a9e5B0438cAD4f0 +MANA: 0x20Ce94F404343aD2752A2D01b43fa407db9E0D00 +REN: 0x1d80315fac6aBd3EfeEbE97dEc44461ba7556160 +SNX: 0x2D8553F9ddA85A9B3259F6Bf26911364B85556F5 +BUSD: 0x52d3b94181f8654db2530b0fEe1B19173f519C52 +USD: 0xd15468525c35BDBC1eD8F2e09A00F8a173437f2f +YFI: 0x7e35Eaf7e8FBd7887ad538D4A38Df5BbD073814a +UNI: 0x5bcb88A0d20426e451332eE6C4324b0e663c50E0 +ENJ: 0x3521eF8AaB0323004A6dD8b03CE890F4Ea3A13f5 +WETHDAI: 0x53369fd4680FfE3DfF39Fc6DDa9CfbfD43daeA2E +WETHWBTC: 0xB00cC45B4a7d3e1FEE684cFc4417998A1c183e6d +PriceOracle: 0x06bA8d8af0dF898D0712DffFb0f862cC51AF45c2 +MockAggregator: 0xA0AB1cB92A4AF81f84dCd258155B5c25D247b54E +AaveOracle: 0xD662fb7FDC7526C79AA4417d2A4415416e057ec4 +LendingRateOracle: 0xEC1C93A9f6a9e18E97784c76aC52053587FcDB89 +AaveProtocolDataProvider: 0xf45C720549136d5E2d6a5A2F12573A36E36C3411 +stableDebtAAVE: 0xe3C388495669b8624753a275675AEf9eCc8Eaaa4 +variableDebtAAVE: 0xbdA8106CA657E2bfe1a125f0D0DDE47bA85E92c8 +stableDebtBAT: 0xa8c48Fad16b34bc9BC1203f1784D36CDf61dfD9c +variableDebtBAT: 0x5A7dE46c8176AF8550Df2fEF14464c2cB3B0EE5e +aAAVE: 0x1433d6d0794262c09f19E64177c0dD69A0e4D648 +strategyAAVE: 0x329e6747250B326E5E8029154DFFfE93F4f27016 +aBAT: 0x1A2e1C9d403E9DD6Da5022a14590ec875fBb75ba +strategyBAT: 0x12d5da143C6f7d3322C9b32cdF3a6Cae390A5293 +stableDebtBUSD: 0x453697f5d829556a0373F2b835cF94242B078C9e +variableDebtBUSD: 0x03D049FCA4dE1DA80F9DDF4bf0008115c74C0Da2 +stableDebtDAI: 0x30dDD022BC4df9BB0e6ce94A5535F2137dEA3755 +variableDebtDAI: 0xbfC8B61A3e6eD07C092a74603CeCAe91254745D6 +aBUSD: 0x1BC353ae7758eff98129928631a2D17d69BAb5FA +strategyBUSD: 0x270176D7DB4ec8d2a16b90C78B424AAdbBcFE298 +aDAI: 0x6A61442dBCF10E7168FfcD850CDf7c91Cad3E666 +strategyDAI: 0xA9DD0c06755734f4327F405cd20897D79FaCcFAE +stableDebtENJ: 0x6C0A2d54B37d8Cd321a25328753077D43A387303 +variableDebtENJ: 0x1372E5e41E22BaB997aD453469F0DFB9569dB121 +stableDebtKNC: 0x9bF0208c881906fAC92112320425b403e08Fe44b +variableDebtKNC: 0x6028834D13a4eec68b289E125222e5e5e86a5503 +aENJ: 0x2108E7A4B53516883b60a40ae02600697c8065A2 +strategyENJ: 0x64980e3e653Fe43813A41b9C5AcDB394d7A7320F +aKNC: 0x0f22acabf1Aa485565693B671Fc68B0583f8FEB0 +strategyKNC: 0xC45DA1E746911C76E51CA28b8d8A876735797E3C +stableDebtLINK: 0x3E650a21eAACE6314E98569E8A37FDA1d4cfBE28 +variableDebtLINK: 0xA7430bFB0f7332B1456dCB770D593f1D35bc2B11 +stableDebtMANA: 0x8DB6b6aE3c096E84B9818545974d1577E37Bcb97 +variableDebtMANA: 0x945ea0cf8986724ec075bE09C503c822fF8Ebb75 +aLINK: 0x778c890b128CE3936b744F0c8d7290d1F161D888 +strategyLINK: 0xCD8C6429A2975Db9466fCEFf36020166930a11Cb +aMANA: 0x5fd9aE04361262868d5C33cA1545580fC509b34c +strategyMANA: 0x024CC36954EfDbB9CFdda80a5A8c05Bd8DdF0fc8 +stableDebtMKR: 0xd1bD598200b53FC352483dBe36d9d72C085011A4 +variableDebtMKR: 0x49b81af588031Ecc93E20355E9ADC2d720348347 +stableDebtREN: 0x7367fBfEA2643eCbc0816Cc87B91E82B3Eb307aF +variableDebtREN: 0xAD75a04e5B815558a7E6C84c030e857671875934 +aMKR: 0xbEf21bFD5164eA882d74df73BB0862226C3063E9 +strategyMKR: 0x27a99bef2aF3200c6B7a831C61eF692341C7acEe +aREN: 0xe807dCAB5d5e8c5701c089758aAd34869a4c92Ea +strategyREN: 0xD933d804Dcb597Ac8020623ac32CcE3d4cB81b2a +stableDebtSNX: 0x3F33fb4D89eC6Bd516dCa915A3d85F0374d099d5 +variableDebtSNX: 0xD27B891432c9036E9dC95bc4fE9b8FCb61FBa05e +stableDebtSUSD: 0xFe3C98C3daE2F7562f43D1bBD2021FE127Afec38 +variableDebtSUSD: 0x53070063F0fB13C51C0e2186C0130f29aBe5336b +aSNX: 0x96a8C36C19D2A96642F2738b8E0481f159488EaD +strategySNX: 0xa5eB1859FA97E38C0a4257Af0be9085b3B4B7996 +aSUSD: 0x948Bd60Cba5eB8b7A478aE673145FeA13e2Edbe8 +strategySUSD: 0x7C769501542E694a5Dea6B1FCAf52B9270EADcaf +stableDebtTUSD: 0x6c2E76485dFbaFe2FCC6874e531D71ee82db06f6 +variableDebtTUSD: 0x3FA01122234D545d0247bdDbf4865925A53f6551 +stableDebtUSDC: 0xDD7a535Fb8773EBc4Ae653eCCb22F6561F434a9E +variableDebtUSDC: 0x9d1718D33aE17e54D2aE329b6B51511d4371Bf4a +aTUSD: 0x802881960dCD9457F63c4dbe1E9D081b32b011b9 +strategyTUSD: 0xC1f335a47c45d9F15976A1e11Eb3826590AD2a56 +aUSDC: 0x1CC642F9b88f755C1E7fbB9Acb4A990faddBF608 +strategyUSDC: 0x4272DE39F41085769562b2c17Fd5369097E41492 +stableDebtUSDT: 0x372915a5Bed2B0a5ecEdc96e7133A24aDDFA4Bc4 +variableDebtUSDT: 0x78123523ba15F9847D22a6d3f06bBed70E431114 +stableDebtWBTC: 0x6a3aB96987B70E29bc4203f78D09D0aCB85F219D +variableDebtWBTC: 0xcDD6c3f0dA05129f08DB52380C48A9cf698A8CCA +aUSDT: 0xe88141a1642eD64AE739cd2C896009Be73a43486 +strategyUSDT: 0x881036687070243FC119014c41cdd5e3c22f3E50 +aWBTC: 0xE74801a99A51B89dE670132De7d9c18CC2BBE54A +strategyWBTC: 0x55DFA1D5af234B35D457C13B8a58899848A438F8 +stableDebtWETH: 0xD1220D8A82a26C1396cccb5Ee79d3A42D7D3E3da +variableDebtWETH: 0x4f87eBaac31C3d13C376d52A0FABf5f022660C4c +stableDebtYFI: 0xF2dB8bc0dCd0A6C6F25B7f6ACfB9E026ae0e7494 +variableDebtYFI: 0xce3529624a1f3Ea5DBC1AB130eBeA8211E3b602F +aWETH: 0x7e4b842FFc0598C1f5D8b8A1e2C7AD29E9F233C7 +strategyWETH: 0x52Ac4c1Dbc0263b2FD6AD065B27576d0E7d925B9 +aYFI: 0x895D60248de2edc34C99f1B45d8Dd1731656Df51 +strategyYFI: 0x3cE6D0B4b6dc27C725fA94903Fb33d73bE75e9D7 +stableDebtZRX: 0xF78Fbf3b21aF8Bce2efA3614E507735573c578CC +variableDebtZRX: 0x9Ae60ba71A28a1d738a2FDFC1D0439B33f3f0B1F +aZRX: 0x80aB7B8EfeA24C2D2Ca22315BFa99E03f539C568 +strategyZRX: 0x4D2271CFa5587643B8f5919f3EbF64de7aaa9d5c +DelegationAwareAToken: 0xBAdDA897176B5A94FD4A0eCb59678DDA29181963 +StableDebtToken: 0x64Ea58f488aD445235A0afE9256B066572c6Abc8 +VariableDebtToken: 0x8D0206fEBEB380486729b64bB4cfEDC5b354a6D6 +DefaultReserveInterestRateStrategy: 0x3c5408De7435Dfa3eB2aF2Edf5E39385f68F69b2 +LendingPoolCollateralManagerImpl: 0x6602fca48E95F5068506963E3A8930131108048A +LendingPoolCollateralManager: 0x6602fca48E95F5068506963E3A8930131108048A +MockFlashLoanReceiver: 0x1a66D6103F8BBf9204E1618F095a80b3E4817C95 +WalletBalanceProvider: 0x0EBCa695959e5f138Af772FAa44ce1A9C7aEd921 +WETHGateway: 0x8BFFF31B1757da579Bb5B118489568526F7fb6D4 +MintableDelegationERC20: 0x8BFFF31B1757da579Bb5B118489568526F7fb6D4 +MockAToken: 0x8BFFF31B1757da579Bb5B118489568526F7fb6D4 +MockStableDebtToken: 0x0459c841b02Aee8730730C737582c53B20a27288 +MockVariableDebtToken: 0x2530ce07D254eA185E8e0bCC37a39e2FbA3bE548 +SelfdestructTransferMock: 0x0459c841b02Aee8730730C737582c53B20a27288 +UniswapLendingPool: 0xEC42F4C314dE9492cb3Ef7a860270eCDFE0F851a +UniswapLendingPoolConfigurator: 0x672A68Ff1364E87D8f88ad86410449C117fC97A6 +UniswapLendingPoolAddressesProvider: 0x18b9306737eaf6E8FC8e737F488a1AE077b18053 +UniswapLendingPoolImpl: 0xbAc762e2000b6815268587b081Fd17aC25519aD5 +UniswapLendingPoolConfiguratorImpl: 0xAa7BC1924711B77A0F3Aaebdd550BfeDDDbaf3cd +UniswapPriceOracle: 0xFf130817Aa9863B3D809A2A11617c05646245d80 +UniswapAaveOracle: 0xE91bBe8ee03560E3dda2786f95335F5399813Ca0 +UniswapLendingRateOracle: 0x4977FC58783ceBCC310311C800B786EcAf45F98f +stableDebtWETHDAI: 0x84fF0147dDD2acA72407CfEB7EabCd2b7E49d949 +variableDebtWETHDAI: 0x35A1E1Be236899ab7B63a81127ab522d76A26B3e +aWETHDAI: 0x591D75Ea272E9F22fC4B20Fc4C4E03d8c126b1AB +strategyWETHDAI: 0xF4040B68C37eE6F1324470f48D05cCEC50819b2E +stableDebtWETHWBTC: 0x5a41efF010872DB9a2CA0b47b8b757f37dc35A7f +variableDebtWETHWBTC: 0xee0382a3E9ADeAaA670c425D51ad5F8022c6d9F8 +aWETHWBTC: 0x4dA415c7aDaC37c3d710B5D24b62c6f4a5aF6e5F +strategyWETHWBTC: 0xf0c3F1cd72eA0a1F4e0e98B2e0702fA63a9F9faF +UniswapLendingPoolCollateralManagerImpl: 0x9D2F6Ec881323E78f27d58b996b81EaBCEF8eC58 +UniswapLendingPoolCollateralManager: 0x9D2F6Ec881323E78f27d58b996b81EaBCEF8eC58 +UniswapMockFlashLoanReceiver: 0xad17D0b25259128C968dbCa61CB5864C78004DBE +UniswapWalletBalanceProvider: 0x6Ac05758229c725A6d14F0ae7088985D9B251Fb2 +UniswapWETHGateway: 0xb2B548BE73010C188C083c510d255Aed74843b05 \ No newline at end of file