diff --git a/docker-compose.test.yml b/docker-compose.test.yml index d71c1956..ceb59e73 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -7,3 +7,4 @@ services: environment: - MNEMONIC - ALCHEMY_KEY + - TENDERLY_FORK_ID diff --git a/docker-compose.yml b/docker-compose.yml index f6cca30f..5500aac7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,3 +19,4 @@ services: TENDERLY_PROJECT: ${TENDERLY_PROJECT} TENDERLY_USERNAME: ${TENDERLY_USERNAME} ALCHEMY_KEY: ${ALCHEMY_KEY} + TENDERLY_FORK_ID: ${TENDERLY_FORK_ID} diff --git a/helper-hardhat-config.ts b/helper-hardhat-config.ts index c25f7b9f..552a2e52 100644 --- a/helper-hardhat-config.ts +++ b/helper-hardhat-config.ts @@ -1,10 +1,16 @@ // @ts-ignore -import { eEthereumNetwork, ePolygonNetwork, eXDaiNetwork, iParamsPerNetwork } from './helpers/types'; +import { + eEthereumNetwork, + ePolygonNetwork, + eXDaiNetwork, + iParamsPerNetwork, +} from './helpers/types'; require('dotenv').config(); const INFURA_KEY = process.env.INFURA_KEY || ''; const ALCHEMY_KEY = process.env.ALCHEMY_KEY || ''; +const TENDERLY_FORK_ID = process.env.TENDERLY_FORK_ID || ''; const GWEI = 1000 * 1000 * 1000; @@ -21,23 +27,21 @@ export const NETWORKS_RPC_URL: iParamsPerNetwork = { [eEthereumNetwork.coverage]: 'http://localhost:8555', [eEthereumNetwork.hardhat]: 'http://localhost:8545', [eEthereumNetwork.buidlerevm]: 'http://localhost:8545', - [eEthereumNetwork.tenderlyMain]: ALCHEMY_KEY - ? `https://eth-mainnet.alchemyapi.io/v2/${ALCHEMY_KEY}` - : `https://mainnet.infura.io/v3/${INFURA_KEY}`, + [eEthereumNetwork.tenderlyMain]: `https://rpc.tenderly.co/fork/${TENDERLY_FORK_ID}`, [ePolygonNetwork.mumbai]: 'https://rpc-mumbai.maticvigil.com', [ePolygonNetwork.matic]: 'https://rpc-mainnet.matic.network', [eXDaiNetwork.xdai]: 'https://rpc.xdaichain.com/', -} +}; export const NETWORKS_DEFAULT_GAS: iParamsPerNetwork = { - [eEthereumNetwork.kovan]: 65 * GWEI , - [eEthereumNetwork.ropsten]: 65 * GWEI , - [eEthereumNetwork.main]: 65 * GWEI , - [eEthereumNetwork.coverage]: 65 * GWEI , - [eEthereumNetwork.hardhat]: 65 * GWEI , - [eEthereumNetwork.buidlerevm]: 65 * GWEI , - [eEthereumNetwork.tenderlyMain]: 65 * GWEI , - [ePolygonNetwork.mumbai]: 1 * GWEI , - [ePolygonNetwork.matic]: 2 * GWEI , + [eEthereumNetwork.kovan]: 65 * GWEI, + [eEthereumNetwork.ropsten]: 65 * GWEI, + [eEthereumNetwork.main]: 65 * GWEI, + [eEthereumNetwork.coverage]: 65 * GWEI, + [eEthereumNetwork.hardhat]: 65 * GWEI, + [eEthereumNetwork.buidlerevm]: 65 * GWEI, + [eEthereumNetwork.tenderlyMain]: 0.01 * GWEI, + [ePolygonNetwork.mumbai]: 1 * GWEI, + [ePolygonNetwork.matic]: 2 * GWEI, [eXDaiNetwork.xdai]: 1 * GWEI, -} \ No newline at end of file +}; diff --git a/helpers/contracts-helpers.ts b/helpers/contracts-helpers.ts index d7e50664..455dbb78 100644 --- a/helpers/contracts-helpers.ts +++ b/helpers/contracts-helpers.ts @@ -99,11 +99,14 @@ export const withSaveAndVerify = async ( await waitForTx(instance.deployTransaction); await registerContractInJsonDb(id, instance); if (usingTenderly()) { - console.log('doing verify of', id); + console.log(); + console.log('Doing Tenderly contract verification of', id); await (DRE as any).tenderlyRPC.verify({ name: id, address: instance.address, }); + console.log(`Verified ${id} at Tenderly!`); + console.log(); } if (verify) { await verifyContract(instance.address, args); diff --git a/markets/amm/commons.ts b/markets/amm/commons.ts index ce8614a8..b892064d 100644 --- a/markets/amm/commons.ts +++ b/markets/amm/commons.ts @@ -1,5 +1,11 @@ import BigNumber from 'bignumber.js'; -import { oneEther, oneRay, RAY, ZERO_ADDRESS, MOCK_CHAINLINK_AGGREGATORS_PRICES } from '../../helpers/constants'; +import { + oneEther, + oneRay, + RAY, + ZERO_ADDRESS, + MOCK_CHAINLINK_AGGREGATORS_PRICES, +} from '../../helpers/constants'; import { ICommonConfiguration, eEthereumNetwork } from '../../helpers/types'; // ---------------- @@ -54,7 +60,7 @@ export const CommonsConfig: ICommonConfiguration = { UniWBTCWETH: { borrowRate: oneRay.multipliedBy(0.05).toFixed(), }, - UniAAVEWETH:{ + UniAAVEWETH: { borrowRate: oneRay.multipliedBy(0.05).toFixed(), }, UniBATWETH: { @@ -95,7 +101,7 @@ export const CommonsConfig: ICommonConfiguration = { }, BptBALWETH: { borrowRate: oneRay.multipliedBy(0.05).toFixed(), - } + }, }, // ---------------- // COMMON PROTOCOL ADDRESSES ACROSS POOLS @@ -132,7 +138,8 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.tenderlyMain]: '0x52D306e36E3B6B02c153d0266ff0f85d18BCD413', }, - ProviderRegistryOwner: { // DEPLOYED WITH CORRECT ADDRESS + ProviderRegistryOwner: { + // DEPLOYED WITH CORRECT ADDRESS [eEthereumNetwork.kovan]: '0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F', [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '0xbd723fc4f1d737dcfc48a07fe7336766d34cad5f', @@ -144,8 +151,8 @@ export const CommonsConfig: ICommonConfiguration = { LendingRateOracle: { [eEthereumNetwork.coverage]: '', [eEthereumNetwork.hardhat]: '', - [eEthereumNetwork.buidlerevm]: '',// Updated to match Kovan deployment - [eEthereumNetwork.kovan]: '0xd00Bd28FAdDa9d5658D1D4e0c151973146C7A533',//'0xE48F95873855bfd97BF89572DDf5cBC44D9c545b' + [eEthereumNetwork.buidlerevm]: '', // Updated to match Kovan deployment + [eEthereumNetwork.kovan]: '0xd00Bd28FAdDa9d5658D1D4e0c151973146C7A533', //'0xE48F95873855bfd97BF89572DDf5cBC44D9c545b' [eEthereumNetwork.ropsten]: '0x05dcca805a6562c1bdd0423768754acb6993241b', [eEthereumNetwork.main]: '', //'0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', // Need to re-deploy because of onlyOwner [eEthereumNetwork.tenderlyMain]: '0x8A32f49FFbA88aba6EFF96F45D8BD1D4b3f35c7D', @@ -201,7 +208,7 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.buidlerevm]: '', [eEthereumNetwork.kovan]: '0x8fb777d67e9945e2c01936e319057f9d41d559e6', // Need to re-deploy because of onlyOwner [eEthereumNetwork.ropsten]: ZERO_ADDRESS, - [eEthereumNetwork.main]: '',//'0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', // Need to re-deploy because of onlyOwner + [eEthereumNetwork.main]: '', //'0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', // Need to re-deploy because of onlyOwner [eEthereumNetwork.tenderlyMain]: '0xA50ba011c48153De246E5192C8f9258A2ba79Ca9', }, FallbackOracle: { @@ -221,9 +228,9 @@ export const CommonsConfig: ICommonConfiguration = { USDT: '0x0bF499444525a23E7Bb61997539725cA2e928138', WBTC: '0xF7904a295A029a3aBDFFB6F12755974a958C7C25', USDC: '0x64EaC61A2DFda2c3Fa04eED49AA33D021AeC8838', - DAI:'0x22B58f1EbEDfCA50feF632bD73368b2FdA96D541', - UniDAIWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', // Mock oracles - UniWBTCWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', + DAI: '0x22B58f1EbEDfCA50feF632bD73368b2FdA96D541', + UniDAIWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', // Mock oracles + UniWBTCWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', UniAAVEWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', UniBATWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', UniDAIUSDC: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', @@ -240,52 +247,51 @@ export const CommonsConfig: ICommonConfiguration = { BptBALWETH: '0x5699302154A020FB1DE2B1d39f4c73785A235d8F', USD: '0x9326BFA02ADD2366b30bacB125260Af641031331', }, - [eEthereumNetwork.ropsten]: { - }, + [eEthereumNetwork.ropsten]: {}, [eEthereumNetwork.main]: { USDT: '0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46', WBTC: '0xdeb288F737066589598e9214E782fa5A8eD689e8', USDC: '0x986b5E1e1755e3C2440e960477f25201B0a8bbD4', - DAI:'0x773616E4d11A78F511299002da57A0a94577F1f4', + DAI: '0x773616E4d11A78F511299002da57A0a94577F1f4', UniDAIWETH: '0xf4071801C4421Db7e63DaC15B9432e50C44a7F42', - UniWBTCWETH: ZERO_ADDRESS, - UniAAVEWETH: ZERO_ADDRESS, - UniBATWETH: ZERO_ADDRESS, - UniDAIUSDC: ZERO_ADDRESS, - UniCRVWETH: ZERO_ADDRESS, - UniLINKWETH: ZERO_ADDRESS, - UniMKRWETH: ZERO_ADDRESS, - UniRENWETH: ZERO_ADDRESS, - UniSNXWETH: ZERO_ADDRESS, - UniUNIWETH: ZERO_ADDRESS, - UniUSDCWETH: ZERO_ADDRESS, - UniWBTCUSDC: ZERO_ADDRESS, - UniYFIWETH: ZERO_ADDRESS, - BptWBTCWETH: ZERO_ADDRESS, - BptBALWETH: ZERO_ADDRESS, + UniWBTCWETH: '0x55EF7F1226507cFd846DE009C2f097c2211b6Fb8', + UniAAVEWETH: '0x5671387d56eAB334A2D65d6D0BB4D907898C7abA', + UniBATWETH: '0xA61ca04DF33B72b235a8A28CfB535bb7A5271B70', + UniDAIUSDC: '0xFd8dFc92B030e6BA957336e9f08C2a711e19069A', + UniCRVWETH: '0xd4D344D076256Fdf806375983b2cab2Db52FD506', + UniLINKWETH: '0x8C0e5df19B998F06e57A1Db1a38232F7590abe4b', + UniMKRWETH: '0x92f2A28fE33E0b6Ea218057EEe004E3B2B6de45d', + UniRENWETH: '0xFc0398b247107138dB494395600fB0d075b72C9A', + UniSNXWETH: '0xF5CB13c859383B5fb070bd111Cae7a900c00BA07', + UniUNIWETH: '0xE50e47E37DCF55dE1c5F2c32d346BB52064f7CE6', + UniUSDCWETH: '0xBE6ac123799572c98eFdE48895465AB392534AFD', + UniWBTCUSDC: '0xd6b8b08a0d13994A5f4a1949F4870DE57e9B40d9', + UniYFIWETH: '0x94daB35789f05f54224F6851921160DE21318072', + BptWBTCWETH: '0x4a2731c9f3B4355922c676f9b538278D79C299C5', + BptBALWETH: '0xD9400999f38E1877a6dDDb0090A327F19257f9AE', USD: '0x9326BFA02ADD2366b30bacB125260Af641031331', }, [eEthereumNetwork.tenderlyMain]: { USDT: '0xEe9F2375b4bdF6387aa8265dD4FB8F16512A1d46', WBTC: '0xdeb288F737066589598e9214E782fa5A8eD689e8', USDC: '0x986b5E1e1755e3C2440e960477f25201B0a8bbD4', - DAI:'0x773616E4d11A78F511299002da57A0a94577F1f4', - UniDAIWETH: ZERO_ADDRESS, - UniWBTCWETH: ZERO_ADDRESS, - UniAAVEWETH: ZERO_ADDRESS, - UniBATWETH: ZERO_ADDRESS, - UniDAIUSDC: ZERO_ADDRESS, - UniCRVWETH: ZERO_ADDRESS, - UniLINKWETH: ZERO_ADDRESS, - UniMKRWETH: ZERO_ADDRESS, - UniRENWETH: ZERO_ADDRESS, - UniSNXWETH: ZERO_ADDRESS, - UniUNIWETH: ZERO_ADDRESS, - UniUSDCWETH: ZERO_ADDRESS, - UniWBTCUSDC: ZERO_ADDRESS, - UniYFIWETH: ZERO_ADDRESS, - BptWBTCWETH: ZERO_ADDRESS, - BptBALWETH: ZERO_ADDRESS, + DAI: '0x773616E4d11A78F511299002da57A0a94577F1f4', + UniDAIWETH: '0xf4071801C4421Db7e63DaC15B9432e50C44a7F42', + UniWBTCWETH: '0x55EF7F1226507cFd846DE009C2f097c2211b6Fb8', + UniAAVEWETH: '0x5671387d56eAB334A2D65d6D0BB4D907898C7abA', + UniBATWETH: '0xA61ca04DF33B72b235a8A28CfB535bb7A5271B70', + UniDAIUSDC: '0xFd8dFc92B030e6BA957336e9f08C2a711e19069A', + UniCRVWETH: '0xd4D344D076256Fdf806375983b2cab2Db52FD506', + UniLINKWETH: '0x8C0e5df19B998F06e57A1Db1a38232F7590abe4b', + UniMKRWETH: '0x92f2A28fE33E0b6Ea218057EEe004E3B2B6de45d', + UniRENWETH: '0xFc0398b247107138dB494395600fB0d075b72C9A', + UniSNXWETH: '0xF5CB13c859383B5fb070bd111Cae7a900c00BA07', + UniUNIWETH: '0xE50e47E37DCF55dE1c5F2c32d346BB52064f7CE6', + UniUSDCWETH: '0xBE6ac123799572c98eFdE48895465AB392534AFD', + UniWBTCUSDC: '0xd6b8b08a0d13994A5f4a1949F4870DE57e9B40d9', + UniYFIWETH: '0x94daB35789f05f54224F6851921160DE21318072', + BptWBTCWETH: '0x4a2731c9f3B4355922c676f9b538278D79C299C5', + BptBALWETH: '0xD9400999f38E1877a6dDDb0090A327F19257f9AE', USD: '0x9326BFA02ADD2366b30bacB125260Af641031331', }, }, diff --git a/package.json b/package.json index 2b3703c4..c2214791 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "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", "amm:fork:main": "npm run compile && MAINNET_FORK=true hardhat amm:mainnet", + "amm:fork:main:tenderly": "npm run compile && npm run hardhat:tenderly-main -- amm: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", "amm:main:full:migration": "npm run compile && npm run hardhat:main -- amm:mainnet --verify", diff --git a/tasks/full/1_address_provider.ts b/tasks/full/1_address_provider.ts index 88852c0c..d9563ebc 100644 --- a/tasks/full/1_address_provider.ts +++ b/tasks/full/1_address_provider.ts @@ -64,13 +64,7 @@ task( const firstAccount = await getFirstSigner(); await firstAccount.sendTransaction({ value: parseEther('10'), to: providerRegistryOwner }); } else { - signer = await getFirstSigner(); - const deployerAddress = await signer.getAddress(); - if (providerRegistryOwner !== (await signer.getAddress())) { - throw Error( - `Current signer is not provider registry owner. \nCurrent deployer address: ${deployerAddress} \nExpected address: ${poolConfig.ProviderRegistryOwner}` - ); - } + signer = DRE.ethers.provider.getSigner(providerRegistryOwner); } // 1. Address Provider Registry instance const addressesProviderRegistry = ( diff --git a/tasks/full/3_oracles.ts b/tasks/full/3_oracles.ts index e479b6b1..e3f8f27f 100644 --- a/tasks/full/3_oracles.ts +++ b/tasks/full/3_oracles.ts @@ -50,7 +50,11 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') let aaveOracle: AaveOracle; if (notFalsyOrZeroAddress(aaveOracleAddress)) { - aaveOracle = await getAaveOracle(aaveOracleAddress); + aaveOracle = await await getAaveOracle(aaveOracleAddress); + const owner = await aaveOracle.owner(); + const signer = DRE.ethers.provider.getSigner(owner); + + aaveOracle = await (await getAaveOracle(aaveOracleAddress)).connect(signer); await waitForTx(await aaveOracle.setAssetSources(tokens, aggregators)); } else { aaveOracle = await deployAaveOracle( @@ -59,11 +63,14 @@ task('full:deploy-oracles', 'Deploy oracles for dev enviroment') ); } - const lendingRateOracle = notFalsyOrZeroAddress(lendingRateOracleAddress) + let lendingRateOracle = notFalsyOrZeroAddress(lendingRateOracleAddress) ? await getLendingRateOracle(lendingRateOracleAddress) : await deployLendingRateOracle(verify); const { USD, ...tokensAddressesWithoutUsd } = tokensToWatch; + lendingRateOracle = lendingRateOracle.connect( + DRE.ethers.provider.getSigner(await lendingRateOracle.owner()) + ); // This must be done any time a new market is created I believe //if (!lendingRateOracleAddress) { await setInitialMarketRatesInRatesOracleByHelper( diff --git a/tasks/misc/initialize-tokens.ts b/tasks/misc/initialize-tokens.ts index 680e1337..342e6e1a 100644 --- a/tasks/misc/initialize-tokens.ts +++ b/tasks/misc/initialize-tokens.ts @@ -60,13 +60,7 @@ task('full:initialize-tokens', 'Initialize lending pool configuration.') const balance = await signer.getBalance(); console.log('signer balance', formatEther(balance)); } else { - signer = await getFirstSigner(); - const deployerAddress = await signer.getAddress(); - if (providerRegistryOwner !== (await signer.getAddress())) { - throw Error( - `Current signer is not provider registry owner. \nCurrent deployer address: ${deployerAddress} \nExpected address: ${poolConfig.ProviderRegistryOwner}` - ); - } + signer = DRE.ethers.provider.getSigner(providerRegistryOwner); } // Init unitilialized reserves