From d1c6943cd3c766d8e712eb6eb4bc8debe3947c90 Mon Sep 17 00:00:00 2001 From: David Racero Date: Thu, 12 Nov 2020 14:12:26 +0100 Subject: [PATCH] Initial implementation of Tenderly plugin --- config/aave.ts | 23 ++++++++ config/commons.ts | 48 ++++++++++++++-- config/uniswap.ts | 23 ++++++++ docker-compose.yml | 1 + hardhat.config.ts | 7 ++- helpers/contracts-getters.ts | 11 +++- helpers/contracts-helpers.ts | 4 +- helpers/types.ts | 3 + modules/tenderly/tenderly.d.ts | 32 +++++++++++ package.json | 2 + ...ider_registry.ts => 1_address_provider.ts} | 16 +----- tasks/full/3_oracles.ts | 52 ++++++++++++------ tasks/full/5_initialize.ts | 14 +++++ tasks/migrations/aave.mainnet.fork.ts | 55 +++++++++++++++++++ tsconfig.json | 6 +- 15 files changed, 254 insertions(+), 43 deletions(-) create mode 100644 modules/tenderly/tenderly.d.ts rename tasks/full/{1_address_provider_registry.ts => 1_address_provider.ts} (78%) create mode 100644 tasks/migrations/aave.mainnet.fork.ts diff --git a/config/aave.ts b/config/aave.ts index 76f08a9d..0835ee81 100644 --- a/config/aave.ts +++ b/config/aave.ts @@ -129,6 +129,29 @@ export const AaveConfig: IAaveConfiguration = { YFI: '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e', ZRX: '0xe41d2489571d322189246dafa5ebde1f4699f498', }, + [EthereumNetwork.tenderlyMain]: { + AAVE: '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9', + BAT: '0x0d8775f648430679a709e98d2b0cb6250d2887ef', + BUSD: '0x4Fabb145d64652a948d72533023f6E7A623C7C53', + DAI: '0x6b175474e89094c44da98b954eedeac495271d0f', + ENJ: '0xF629cBd94d3791C9250152BD8dfBDF380E2a3B9c', + KNC: '0xdd974d5c2e2928dea5f71b9825b8b646686bd200', + LINK: '0x514910771af9ca656af840dff83e8264ecf986ca', + MANA: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942', + MKR: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', + REN: '0x408e41876cCCDC0F92210600ef50372656052a38', + REP: '0x1985365e9f78359a9B6AD760e32412f4a445E862', + SNX: '0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F', + SUSD: '0x57ab1ec28d129707052df4df418d58a2d46d5f51', + TUSD: '0x0000000000085d4780B73119b644AE5ecd22b376', + UNI: '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984', + USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', + WBTC: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599', + WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + YFI: '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e', + ZRX: '0xe41d2489571d322189246dafa5ebde1f4699f498', + }, }, }; diff --git a/config/commons.ts b/config/commons.ts index 5030a923..43554658 100644 --- a/config/commons.ts +++ b/config/commons.ts @@ -141,6 +141,7 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.main]: undefined, + [eEthereumNetwork.tenderlyMain]: undefined, }, PoolAdminIndex: 0, EmergencyAdmin: { @@ -150,6 +151,7 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.kovan]: undefined, [eEthereumNetwork.ropsten]: undefined, [eEthereumNetwork.main]: undefined, + [eEthereumNetwork.tenderlyMain]: undefined, }, EmergencyAdminIndex: 1, ProviderRegistry: { @@ -159,6 +161,7 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.coverage]: '', [eEthereumNetwork.hardhat]: '', [eEthereumNetwork.buidlerevm]: '', + [eEthereumNetwork.tenderlyMain]: '', }, LendingRateOracle: { [eEthereumNetwork.coverage]: '', @@ -166,7 +169,8 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.kovan]: '0xdCde9Bb6a49e37fA433990832AB541AE2d4FEB4a', [eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b', - [eEthereumNetwork.main]: '0x4d728a4496e4de35f218d5a214366bde3a62b51c', + [eEthereumNetwork.main]: '', + [eEthereumNetwork.tenderlyMain]: '', }, TokenDistributor: { [eEthereumNetwork.coverage]: '', @@ -175,6 +179,7 @@ export const CommonsConfig: ICommonConfiguration = { [EthereumNetwork.kovan]: '0x971efe90088f21dc6a36f610ffed77fc19710708', [EthereumNetwork.ropsten]: '0xeba2ea67942b8250d870b12750b594696d02fc9c', [EthereumNetwork.main]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', + [EthereumNetwork.tenderlyMain]: '0xe3d9988f676457123c5fd01297605efdd0cba1ae', }, ChainlinkProxyPriceProvider: { [eEthereumNetwork.coverage]: '', @@ -182,7 +187,8 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.buidlerevm]: '', [EthereumNetwork.kovan]: '0x276C4793F2EE3D5Bf18C5b879529dD4270BA4814', [EthereumNetwork.ropsten]: '0x657372A559c30d236F011239fF9fbB6D76718271', - [EthereumNetwork.main]: '0x76B47460d7F7c5222cFb6b6A75615ab10895DDe4', + [EthereumNetwork.main]: '', + [EthereumNetwork.tenderlyMain]: '', }, FallbackOracle: { [eEthereumNetwork.coverage]: '', @@ -190,7 +196,8 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.buidlerevm]: '', [EthereumNetwork.kovan]: '0x50913E8E1c650E790F8a1E741FF9B1B1bB251dfe', [EthereumNetwork.ropsten]: '0xAD1a978cdbb8175b2eaeC47B01404f8AEC5f4F0d', - [EthereumNetwork.main]: '0xf67a8b0e3e0ee303422f78b4c5b8da60df80a59c', + [EthereumNetwork.main]: '', + [EthereumNetwork.tenderlyMain]: '', }, ChainlinkAggregator: { [eEthereumNetwork.coverage]: {}, @@ -259,7 +266,36 @@ export const CommonsConfig: ICommonConfiguration = { BAT: '0x9b4e2579895efa2b4765063310Dc4109a7641129', BUSD: '0x5d4BB541EED49D0290730b4aB332aA46bd27d888', DAI: '0x037E8F2125bF532F3e228991e051c8A7253B642c', - ENJ: '0x24D9aB51950F3d62E9144fdC2f3135DAA6Ce8D1B', + ENJ: '0x24D9aB51950F3d62E9 144fdC2f3135DAA6Ce8D1B', + KNC: '0xd0e785973390fF8E77a83961efDb4F271E6B8152', + LINK: '0xeCfA53A8bdA4F0c4dd39c55CC8deF3757aCFDD07', + MANA: '0xc89c4ed8f52Bb17314022f6c0dCB26210C905C97', + MKR: '0xda3d675d50ff6c555973c4f0424964e1f6a4e7d3', + REN: '0x3147D7203354Dc06D9fd350c7a2437bcA92387a4', + REP: '0xb8b513d9cf440C1b6f5C7142120d611C94fC220c', + SNX: '0xE23d1142dE4E83C08bb048bcab54d50907390828', + SUSD: '0x6d626Ff97f0E89F6f983dE425dc5B24A18DE26Ea', + TUSD: '0x73ead35fd6A572EF763B13Be65a9db96f7643577', + UNI: '0xD6aA3D25116d8dA79Ea0246c4826EB951872e02e', + USDC: '0xdE54467873c3BCAA76421061036053e371721708', + USDT: '0xa874fe207DF445ff19E7482C746C4D3fD0CB9AcE', + WBTC: '0x0133Aa47B6197D0BA090Bf2CD96626Eb71fFd13c', + YFI: '0x7c5d4F8345e66f68099581Db340cd65B078C41f4', + ZRX: '0xA0F9D94f060836756FFC84Db4C78d097cA8C23E8', + UNI_DAI_ETH: '0x1bAB293850289Bf161C5DA79ff3d1F02A950555b', + UNI_LEND_ETH: '0xF4C8Db2d999b024bBB6c6022566503eD41f2AC1E', + UNI_LINK_ETH: '0xE2A639Beb647d7F709ca805ABa760bBEfdbE37e3', + UNI_MKR_ETH: '0xEe40a5E8F3732bE6ECDb5A90e23D0b7bF0D4a73c', + UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', + UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', + USD: '0x59b826c214aBa7125bFA52970d97736c105Cc375', + }, + [EthereumNetwork.tenderlyMain]: { + AAVE: '0x6Df09E975c830ECae5bd4eD9d90f3A95a4f88012', + BAT: '0x9b4e2579895efa2b4765063310Dc4109a7641129', + BUSD: '0x5d4BB541EED49D0290730b4aB332aA46bd27d888', + DAI: '0x037E8F2125bF532F3e228991e051c8A7253B642c', + ENJ: '0x24D9aB51950F3d62E9 144fdC2f3135DAA6Ce8D1B', KNC: '0xd0e785973390fF8E77a83961efDb4F271E6B8152', LINK: '0xeCfA53A8bdA4F0c4dd39c55CC8deF3757aCFDD07', MANA: '0xc89c4ed8f52Bb17314022f6c0dCB26210C905C97', @@ -291,6 +327,7 @@ export const CommonsConfig: ICommonConfiguration = { [EthereumNetwork.main]: {}, [EthereumNetwork.kovan]: {}, [EthereumNetwork.ropsten]: {}, + [EthereumNetwork.tenderlyMain]: {}, }, ReservesConfig: {}, ATokenDomainSeparator: { @@ -303,6 +340,7 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.kovan]: '', [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '', + [eEthereumNetwork.tenderlyMain]: '', }, ProxyPriceProvider: { [eEthereumNetwork.coverage]: '', @@ -311,6 +349,7 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.kovan]: '0xB8bE51E6563BB312Cbb2aa26e352516c25c26ac1', [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '', + [eEthereumNetwork.tenderlyMain]: '', }, WETH: { [eEthereumNetwork.coverage]: '', // deployed in local evm @@ -319,5 +358,6 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', [eEthereumNetwork.ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', [eEthereumNetwork.main]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + [eEthereumNetwork.tenderlyMain]: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', }, }; diff --git a/config/uniswap.ts b/config/uniswap.ts index 84a9612f..78852196 100644 --- a/config/uniswap.ts +++ b/config/uniswap.ts @@ -181,6 +181,17 @@ export const UniswapConfig: IUniswapConfiguration = { UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', }, + [EthereumNetwork.tenderlyMain]: { + DAI: '0x037E8F2125bF532F3e228991e051c8A7253B642c', + USDC: '0xdE54467873c3BCAA76421061036053e371721708', + USDT: '0xa874fe207DF445ff19E7482C746C4D3fD0CB9AcE', + UNI_DAI_ETH: '0x1bAB293850289Bf161C5DA79ff3d1F02A950555b', + UNI_LEND_ETH: '0xF4C8Db2d999b024bBB6c6022566503eD41f2AC1E', + UNI_LINK_ETH: '0xE2A639Beb647d7F709ca805ABa760bBEfdbE37e3', + UNI_MKR_ETH: '0xEe40a5E8F3732bE6ECDb5A90e23D0b7bF0D4a73c', + UNI_SETH_ETH: '0x517D40E49660c7705b2e99eEFA6d7B0E9Ba5BF10', + UNI_USDC_ETH: '0x444315Ee92F2bb3579293C17B07194227fA99bF0', + }, }, ReserveAssets: { [eEthereumNetwork.hardhat]: {}, @@ -222,5 +233,17 @@ export const UniswapConfig: IUniswapConfiguration = { UNI_SETH_ETH: '0xe9cf7887b93150d4f2da7dfc6d502b216438f244', UNI_USDC_ETH: '0x97dec872013f6b5fb443861090ad931542878126', }, + [EthereumNetwork.tenderlyMain]: { + DAI: '0x6b175474e89094c44da98b954eedeac495271d0f', + USDC: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + USDT: '0xdac17f958d2ee523a2206206994597c13d831ec7', + WETH: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', + UNI_DAI_ETH: '0x2a1530c4c41db0b0b2bb646cb5eb1a67b7158667', + UNI_LEND_ETH: '0xcaa7e4656f6a2b59f5f99c745f91ab26d1210dce', + UNI_LINK_ETH: '0xf173214c720f58e03e194085b1db28b50acdeead', + UNI_MKR_ETH: '0x2c4bd064b998838076fa341a83d007fc2fa50957', + UNI_SETH_ETH: '0xe9cf7887b93150d4f2da7dfc6d502b216438f244', + UNI_USDC_ETH: '0x97dec872013f6b5fb443861090ad931542878126', + }, }, }; diff --git a/docker-compose.yml b/docker-compose.yml index 5ea0552e..f6cca30f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,6 +10,7 @@ services: command: npm run run-env volumes: - ./:/src + - $HOME/.tenderly/config.yaml:/root/.tenderly/config.yaml environment: MNEMONIC: ${MNEMONIC} ETHERSCAN_KEY: ${ETHERSCAN_KEY} diff --git a/hardhat.config.ts b/hardhat.config.ts index 9eebd6b0..5e366506 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,6 +1,5 @@ import path from 'path'; import fs from 'fs'; -import {HardhatUserConfig} from 'hardhat/config'; // @ts-ignore import {accounts} from './test-wallets.js'; import {eEthereumNetwork} from './helpers/types'; @@ -11,6 +10,7 @@ import '@nomiclabs/hardhat-waffle'; import 'temp-hardhat-etherscan'; import 'hardhat-gas-reporter'; import 'hardhat-typechain'; +import '@tenderly/hardhat-tenderly'; const SKIP_LOAD = process.env.SKIP_LOAD === 'true'; const DEFAULT_BLOCK_GAS_LIMIT = 12450000; @@ -75,8 +75,8 @@ const buidlerConfig = { timeout: 0, }, tenderly: { - project: process.env.TENDERLY_PROJECT, - username: process.env.TENDERLY_USERNAME, + // project: process.env.TENDERLY_PROJECT, + //username: process.env.TENDERLY_USERNAME, forkNetwork: '1', //Network id of the network we want to fork }, networks: { @@ -87,6 +87,7 @@ const buidlerConfig = { kovan: getCommonNetworkConfig(eEthereumNetwork.kovan, 42), ropsten: getCommonNetworkConfig(eEthereumNetwork.ropsten, 3), main: getCommonNetworkConfig(eEthereumNetwork.main, 1), + tenderlyMain: getCommonNetworkConfig(eEthereumNetwork.main, 1), hardhat: { hardfork: 'istanbul', blockGasLimit: DEFAULT_BLOCK_GAS_LIMIT, diff --git a/helpers/contracts-getters.ts b/helpers/contracts-getters.ts index fa220c28..791a9185 100644 --- a/helpers/contracts-getters.ts +++ b/helpers/contracts-getters.ts @@ -2,6 +2,7 @@ import { AaveProtocolDataProviderFactory, ATokenFactory, ATokensAndRatesHelperFactory, + ChainlinkProxyPriceProviderFactory, DefaultReserveInterestRateStrategyFactory, GenericLogicFactory, InitializableAdminUpgradeabilityProxyFactory, @@ -23,12 +24,10 @@ import { StableDebtTokenFactory, VariableDebtTokenFactory, WalletBalanceProviderFactory, - Weth9Factory, Weth9MockedFactory, WethGatewayFactory, } from '../types'; import {Ierc20DetailedFactory} from '../types/Ierc20DetailedFactory'; -import {UpgradeabilityProxy} from '../types/UpgradeabilityProxy'; import {MockTokenMap} from './contracts-helpers'; import {DRE, getDb} from './misc-utils'; import {eContractid, PoolConfiguration, tEthereumAddress, TokenContractId} from './types'; @@ -323,3 +322,11 @@ export const getLendingPoolCollateralManager = async (address?: tEthereumAddress export const getAddressById = async (id: string) => (await getDb().get(`${id}.${DRE.network.name}`).value()).address; + +export const getChainlinkPriceProvider = async (address?: tEthereumAddress) => + await ChainlinkProxyPriceProviderFactory.connect( + address || + (await getDb().get(`${eContractid.ChainlinkProxyPriceProvider}.${DRE.network.name}`).value()) + .address, + await getFirstSigner() + ); diff --git a/helpers/contracts-helpers.ts b/helpers/contracts-helpers.ts index ba8ee5d1..22c5dcd2 100644 --- a/helpers/contracts-helpers.ts +++ b/helpers/contracts-helpers.ts @@ -124,7 +124,7 @@ export const linkBytecode = (artifact: BuidlerArtifact | Artifact, libraries: an }; export const getParamPerNetwork = ( - {kovan, ropsten, main, buidlerevm, coverage}: iParamsPerNetwork, + {kovan, ropsten, main, buidlerevm, coverage, tenderlyMain}: iParamsPerNetwork, network: eEthereumNetwork ) => { switch (network) { @@ -140,6 +140,8 @@ export const getParamPerNetwork = ( return ropsten; case eEthereumNetwork.main: return main; + case eEthereumNetwork.tenderlyMain: + return tenderlyMain; } }; diff --git a/helpers/types.ts b/helpers/types.ts index c9aac797..7c447ea9 100644 --- a/helpers/types.ts +++ b/helpers/types.ts @@ -11,6 +11,7 @@ export enum eEthereumNetwork { main = 'main', coverage = 'coverage', hardhat = 'hardhat', + tenderlyMain = 'tenderlyMain', } export enum EthereumNetworkNames { @@ -324,6 +325,7 @@ export interface iParamsPerNetwork { [eEthereumNetwork.ropsten]: T; [eEthereumNetwork.main]: T; [eEthereumNetwork.hardhat]: T; + [eEthereumNetwork.tenderlyMain]: T; } export interface iParamsPerPool { @@ -352,6 +354,7 @@ export enum EthereumNetwork { development = 'development', main = 'main', coverage = 'soliditycoverage', + tenderlyMain = 'tenderlyMain', } export interface IProtocolGlobalConfig { diff --git a/modules/tenderly/tenderly.d.ts b/modules/tenderly/tenderly.d.ts new file mode 100644 index 00000000..5e106e80 --- /dev/null +++ b/modules/tenderly/tenderly.d.ts @@ -0,0 +1,32 @@ +import 'hardhat/types/config'; +import 'hardhat/types/runtime'; + +import {TenderlyConfig} from './types'; + +declare module 'hardhat/types/runtime' { + export interface HardhatRuntimeEnvironment { + tenderly: { + verify: (...contracts) => Promise; + push: (...contracts) => Promise; + persistArtifacts: (...contracts) => Promise; + }; + tenderlyRPC: { + verify: (...contracts) => Promise; + resetFork: () => string | undefined; + getHead: () => string | undefined; + setHead: (head: string | undefined) => void; + getFork: () => string | undefined; + setFork: (fork: string | undefined) => void; + }; + } +} + +declare module 'hardhat/types/config' { + export interface HardhatUserConfig { + tenderly?: TenderlyConfig; + } + + export interface HardhatConfig { + tenderly: TenderlyConfig; + } +} diff --git a/package.json b/package.json index 00bc19ad..92f442bf 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "run-env": "npm i && tail -f /dev/null", "hardhat": "hardhat", "hardhat:kovan": "hardhat --network kovan", + "hardhat:tenderly-main": "hardhat --network tenderlyMain", "hardhat:ropsten": "hardhat--network ropsten", "hardhat:main": "hardhat --network main", "hardhat:docker": "hardhat --network hardhatevm_docker", @@ -21,6 +22,7 @@ "aave:kovan:full:initialize": "npm run hardhat:kovan -- full:initialize-lending-pool --verify --pool Aave", "aave:ropsten:dev:migration": "npm run hardhat:ropsten -- aave:dev --verify", "aave:ropsten:full:migration": "npm run hardhat:ropsten -- aave:full --verify", + "aave:fork:main:migration": "npm run hardhat:tenderly-main -- aave:full:fork", "aave:main:dev:migration": "npm run hardhat:main -- aave:dev --verify", "aave:main:full:migration": "npm run hardhat:main -- aave:full --verify", "uniswap:evm:dev:migration": "hardhat uniswap:dev", diff --git a/tasks/full/1_address_provider_registry.ts b/tasks/full/1_address_provider.ts similarity index 78% rename from tasks/full/1_address_provider_registry.ts rename to tasks/full/1_address_provider.ts index 5af922d4..cc9edf0c 100644 --- a/tasks/full/1_address_provider_registry.ts +++ b/tasks/full/1_address_provider.ts @@ -28,7 +28,9 @@ task( const providerRegistryAddress = getParamPerNetwork(poolConfig.ProviderRegistry, network); // Deploy address provider and set genesis manager + console.log('addres provider'); const addressesProvider = await deployLendingPoolAddressesProvider(verify); + await waitForTx(await addressesProvider.setPoolAdmin(await getGenesisPoolAdmin(poolConfig))); const admin = await getEmergencyAdmin(poolConfig); console.log('Admin is ', admin); @@ -46,18 +48,4 @@ task( ProviderId ) ); - - //register the proxy price provider on the addressesProvider - const proxyProvider = getParamPerNetwork(poolConfig.ProxyPriceProvider, network); - - if (proxyProvider && proxyProvider !== '') { - await waitForTx(await addressesProvider.setPriceOracle(proxyProvider)); - } - - //register the lending rate oracle - const lendingRateOracle = getParamPerNetwork(poolConfig.LendingRateOracle, network); - - if (lendingRateOracle && lendingRateOracle !== '') { - await waitForTx(await addressesProvider.setLendingRateOracle(lendingRateOracle)); - } }); diff --git a/tasks/full/3_oracles.ts b/tasks/full/3_oracles.ts index 48782dba..e492724c 100644 --- a/tasks/full/3_oracles.ts +++ b/tasks/full/3_oracles.ts @@ -7,10 +7,18 @@ import { import {setInitialMarketRatesInRatesOracleByHelper} from '../../helpers/oracles-helpers'; import {ICommonConfiguration, eEthereumNetwork, SymbolMap} from '../../helpers/types'; import {waitForTx, filterMapBy} from '../../helpers/misc-utils'; -import {ConfigNames, loadPoolConfig, getWethAddress} from '../../helpers/configuration'; +import { + ConfigNames, + loadPoolConfig, + getWethAddress, + getGenesisPoolAdmin, +} from '../../helpers/configuration'; import {exit} from 'process'; import { + getAddressById, + getChainlinkPriceProvider, getLendingPoolAddressesProvider, + getLendingRateOracle, getPairsTokenAggregator, } from '../../helpers/contracts-getters'; @@ -33,8 +41,9 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') Object.keys(ReserveAssets[network]).includes(key) ); const addressesProvider = await getLendingPoolAddressesProvider(); - const admin = await addressesProvider.getPoolAdmin(); - + const admin = await getGenesisPoolAdmin(poolConfig); + const proxyPriceProviderAddress = getParamPerNetwork(poolConfig.ProxyPriceProvider, network); + const lendingRateOracleAddress = getParamPerNetwork(poolConfig.LendingRateOracle, network); const fallbackOracle = await getParamPerNetwork(FallbackOracle, network); const reserveAssets = await getParamPerNetwork(ReserveAssets, network); const chainlinkAggregators = await getParamPerNetwork(ChainlinkAggregator, network); @@ -45,24 +54,33 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') }; const [tokens, aggregators] = getPairsTokenAggregator(tokensToWatch, chainlinkAggregators); - const chainlinkProviderPriceProvider = await deployChainlinkProxyPriceProvider( - [tokens, aggregators, fallbackOracle, await getWethAddress(poolConfig)], - verify - ); + const chainlinkProviderPriceProvider = proxyPriceProviderAddress + ? await getChainlinkPriceProvider(proxyPriceProviderAddress) + : await deployChainlinkProxyPriceProvider( + [tokens, aggregators, fallbackOracle, await getWethAddress(poolConfig)], + verify + ); + + const lendingRateOracle = lendingRateOracleAddress + ? await getLendingRateOracle(lendingRateOracleAddress) + : await deployLendingRateOracle(verify); + + const {USD, ...tokensAddressesWithoutUsd} = tokensToWatch; + + if (!lendingRateOracleAddress) { + await setInitialMarketRatesInRatesOracleByHelper( + lendingRateOracles, + tokensAddressesWithoutUsd, + lendingRateOracle, + admin + ); + } + + // Register the proxy price provider on the addressesProvider await waitForTx( await addressesProvider.setPriceOracle(chainlinkProviderPriceProvider.address) ); - - const lendingRateOracle = await deployLendingRateOracle(verify); await waitForTx(await addressesProvider.setLendingRateOracle(lendingRateOracle.address)); - - const {USD, ...tokensAddressesWithoutUsd} = tokensToWatch; - await setInitialMarketRatesInRatesOracleByHelper( - lendingRateOracles, - tokensAddressesWithoutUsd, - lendingRateOracle, - admin - ); } catch (err) { console.error(err); exit(1); diff --git a/tasks/full/5_initialize.ts b/tasks/full/5_initialize.ts index 99b55f15..718c2231 100644 --- a/tasks/full/5_initialize.ts +++ b/tasks/full/5_initialize.ts @@ -54,6 +54,20 @@ task('full:initialize-lending-pool', 'Initialize lending pool configuration.') const lendingPoolAddress = await addressesProvider.getLendingPool(); await deployWETHGateway([wethAddress, lendingPoolAddress]); + + //register the proxy price provider on the addressesProvider + const proxyProvider = getParamPerNetwork(poolConfig.ProxyPriceProvider, network); + + if (proxyProvider && proxyProvider !== '') { + await waitForTx(await addressesProvider.setPriceOracle(proxyProvider)); + } + + //register the lending rate oracle + const lendingRateOracle = getParamPerNetwork(poolConfig.LendingRateOracle, network); + + if (lendingRateOracle && lendingRateOracle !== '') { + await waitForTx(await addressesProvider.setLendingRateOracle(lendingRateOracle)); + } } catch (err) { console.error(err); exit(1); diff --git a/tasks/migrations/aave.mainnet.fork.ts b/tasks/migrations/aave.mainnet.fork.ts new file mode 100644 index 00000000..9f61d042 --- /dev/null +++ b/tasks/migrations/aave.mainnet.fork.ts @@ -0,0 +1,55 @@ +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('aave:full:fork', 'Deploy development enviroment') + .addFlag('verify', 'Verify contracts at Etherscan') + .setAction(async ({verify}, DRE) => { + const POOL_NAME = ConfigNames.Aave; + const network = DRE.network.name; + if (!network.includes('tenderly')) { + throw 'This task only supports tenderly networks: tenderlyMain, tenderlyKovan'; + } + await DRE.run('set-DRE'); + + // Prevent loss of gas verifying all the needed ENVs for Etherscan verification + if (verify) { + checkVerification(); + } + console.log('- Setting up Tenderly provider'); + DRE.ethers.provider = new DRE.ethers.providers.Web3Provider( + DRE.tenderlyRPC as ExternalProvider + ); + + //Set the ethers provider to the one we initialized so it targets the correct backend + 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. 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}); + } + const postDeployHead = DRE.tenderlyRPC.getHead(); + console.log('HEAD', postDeployHead); + + console.log('\nFinished migrations'); + printContracts(); + }); diff --git a/tsconfig.json b/tsconfig.json index e6a15a81..a4f43f9b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,11 +4,13 @@ "module": "commonjs", "strict": true, "esModuleInterop": true, - "outDir": "dist" + "outDir": "dist", + "noImplicitAny": false }, - "include": ["./scripts", "./test"], + "include": ["./scripts", "./test", "./tasks"], "files": [ "./hardhat.config.ts", + "./modules/tenderly/tenderly.d.ts", "node_modules/@nomiclabs/buidler-ethers/src/type-extensions.d.ts", "node_modules/buidler-typechain/src/type-extensions.d.ts", "node_modules/@nomiclabs/buidler-waffle/src/type-extensions.d.ts",