diff --git a/config/aave.ts b/config/aave.ts index 1f4295be..3c8923c2 100644 --- a/config/aave.ts +++ b/config/aave.ts @@ -270,7 +270,7 @@ export const AaveConfig: IAaveConfiguration = { MKR: '0x61e4CAE3DA7FD189e52a4879C7B8067D7C2Cc0FA', LINK: '0xAD5ce863aE3E4E9394Ab43d4ba0D80f419F61789', KNC: '0x3F80c39c0b96A0945f9F0E9f55d8A8891c5671A8', - WBTC: '0x3b92f58feD223E2cB1bCe4c286BD97e42f2A12EA', + WBTC: '0xD1B98B6607330172f1D991521145A22BCe793277', MANA: '0x738Dc6380157429e957d223e6333Dc385c85Fec7', ZRX: '0xD0d76886cF8D952ca26177EB7CfDf83bad08C00C', SNX: '0x7FDb81B0b8a010dd4FFc57C3fecbf145BA8Bd947', diff --git a/config/commons.ts b/config/commons.ts index 83c9c25c..71c60c66 100644 --- a/config/commons.ts +++ b/config/commons.ts @@ -258,4 +258,11 @@ export const CommonsConfig: ICommonConfiguration = { [eEthereumNetwork.ropsten]: '', [eEthereumNetwork.main]: '', }, + ProxyPriceProvider: { + [eEthereumNetwork.coverage]: '', + [eEthereumNetwork.buidlerevm]: '', + [eEthereumNetwork.kovan]: '0x276C4793F2EE3D5Bf18C5b879529dD4270BA4814', + [eEthereumNetwork.ropsten]: '', + [eEthereumNetwork.main]: '', + }, }; diff --git a/contracts/interfaces/ILendingPool.sol b/contracts/interfaces/ILendingPool.sol index 3b496fb4..8396d35f 100644 --- a/contracts/interfaces/ILendingPool.sol +++ b/contracts/interfaces/ILendingPool.sol @@ -121,21 +121,19 @@ interface ILendingPool { /** * @dev emitted when a borrower is liquidated * @param collateral the address of the collateral being liquidated - * @param reserve the address of the reserve + * @param principal the address of the reserve * @param user the address of the user being liquidated * @param purchaseAmount the total amount liquidated * @param liquidatedCollateralAmount the amount of collateral being liquidated - * @param accruedBorrowInterest the amount of interest accrued by the borrower since the last action * @param liquidator the address of the liquidator * @param receiveAToken true if the liquidator wants to receive aTokens, false otherwise **/ event LiquidationCall( address indexed collateral, - address indexed reserve, + address indexed principal, address indexed user, uint256 purchaseAmount, uint256 liquidatedCollateralAmount, - uint256 accruedBorrowInterest, address liquidator, bool receiveAToken ); diff --git a/deployed-contracts.json b/deployed-contracts.json index 29cefb7c..859ca420 100644 --- a/deployed-contracts.json +++ b/deployed-contracts.json @@ -27,8 +27,8 @@ "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" }, "kovan": { - "address": "0x20e080B395341B3b617E893c281c7E999C942276", - "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + "address": "0xd7e3C4b2CE495066dE1923c268D68A844bD7Ae13", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "LendingPoolAddressesProviderRegistry": { @@ -45,8 +45,8 @@ "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" }, "kovan": { - "address": "0x00219a2958f758122106Bb8A801AFc1B70897663", - "deployer": "0x85e4A467343c0dc4aDAB74Af84448D9c45D8ae6F" + "address": "0x83c7A0E78e8eee2108a87d7a6770f22BAcb68b5A", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "FeeProvider": { @@ -76,7 +76,7 @@ "address": "0x65e0Cd5B8904A02f2e00BC6f58bf881998D54BDe" }, "kovan": { - "address": "0x50C9d3aD9399c1EEf6DDeadF8e57fF69994F552e" + "address": "0x1339f3c1FfF00D0FD8946187fdC61F0ef0fFe786" } }, "LendingPoolDataProvider": { @@ -92,7 +92,7 @@ "address": "0x5d12dDe3286D94E0d85F9D3B01B7099cfA0aBCf1" }, "kovan": { - "address": "0x6d1e69bB0578699dd955Eefbf23aAC65c0DA5cE7" + "address": "0xB43CCfF1148bb5ab2104E2ee68A7c30cDEBb9A9C" } }, "PriceOracle": { @@ -171,6 +171,10 @@ "coverage": { "address": "0x626FdE749F9d499d3777320CAf29484B624ab84a", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0xc4e3d83AEd3D3c60Cf4b238F634014cE103F6fa1", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "LendingPoolLiquidationManager": { @@ -220,7 +224,7 @@ }, "MockFlashLoanReceiver": { "buidlerevm": { - "address": "0x63387deC8C4a0F17Cf0C27Ea3476F03F6a45d3AE" + "address": "0x5Ea694f66BD0CBd08FC7967af01b67Dcef68cC5c" }, "localhost": { "address": "0x2B681757d757fbB80cc51c6094cEF5eE75bF55aA" @@ -231,7 +235,7 @@ }, "WalletBalanceProvider": { "buidlerevm": { - "address": "0x2B681757d757fbB80cc51c6094cEF5eE75bF55aA", + "address": "0xd4e934C2749CA8C1618659D02E7B28B074bf4df7", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" }, "localhost": { @@ -574,6 +578,10 @@ }, "coverage": { "address": "0x2cfcA5785261fbC88EFFDd46fCFc04c22525F9e4" + }, + "kovan": { + "address": "0xE4566ce19626826360f4faD941418e2849fC3685", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "StableDebtToken": { @@ -588,6 +596,10 @@ "coverage": { "address": "0xB660Fdd109a95718cB9d20E3A89EE6cE342aDcB6", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x0043967C1Cf13c4Ff3Bc38109054D5a97C147B4A", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "VariableDebtToken": { @@ -602,6 +614,10 @@ "coverage": { "address": "0x830bceA96E56DBC1F8578f75fBaC0AF16B32A07d", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0xdF75B68c75c30D177f4Dbd47cBcb5E2E4f3cf8F9", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "AToken": { @@ -616,11 +632,15 @@ "coverage": { "address": "0xA0AB1cB92A4AF81f84dCd258155B5c25D247b54E", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + }, + "kovan": { + "address": "0x1A23ADa7218e0a66b7368E12E379Ea88d7a68a27", + "deployer": "0x6b40a028d2Ab94e5f6d3793F32D326CDf724Bb1D" } }, "MockAToken": { "buidlerevm": { - "address": "0xBEF0d4b9c089a5883741fC14cbA352055f35DDA2", + "address": "0x63387deC8C4a0F17Cf0C27Ea3476F03F6a45d3AE", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" }, "localhost": { @@ -648,7 +668,7 @@ }, "MockStableDebtToken": { "buidlerevm": { - "address": "0xDf73fC454FA018051D4a1509e63D11530A59DE10", + "address": "0x8280D40C9E9F04229D2435EAad6e0011309ce81B", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" }, "localhost": { @@ -662,7 +682,7 @@ }, "MockVariableDebtToken": { "buidlerevm": { - "address": "0x2cfcA5785261fbC88EFFDd46fCFc04c22525F9e4", + "address": "0x2B681757d757fbB80cc51c6094cEF5eE75bF55aA", "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" }, "localhost": { @@ -676,7 +696,7 @@ }, "MockSwapAdapter": { "buidlerevm": { - "address": "0x8280D40C9E9F04229D2435EAad6e0011309ce81B" + "address": "0x93bB79570dFECC052e36E25cE10793A139e75f1b" }, "coverage": { "address": "0xBEF0d4b9c089a5883741fC14cbA352055f35DDA2" @@ -684,5 +704,39 @@ "localhost": { "address": "0xBEF0d4b9c089a5883741fC14cbA352055f35DDA2" } + }, + "MockFlashRepayAdapter": { + "buidlerevm": { + "address": "0xDf73fC454FA018051D4a1509e63D11530A59DE10" + } + }, + "MockFlashLiquiditySwapAdapter": { + "buidlerevm": { + "address": "0x2cfcA5785261fbC88EFFDd46fCFc04c22525F9e4" + } + }, + "ReserveLogic": { + "buidlerevm": { + "address": "0xFAe0fd738dAbc8a0426F47437322b6d026A9FD95", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "GenericLogic": { + "buidlerevm": { + "address": "0x6082731fdAba4761277Fb31299ebC782AD3bCf24", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "ValidationLogic": { + "buidlerevm": { + "address": "0x8456161947DFc1fC159A0B26c025cD2b4bba0c3e", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } + }, + "LendingPoolCollateralManager": { + "buidlerevm": { + "address": "0xb2B548BE73010C188C083c510d255Aed74843b05", + "deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6" + } } } diff --git a/helpers/contracts-deployments.ts b/helpers/contracts-deployments.ts index 07ee9947..2fddf680 100644 --- a/helpers/contracts-deployments.ts +++ b/helpers/contracts-deployments.ts @@ -42,6 +42,9 @@ import { WalletBalanceProviderFactory, } from '../types'; import {withSaveAndVerify, registerContractInJsonDb, linkBytecode} from './contracts-helpers'; +import {verifyContract} from './etherscan-verification'; +import {LendingPool} from '../types/LendingPool'; +import {Artifact} from '@nomiclabs/buidler/types'; export const deployLendingPoolAddressesProvider = async (verify?: boolean) => withSaveAndVerify( @@ -75,14 +78,25 @@ export const deployReserveLogicLibrary = async (verify?: boolean) => verify ); -export const deployGenericLogic = async (verify?: boolean) => - withSaveAndVerify( - await new GenericLogicFactory(await getFirstSigner()).deploy(), - eContractid.GenericLogic, - [], - verify +export const deployGenericLogic = async (reserveLogic: Contract, verify?: boolean) => { + const genericLogicArtifact = await readArtifact( + BRE.config.paths.artifacts, + eContractid.GenericLogic ); + const linkedGenericLogicByteCode = linkBytecode(genericLogicArtifact, { + [eContractid.ReserveLogic]: reserveLogic.address, + }); + + const genericLogicFactory = await BRE.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, @@ -112,7 +126,7 @@ export const deployAaveLibraries = async ( verify?: boolean ): Promise => { const reserveLogic = await deployReserveLogicLibrary(verify); - const genericLogic = await deployGenericLogic(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. @@ -133,7 +147,7 @@ export const deployAaveLibraries = async ( }; }; -export const deployLendingPool = async (verify?: boolean) => { +export const deployLendingPoolWithFactory = async (verify?: boolean) => { const libraries = await deployAaveLibraries(verify); return withSaveAndVerify( await new LendingPoolFactory(libraries, await getFirstSigner()).deploy(), @@ -143,6 +157,74 @@ export const deployLendingPool = async (verify?: boolean) => { ); }; +const deployLibrary = async (libraryId: eContractid) => { + const factory = await BRE.ethers.getContractFactory(libraryId); + const library = await factory.deploy(); + await library.deployed(); + + return library; +}; + +export const linkLibrariesToArtifact = async (artifact: Artifact) => { + const reserveLogic = await deployLibrary(eContractid.ReserveLogic); + + const genericLogicArtifact = await readArtifact( + BRE.config.paths.artifacts, + eContractid.GenericLogic + ); + + const linkedGenericLogicByteCode = linkBytecode(genericLogicArtifact, { + [eContractid.ReserveLogic]: reserveLogic.address, + }); + + const genericLogicFactory = await BRE.ethers.getContractFactory( + genericLogicArtifact.abi, + linkedGenericLogicByteCode + ); + + const genericLogic = await (await genericLogicFactory.deploy()).deployed(); + + const validationLogicArtifact = await readArtifact( + BRE.config.paths.artifacts, + eContractid.ValidationLogic + ); + + const linkedValidationLogicByteCode = linkBytecode(validationLogicArtifact, { + [eContractid.ReserveLogic]: reserveLogic.address, + [eContractid.GenericLogic]: genericLogic.address, + }); + + const validationLogicFactory = await BRE.ethers.getContractFactory( + validationLogicArtifact.abi, + linkedValidationLogicByteCode + ); + + const validationLogic = await (await validationLogicFactory.deploy()).deployed(); + + const linkedBytecode = linkBytecode(artifact, { + [eContractid.ReserveLogic]: reserveLogic.address, + [eContractid.GenericLogic]: genericLogic.address, + [eContractid.ValidationLogic]: validationLogic.address, + }); + const factory = await BRE.ethers.getContractFactory(artifact.abi, linkedBytecode); + + return factory; +}; + +export const deployLendingPool = async (verify?: boolean) => { + const lendingPoolArtifact = await readArtifact( + BRE.config.paths.artifacts, + eContractid.LendingPool + ); + const factory = await linkLibrariesToArtifact(lendingPoolArtifact); + const lendingPool = await factory.deploy(); + const instance = (await lendingPool.deployed()) as LendingPool; + if (verify) { + await verifyContract(eContractid.LendingPool, instance.address, []); + } + return instance; +}; + export const deployPriceOracle = async (verify?: boolean) => withSaveAndVerify( await new PriceOracleFactory(await getFirstSigner()).deploy(), @@ -180,6 +262,7 @@ export const deployChainlinkProxyPriceProvider = async ( export const deployLendingPoolCollateralManager = async (verify?: boolean) => { const reservesLogic = await getReserveLogic(); + console.log('ADDRESS RESERVELOGIC', reservesLogic.address); const libraries = { // See deployAaveLibraries() function ['__$d3b4366daeb9cadc7528af6145b50b2183$__']: reservesLogic.address, @@ -301,7 +384,7 @@ export const deployGenericAToken = async ( ] = [poolAddress, underlyingAssetAddress, ZERO_ADDRESS, name, symbol, incentivesController]; return withSaveAndVerify( await new ATokenFactory(await getFirstSigner()).deploy(...args), - eContractid.VariableDebtToken, + eContractid.AToken, args, verify ); diff --git a/helpers/types.ts b/helpers/types.ts index 0b5e4a33..26644896 100644 --- a/helpers/types.ts +++ b/helpers/types.ts @@ -344,6 +344,7 @@ export interface ICommonConfiguration { ReserveAssets: iParamsPerNetwork>; ReservesConfig: iMultiPoolsAssets; ATokenDomainSeparator: iParamsPerNetwork; + ProxyPriceProvider: iParamsPerNetwork; } export interface IAaveConfiguration extends ICommonConfiguration { diff --git a/package.json b/package.json index abce7ae4..1c0bfb5b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "aave:evm:dev:migration": "buidler aave:dev", "aave:evm:full:migration": "buidler aave:full", "aave:kovan:dev:migration": "npm run buidler:kovan -- aave:dev --verify", - "aave:kovan:full:migration": "npm run buidler:kovan -- aave:full --verify", + "aave:kovan:full:migration": "npm run buidler:kovan -- aave:full", "aave:ropsten:dev:migration": "npm run buidler:ropsten -- aave:dev --verify", "aave:ropsten:full:migration": "npm run buidler:ropsten -- aave:full --verify", "aave:main:dev:migration": "npm run buidler:main -- aave:dev --verify", diff --git a/tasks/full/1_address_provider_registry.ts b/tasks/full/1_address_provider_registry.ts index 24534901..4dd84f08 100644 --- a/tasks/full/1_address_provider_registry.ts +++ b/tasks/full/1_address_provider_registry.ts @@ -37,4 +37,11 @@ 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)); + } }); diff --git a/tasks/migrations/aave.full.ts b/tasks/migrations/aave.full.ts index 460829b6..fb119103 100644 --- a/tasks/migrations/aave.full.ts +++ b/tasks/migrations/aave.full.ts @@ -24,10 +24,7 @@ task('aave:full', 'Deploy development enviroment') console.log('2. Deploy lending pool'); await localBRE.run('full:deploy-lending-pool', {verify}); - console.log('3. Deploy oracles'); - await localBRE.run('full:deploy-oracles', {verify, pool: POOL_NAME}); - - console.log('4. Initialize lending pool'); + console.log('3. Initialize lending pool'); await localBRE.run('full:initialize-lending-pool', {verify, pool: POOL_NAME}); console.log('\nFinished migrations'); diff --git a/test/__setup.spec.ts b/test/__setup.spec.ts index a6c20849..d0b85e3f 100644 --- a/test/__setup.spec.ts +++ b/test/__setup.spec.ts @@ -245,6 +245,7 @@ const buildTestEnv = async (deployer: Signer, secondaryWallet: Signer) => { await deployWalletBalancerProvider(addressesProvider.address); + console.log('END'); console.timeEnd('setup'); }; diff --git a/test/atoken-permit.spec.ts b/test/atoken-permit.spec.ts index 91e438f3..5f506758 100644 --- a/test/atoken-permit.spec.ts +++ b/test/atoken-permit.spec.ts @@ -32,10 +32,17 @@ makeSuite('AToken: Permit', (testEnv: TestEnv) => { }); it('Get aDAI for tests', async () => { - const {dai, deployer, pool} = testEnv; + const {dai, pool, deployer, addressesProvider} = testEnv; + const addre = await addressesProvider.getLendingPool(); + console.log('pool', pool.address, addre); await dai.mint(parseEther('20000')); await dai.approve(pool.address, parseEther('20000')); + + const some = await pool.getReserveData(dai.address); + const aa = await pool.getReservesList(); + console.log('some', some); + console.log('aa', aa); await pool.deposit(dai.address, parseEther('20000'), deployer.address, 0); });