From ce76335078c5f7283cab1d116b84adc328de6e8d Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 15:38:43 +0100 Subject: [PATCH 01/17] Fixes #124 --- .../LendingPoolAddressesProvider.sol | 28 +++++---- .../ILendingPoolAddressesProvider.sol | 6 +- test/lending-pool-addresses-provider.spec.ts | 62 ++++++++++++------- 3 files changed, 61 insertions(+), 35 deletions(-) diff --git a/contracts/configuration/LendingPoolAddressesProvider.sol b/contracts/configuration/LendingPoolAddressesProvider.sol index ee4435bc..43796d36 100644 --- a/contracts/configuration/LendingPoolAddressesProvider.sol +++ b/contracts/configuration/LendingPoolAddressesProvider.sol @@ -28,24 +28,30 @@ contract LendingPoolAddressesProvider is Ownable, ILendingPoolAddressesProvider bytes32 private constant LENDING_RATE_ORACLE = 'LENDING_RATE_ORACLE'; /** - * @dev Sets an address for an id, allowing to cover it or not with a proxy + * @dev Sets an address for an id by updating a proxy implementation * @param id The id - * @param newAddress The address to set, pass address(0) if a proxy is needed * @param implementationAddress The address of the implementation if we want it covered by a proxy * address(0) if we don't want a proxy covering */ - function setAddress( + function setAddressAsProxy( bytes32 id, - address newAddress, address implementationAddress ) external override onlyOwner { - if (implementationAddress != address(0)) { - _updateImpl(id, implementationAddress); - emit AddressSet(id, implementationAddress, true); - } else { - _addresses[id] = newAddress; - emit AddressSet(id, newAddress, false); - } + _updateImpl(id, implementationAddress); + emit AddressSet(id, implementationAddress, true); + } + + /** + * @dev Sets an address for an id replacing the address saved in the addresses map + * @param id The id + * @param newAddress The address to set, pass address(0) if a proxy is needed + */ + function setAddress( + bytes32 id, + address newAddress + ) external override onlyOwner { + _addresses[id] = newAddress; + emit AddressSet(id, newAddress, false); } /** diff --git a/contracts/interfaces/ILendingPoolAddressesProvider.sol b/contracts/interfaces/ILendingPoolAddressesProvider.sol index c0d180e3..c1a7ab78 100644 --- a/contracts/interfaces/ILendingPoolAddressesProvider.sol +++ b/contracts/interfaces/ILendingPoolAddressesProvider.sol @@ -20,7 +20,11 @@ interface ILendingPoolAddressesProvider { function setAddress( bytes32 id, - address newAddress, + address newAddress + ) external; + + function setAddressAsProxy( + bytes32 id, address impl ) external; diff --git a/test/lending-pool-addresses-provider.spec.ts b/test/lending-pool-addresses-provider.spec.ts index ac70c6a0..97327d4f 100644 --- a/test/lending-pool-addresses-provider.spec.ts +++ b/test/lending-pool-addresses-provider.spec.ts @@ -31,28 +31,61 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => { await expect( addressesProvider.setAddress( utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), - mockAddress, - ZERO_ADDRESS + mockAddress ) ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); + + await expect( + addressesProvider.setAddressAsProxy( + utils.keccak256(utils.toUtf8Bytes('RANDOM_ID')), + mockAddress + ) + ).to.be.revertedWith(INVALID_OWNER_REVERT_MSG); + }); - it('Tests adding both a proxied and non-proxied addres with `setAddress()`', async () => { + it('Tests adding a proxied address with `setAddressAsProxy()`', async () => { const {addressesProvider, users} = testEnv; const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors; const currentAddressesProviderOwner = users[1]; - const mockNonProxiedAddress = createRandomAddress(); - const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED')); const mockLendingPool = await deployLendingPool(); const proxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_PROXIED')); + const proxiedAddressSetReceipt = await waitForTx( + await addressesProvider + .connect(currentAddressesProviderOwner.signer) + .setAddressAsProxy(proxiedAddressId, mockLendingPool.address) + ); + + if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 1) { + throw new Error('INVALID_EVENT_EMMITED'); + } + + expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated'); + expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet'); + expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId); + expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal( + mockLendingPool.address + ); + expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true); + }); + + + it('Tests adding a non proxied address with `setAddress()`', async () => { + const {addressesProvider, users} = testEnv; + const {INVALID_OWNER_REVERT_MSG} = ProtocolErrors; + + const currentAddressesProviderOwner = users[1]; + const mockNonProxiedAddress = createRandomAddress(); + const nonProxiedAddressId = utils.keccak256(utils.toUtf8Bytes('RANDOM_NON_PROXIED')); + const nonProxiedAddressSetReceipt = await waitForTx( await addressesProvider .connect(currentAddressesProviderOwner.signer) - .setAddress(nonProxiedAddressId, mockNonProxiedAddress, ZERO_ADDRESS) + .setAddress(nonProxiedAddressId, mockNonProxiedAddress) ); expect(mockNonProxiedAddress.toLowerCase()).to.be.equal( @@ -70,22 +103,5 @@ makeSuite('LendingPoolAddressesProvider', (testEnv: TestEnv) => { ); expect(nonProxiedAddressSetReceipt.events[0].args?.hasProxy).to.be.equal(false); - const proxiedAddressSetReceipt = await waitForTx( - await addressesProvider - .connect(currentAddressesProviderOwner.signer) - .setAddress(proxiedAddressId, ZERO_ADDRESS, mockLendingPool.address) - ); - - if (!proxiedAddressSetReceipt.events || proxiedAddressSetReceipt.events?.length < 2) { - throw new Error('INVALID_EVENT_EMMITED'); - } - - expect(proxiedAddressSetReceipt.events[0].event).to.be.equal('ProxyCreated'); - expect(proxiedAddressSetReceipt.events[1].event).to.be.equal('AddressSet'); - expect(proxiedAddressSetReceipt.events[1].args?.id).to.be.equal(proxiedAddressId); - expect(proxiedAddressSetReceipt.events[1].args?.newAddress).to.be.equal( - mockLendingPool.address - ); - expect(proxiedAddressSetReceipt.events[1].args?.hasProxy).to.be.equal(true); }); }); From 727bc12d8007cb5075aef1342caa1532468f9090 Mon Sep 17 00:00:00 2001 From: eboado Date: Tue, 10 Nov 2020 15:40:49 +0100 Subject: [PATCH 02/17] - Added Transfer event on transferOnLiquidation --- contracts/tokenization/AToken.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/tokenization/AToken.sol b/contracts/tokenization/AToken.sol index 0a664548..2f2be6cb 100644 --- a/contracts/tokenization/AToken.sol +++ b/contracts/tokenization/AToken.sol @@ -175,6 +175,8 @@ contract AToken is VersionedInitializable, IncentivizedERC20, IAToken { //being a normal transfer, the Transfer() and BalanceTransfer() are emitted //so no need to emit a specific event here _transfer(from, to, value, false); + + emit Transfer(from, to, value); } /** From 673b8f22c4d38b68cd268f480195660e7c6b6812 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 15:42:03 +0100 Subject: [PATCH 03/17] Fixed validation of isActive in validateWithdraw --- contracts/libraries/logic/ValidationLogic.sol | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contracts/libraries/logic/ValidationLogic.sol b/contracts/libraries/logic/ValidationLogic.sol index a08c5420..04a72f8d 100644 --- a/contracts/libraries/logic/ValidationLogic.sol +++ b/contracts/libraries/logic/ValidationLogic.sol @@ -63,9 +63,15 @@ library ValidationLogic { address oracle ) external view { require(amount != 0, Errors.VL_INVALID_AMOUNT); - require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); + (bool isActive,, , ) = reservesData[reserveAddress].configuration.getFlags(); + require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + + require(amount != 0, Errors.VL_INVALID_AMOUNT); + require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + + require( GenericLogic.balanceDecreaseAllowed( reserveAddress, From d66959f4ffc8eb24a212c4d0607604ba4bad97ec Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 15:57:49 +0100 Subject: [PATCH 04/17] Refactored validation logic of rebalanceStableBorrowRate --- contracts/lendingpool/LendingPool.sol | 39 ++++-------------- contracts/libraries/logic/ValidationLogic.sol | 40 +++++++++++++++++++ 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index dbebc6ef..08cf9cca 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -25,7 +25,6 @@ import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; import {ILendingPool} from '../interfaces/ILendingPool.sol'; import {LendingPoolStorage} from './LendingPoolStorage.sol'; -import {IReserveInterestRateStrategy} from '../interfaces/IReserveInterestRateStrategy.sol'; /** * @title LendingPool contract @@ -39,8 +38,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage using SafeERC20 for IERC20; //main configuration parameters - uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 4000; - uint256 public constant REBALANCE_UP_USAGE_RATIO_THRESHOLD = 0.95 * 1e27; //usage ratio of 95% uint256 public constant MAX_STABLE_RATE_BORROW_SIZE_PERCENT = 2500; uint256 public constant FLASHLOAN_PREMIUM_TOTAL = 9; uint256 public constant MAX_NUMBER_RESERVES = 128; @@ -333,42 +330,22 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage IERC20 variableDebtToken = IERC20(reserve.variableDebtTokenAddress); address aTokenAddress = reserve.aTokenAddress; - uint256 stableBorrowBalance = IERC20(stableDebtToken).balanceOf(user); + uint256 stableDebt = IERC20(stableDebtToken).balanceOf(user); - //if the usage ratio is below 95%, no rebalances are needed - uint256 totalBorrows = stableDebtToken - .totalSupply() - .add(variableDebtToken.totalSupply()) - .wadToRay(); - uint256 availableLiquidity = IERC20(asset).balanceOf(aTokenAddress).wadToRay(); - uint256 usageRatio = totalBorrows == 0 - ? 0 - : totalBorrows.rayDiv(availableLiquidity.add(totalBorrows)); - - //if the liquidity rate is below REBALANCE_UP_THRESHOLD of the max variable APR at 95% usage, - //then we allow rebalancing of the stable rate positions. - - uint256 currentLiquidityRate = reserve.currentLiquidityRate; - uint256 maxVariableBorrowRate = IReserveInterestRateStrategy( - reserve - .interestRateStrategyAddress - ) - .getMaxVariableBorrowRate(); - - require( - usageRatio >= REBALANCE_UP_USAGE_RATIO_THRESHOLD && - currentLiquidityRate <= - maxVariableBorrowRate.percentMul(REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD), - Errors.LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET + ValidationLogic.validateRebalanceStableBorrowRate( + reserve, + stableDebtToken, + variableDebtToken, + aTokenAddress ); reserve.updateState(); - IStableDebtToken(address(stableDebtToken)).burn(user, stableBorrowBalance); + IStableDebtToken(address(stableDebtToken)).burn(user, stableDebt); IStableDebtToken(address(stableDebtToken)).mint( user, user, - stableBorrowBalance, + stableDebt, reserve.currentStableBorrowRate ); diff --git a/contracts/libraries/logic/ValidationLogic.sol b/contracts/libraries/logic/ValidationLogic.sol index 04a72f8d..dc0ca672 100644 --- a/contracts/libraries/logic/ValidationLogic.sol +++ b/contracts/libraries/logic/ValidationLogic.sol @@ -13,6 +13,7 @@ import {ReserveConfiguration} from '../configuration/ReserveConfiguration.sol'; import {UserConfiguration} from '../configuration/UserConfiguration.sol'; import {Errors} from '../helpers/Errors.sol'; import {Helpers} from '../helpers/Helpers.sol'; +import {IReserveInterestRateStrategy} from '../../interfaces/IReserveInterestRateStrategy.sol'; /** * @title ReserveLogic library @@ -28,6 +29,9 @@ library ValidationLogic { using ReserveConfiguration for ReserveConfiguration.Map; using UserConfiguration for UserConfiguration.Map; + uint256 public constant REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD = 4000; + uint256 public constant REBALANCE_UP_USAGE_RATIO_THRESHOLD = 0.95 * 1e27; //usage ratio of 95% + /** * @dev validates a deposit. * @param reserve the reserve state on which the user is depositing @@ -299,6 +303,42 @@ library ValidationLogic { } } + function validateRebalanceStableBorrowRate( + ReserveLogic.ReserveData storage reserve, + address reserveAddress, + IERC20 stableDebtToken, + IERC20 variableDebtToken, + address aTokenAddress) external { + + //if the usage ratio is below 95%, no rebalances are needed + uint256 totalDebt = stableDebtToken + .totalSupply() + .add(variableDebtToken.totalSupply()) + .wadToRay(); + uint256 availableLiquidity = IERC20(reserveAddress).balanceOf(aTokenAddress).wadToRay(); + uint256 usageRatio = totalDebt == 0 + ? 0 + : totalDebt.rayDiv(availableLiquidity.add(totalDebt)); + + //if the liquidity rate is below REBALANCE_UP_THRESHOLD of the max variable APR at 95% usage, + //then we allow rebalancing of the stable rate positions. + + uint256 currentLiquidityRate = reserve.currentLiquidityRate; + uint256 maxVariableBorrowRate = IReserveInterestRateStrategy( + reserve + .interestRateStrategyAddress + ) + .getMaxVariableBorrowRate(); + + require( + usageRatio >= REBALANCE_UP_USAGE_RATIO_THRESHOLD && + currentLiquidityRate <= + maxVariableBorrowRate.percentMul(REBALANCE_UP_LIQUIDITY_RATE_THRESHOLD), + Errors.LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET + ); + + } + /** * @dev validates the choice of a user of setting (or not) an asset as collateral * @param reserve the state of the reserve that the user is enabling or disabling as collateral From f87873a6dea9f94ae737536bdae82a51d5fc1edb Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:07:13 +0100 Subject: [PATCH 05/17] Added natspec, isActive check --- contracts/lendingpool/LendingPool.sol | 1 + contracts/libraries/logic/ValidationLogic.sol | 14 +- deployed-contracts.json | 261 ++++++++++++++++++ package-lock.json | 174 ++++++------ 4 files changed, 362 insertions(+), 88 deletions(-) diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index 08cf9cca..9f4ab28a 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -334,6 +334,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage ValidationLogic.validateRebalanceStableBorrowRate( reserve, + asset, stableDebtToken, variableDebtToken, aTokenAddress diff --git a/contracts/libraries/logic/ValidationLogic.sol b/contracts/libraries/logic/ValidationLogic.sol index dc0ca672..259c1496 100644 --- a/contracts/libraries/logic/ValidationLogic.sol +++ b/contracts/libraries/logic/ValidationLogic.sol @@ -303,12 +303,24 @@ library ValidationLogic { } } + /** + * @dev validates a stable borrow rate rebalance + * @param reserve the reserve state on which the user is getting rebalanced + * @param reserveAddress the address of the reserve + * @param stableDebtToken the stable debt token instance + * @param variableDebtToken the variable debt token instance + * @param aTokenAddress the address of the aToken contract + */ function validateRebalanceStableBorrowRate( ReserveLogic.ReserveData storage reserve, address reserveAddress, IERC20 stableDebtToken, IERC20 variableDebtToken, - address aTokenAddress) external { + address aTokenAddress) external view { + + (bool isActive,,, ) = reserve.configuration.getFlags(); + + require(isActive, Errors.VL_NO_ACTIVE_RESERVE); //if the usage ratio is below 95%, no rebalances are needed uint256 totalDebt = stableDebtToken diff --git a/deployed-contracts.json b/deployed-contracts.json index ee549af2..d1b0c565 100644 --- a/deployed-contracts.json +++ b/deployed-contracts.json @@ -592,436 +592,697 @@ "LendingPoolImpl": { "kovan": { "address": "0x6152D1d883F4C5dA18B47FE45e6eB2Ee79339E78" + }, + "hardhat": { + "address": "0xAa7BC1924711B77A0F3Aaebdd550BfeDDDbaf3cd" } }, "LendingPoolConfiguratorImpl": { "kovan": { "address": "0x46c410d5636dF430Ff1a7DDff7683d6CfdBF4A09" + }, + "hardhat": { + "address": "0x1750499D05Ed1674d822430FB960d5F6731fDf64" } }, "LendingPoolCollateralManagerImpl": { "kovan": { "address": "0x999ce4Ed17B90A1421f1D6b8891D87Ed61cb2763" + }, + "hardhat": { + "address": "0x8BFFF31B1757da579Bb5B118489568526F7fb6D4" } }, "stableDebtAAVE": { "kovan": { "address": "0xc206d99A916A45bAa74663C38F063C5f16d566bb" + }, + "hardhat": { + "address": "0xcFB79d2c986Ca61Dbd288f80108b9e8C4cC6522b" } }, "variableDebtAAVE": { "kovan": { "address": "0xCBd4194aB034AcD234400F742Bf3093b917aa581" + }, + "hardhat": { + "address": "0x1073981e3D3Af966a1137a3460dB881AAED7ae7a" } }, "stableDebtBAT": { "kovan": { "address": "0x2Af9Ce7274Ca7084abbf0Db313aEFA289D361A12" + }, + "hardhat": { + "address": "0x4c90c5Fa9C907F2C993E66446E022260e2AfC8d1" } }, "variableDebtBAT": { "kovan": { "address": "0x2962aCbeDa9d1A258E1cBb99A6435A3D2F1af5eE" + }, + "hardhat": { + "address": "0x86BAB8904c2969DE5EF732F8BC1D805C1aD56ddD" } }, "stableDebtBUSD": { "kovan": { "address": "0x58704aB618678c58a11e86f1cf7b3ddACB659114" + }, + "hardhat": { + "address": "0xa279C092B779bD051DA5333978e30647501AA958" } }, "variableDebtBUSD": { "kovan": { "address": "0x3903DB7B363A1C0B5272a53cA3B27d9D7759DE53" + }, + "hardhat": { + "address": "0xeB24f8Dff752f099AA106207b8f49818ca78D02e" } }, "stableDebtDAI": { "kovan": { "address": "0xe3CD1bbB9041b8c32D1ec96210842Ee1d91872B4" + }, + "hardhat": { + "address": "0x7cc0483c098d4e36f2f0AF72a7B13E40E13cd613" } }, "variableDebtDAI": { "kovan": { "address": "0x6207fdDba94b932A73f02a988A760BBd4d942152" + }, + "hardhat": { + "address": "0x38E82417A3b37f7faA75d2DD6260d5C24f529e1e" } }, "aAAVE": { "kovan": { "address": "0x84145b267060bf9eE8FCA80324498A7444c8e821" + }, + "hardhat": { + "address": "0x6e5d1a9C405DF46a8503893DBa99c3af5Dc1FB5A" } }, "strategyAAVE": { "kovan": { "address": "0x367356225e3BFA34c1cb447CFCdEE7a2D2dB38B5" + }, + "hardhat": { + "address": "0xCDfa18cdFEFCa96D6c79628c6ef941201b63faE4" } }, "aBAT": { "kovan": { "address": "0x2490F90399e169381DF8c78F81aC635f4be0d8A3" + }, + "hardhat": { + "address": "0xCaA841b61FfEf4017209311f2B0B2e2f88eBA3bc" } }, "strategyBAT": { "kovan": { "address": "0xac86Db376b8255d8FD8e41B092535875471eE311" + }, + "hardhat": { + "address": "0x8225B75F6eed9415D3FEABAa5B53628c6c7D29E2" } }, "aBUSD": { "kovan": { "address": "0x6645315FA490C24e7969439EeF4c143ce69B3035" + }, + "hardhat": { + "address": "0x7EebA31C65BCceBF0F2ef6eFf9edf170De96A139" } }, "strategyBUSD": { "kovan": { "address": "0xf4F7F30a34FDdB1Fd5B166CF121E2786a62B96Aa" + }, + "hardhat": { + "address": "0x66D0d53519B4A06f007A2Da43599EB844f6F4a7e" } }, "aDAI": { "kovan": { "address": "0xb1967F5b6e65705ACF985437f5743a63eDa20F73" + }, + "hardhat": { + "address": "0xf72805fA3E8Bd360bCBA4d069FC3B882001bB017" } }, "strategyDAI": { "kovan": { "address": "0x0ffeB139529D3DA091F8239712D25eab404C4421" + }, + "hardhat": { + "address": "0xB79EcFC3ea936e0e904DA3190CD1C8b8cc5F99B5" } }, "stableDebtENJ": { "kovan": { "address": "0x59FF56F1bE382464468637e59c5Ae57398B143cF" + }, + "hardhat": { + "address": "0xFE6c73d2880c7F5D2CDfe495C500AF94fECd09E9" } }, "variableDebtENJ": { "kovan": { "address": "0xb6DA3a57ea0A5b3C4f1926E9238c6F34b5B61eca" + }, + "hardhat": { + "address": "0x1890c00253FbD4130A4191CDA13e443b8708DEAF" } }, "stableDebtKNC": { "kovan": { "address": "0x813863F06b228DAC48ed2E861a3c07eD10e8D2F0" + }, + "hardhat": { + "address": "0xfdAA87AfAF7F617F84480eDc705d8Fd4B78EDEcB" } }, "variableDebtKNC": { "kovan": { "address": "0x8B08B2678D105Bf32F8F5A2013382773b2b24733" + }, + "hardhat": { + "address": "0x8A420528eC19177Deb9f1F0e2965964018f896c7" } }, "stableDebtLINK": { "kovan": { "address": "0x86A28c4B9Bc2BFc03743b136405B63e6ceB4e963" + }, + "hardhat": { + "address": "0x8a8eB2979316f4F173A97ff91E0e1Dd106039ad4" } }, "variableDebtLINK": { "kovan": { "address": "0x7A68F4382419D86c90cc069EF692BaaCfd3301Da" + }, + "hardhat": { + "address": "0xa0207cf18d773Bae5F5d816fc674fF8FFd0D6fE6" } }, "stableDebtMANA": { "kovan": { "address": "0xb61c3B1BF95B78eCC327ddcd614ba96FEe8127b0" + }, + "hardhat": { + "address": "0xE5107B38FFB21AD61185785816559f8B3aA54Ac5" } }, "variableDebtMANA": { "kovan": { "address": "0x196143A06206c5d47394c114ad5318b85CAC2E88" + }, + "hardhat": { + "address": "0x1259DA780FF797C1a11d534b0BaC534eD2b3F109" } }, "aENJ": { "kovan": { "address": "0xF2F9f31FFB0f8d43974B05Bb560f093b441F5B1b" + }, + "hardhat": { + "address": "0xa9DFb142061Ef496F48078d9eA39A2D992236D0f" } }, "strategyENJ": { "kovan": { "address": "0x66d0B7Ccd0C9a76A831334e9fE8a71680DD0A9e2" + }, + "hardhat": { + "address": "0xaaE80234037A18Ee462b1727ed0621b54dFcEDA6" } }, "aKNC": { "kovan": { "address": "0x5675D816D05cEF2bBF2737EbD55727549D4143e0" + }, + "hardhat": { + "address": "0x8076E5d426aa3B5C4c98570b3a9033EE67aFe849" } }, "strategyKNC": { "kovan": { "address": "0x8C7d058c50b241dD01d6a6d4E2a10C6c78e21eB3" + }, + "hardhat": { + "address": "0x87809db6234f27E3AacDEb316c00DbFCA77B11B3" } }, "aLINK": { "kovan": { "address": "0x729c933284e8226137cd8a5ec39bD20A9c4c49F9" + }, + "hardhat": { + "address": "0xe90Ad292698ddaE3Dc305Eb98Ff5FD7341c8a637" } }, "strategyLINK": { "kovan": { "address": "0xB09a6AB9d32a576e73159083aFE9aBe14c29173E" + }, + "hardhat": { + "address": "0x436d1eE2EDa1F7a98f2418709d10465c98Ed3828" } }, "aMANA": { "kovan": { "address": "0xB98571944af08b8698622Ab0A988c59738Cf2AB8" + }, + "hardhat": { + "address": "0x8599378fE42e4FB26Ad214FB1545076EB19b8b0f" } }, "strategyMANA": { "kovan": { "address": "0xB44Ca018DB828f67C2BaFb6846AF12c5cCb92122" + }, + "hardhat": { + "address": "0x487E219628bb5227b2B490CaEE2E2b47ec06D204" } }, "stableDebtMKR": { "kovan": { "address": "0x536FA5ACA31cA1FE60Ec8a54432bA8E08E86222E" + }, + "hardhat": { + "address": "0x3deF3E7577D5Ddf0ea10fB58730fECdA673711C8" } }, "variableDebtMKR": { "kovan": { "address": "0x6BF5055Fe4312194723888875Ce73A9461510344" + }, + "hardhat": { + "address": "0x509B355B5d665a209e888B20B818e53fAdEb47B7" } }, "stableDebtREN": { "kovan": { "address": "0x2372E7a3d03e18F6ece2FDcb453c03e609134842" + }, + "hardhat": { + "address": "0x2A7C4a4D6b7db3beF0e277D950192c421aF4BD69" } }, "variableDebtREN": { "kovan": { "address": "0x89C3b25C3C4d7f7Fd25B8cCe1De60Af835696C1B" + }, + "hardhat": { + "address": "0x5d1B59460fa295F6B4DEB74C74F4D11f4de60517" } }, "stableDebtREP": { "kovan": { "address": "0x9ED2D2d415A262487D7f0a3Ec62E8467fd3CF278" + }, + "hardhat": { + "address": "0x80288A583c216fB0F6a7ccA1Fbc22d7727E2135a" } }, "variableDebtREP": { "kovan": { "address": "0xe1333768d0209078254215A131d49E3dE36F4617" + }, + "hardhat": { + "address": "0xd7E287c1B79c7DA0F6fF7cdEA1026f1223c24F8a" } }, "stableDebtSNX": { "kovan": { "address": "0xB14dbC77a03703074ed8a95f288413985f996b99" + }, + "hardhat": { + "address": "0x0Aa250b8A76d9228Cc7609013cc77c500Ee802E7" } }, "variableDebtSNX": { "kovan": { "address": "0x77E31F2CDC45921156df5288D4dB20D3A5A915f2" + }, + "hardhat": { + "address": "0xf45700a9EAD19BFA6770802E3807E3eE37E8E492" } }, "aMKR": { "kovan": { "address": "0xd87c0D428f89D54176808A3e78632c90C44fF5a5" + }, + "hardhat": { + "address": "0x05EDF38bB3D948E96745f39072d59dCc915194Dd" } }, "strategyMKR": { "kovan": { "address": "0x349E1B2e94b600Dd09817924207E50A6660fAF2B" + }, + "hardhat": { + "address": "0x90D5cff61508785557eaA45DeED1297809F49371" } }, "aREN": { "kovan": { "address": "0x9410999dFA3527317f0Ae3b5D2A54c213A48f9d1" + }, + "hardhat": { + "address": "0xB436Db1757e0c474DaF67666BC35F5fF7062541D" } }, "strategyREN": { "kovan": { "address": "0x192638591E5Bb456498E380cf91f456Fef21C4b4" + }, + "hardhat": { + "address": "0x26eC70DcA80E8dBDaAcBff415aCdcF791C89CEBe" } }, "aREP": { "kovan": { "address": "0x8C94FE9CE952738C48799326E63294626e1A3C7c" + }, + "hardhat": { + "address": "0xfcD974Cec976c536745bBB30e6C7E083a1Ab82EC" } }, "strategyREP": { "kovan": { "address": "0x1D2F67F9bb6db702067Fbb0D400c864a1ffC5594" + }, + "hardhat": { + "address": "0x0E7f0c6Bf3bA63A28e1EFdDb7F3186A24b90566D" } }, "aSNX": { "kovan": { "address": "0x2473e6Ed1F9cbcc3141eB04AEd432BaAB575fDD1" + }, + "hardhat": { + "address": "0x21FA83fB5d14301B53Efc6e44C565C80063d1c50" } }, "strategySNX": { "kovan": { "address": "0x75cb1cEB23956D20b94fF63ec9dB0990E5920A91" + }, + "hardhat": { + "address": "0x5806cCA75C8fEf151881d93E7e81EB103F23fb7b" } }, "stableDebtSUSD": { "kovan": { "address": "0xD59F6350A3a75cfa09Df8A182BF55be37f8A8840" + }, + "hardhat": { + "address": "0xDfD96D3cac8b157176292c547A61eD7586713527" } }, "variableDebtSUSD": { "kovan": { "address": "0xcd8b423809eb2565f0e0f2d0435dFBAdcBBdCF18" + }, + "hardhat": { + "address": "0xcc94Ce18B9a7522d12675cA3fFC1A862Ac0373C1" } }, "stableDebtTUSD": { "kovan": { "address": "0xA3b22b35DAee9F2E73F2A05eF57799B821513930" + }, + "hardhat": { + "address": "0x2C4ec78AD3Ff19F35e0dbF35837490C4f7b4224E" } }, "variableDebtTUSD": { "kovan": { "address": "0x648663CD12F9BCde674c18a1F04A455e23aFc6b3" + }, + "hardhat": { + "address": "0xC9C2c855fA6EAFc5780B661b2CD1c8985c45D720" } }, "stableDebtUNI": { "kovan": { "address": "0x30E2aBE48E78646347C3Cf8C437AE965AB6e9303" + }, + "hardhat": { + "address": "0x1a2f37C5Ed6bEA450Ac31E10ED682994C7C77835" } }, "variableDebtUNI": { "kovan": { "address": "0x83028921E12c9adB6c7bBa1d6872C9e771bbEC20" + }, + "hardhat": { + "address": "0x83D129a2efFa0ba0d5B09f7CdfBEaDE1F847201E" } }, "stableDebtUSDC": { "kovan": { "address": "0xe86554cd90D2d8BF7fd5F3931F833e7c1604CbCE" + }, + "hardhat": { + "address": "0xBb78BcaB8e39C38C6E019fe49E43b2591FAa6a58" } }, "variableDebtUSDC": { "kovan": { "address": "0x5d4d415f627a10b20f5B3E8A1bbB4D3190761cE0" + }, + "hardhat": { + "address": "0xF5B3b70cb53852617B1fde19242bED043A885B4B" } }, "aSUSD": { "kovan": { "address": "0x6a179aD153474df2af72b963145C1310727F65a7" + }, + "hardhat": { + "address": "0x4bb47D17F31181c8BE088CE21574B4e973212C39" } }, "strategySUSD": { "kovan": { "address": "0x570114BcC09d440A7973e406A5c1b55C394c90aD" + }, + "hardhat": { + "address": "0x632a0Cf1e008011CC3185c9989205aa29BF267Df" } }, "aTUSD": { "kovan": { "address": "0x0290a0b6B5D249fD98F31Ae887F6d5B4d6C4A56F" + }, + "hardhat": { + "address": "0x2A3CcaB4Fb2A3B34f6A819Cfc50918fe96D64122" } }, "strategyTUSD": { "kovan": { "address": "0x9686D4f25eB0E4E72d2Eef22c66a3E1d9a42aca2" + }, + "hardhat": { + "address": "0x8B151819355Bfb7dE62e5b1D7580F43B34ed86e8" } }, "aUNI": { "kovan": { "address": "0x3414b75532c400fb983a9fA22d71Cb45A05ADd2c" + }, + "hardhat": { + "address": "0x388e76350476e23A80eA6403B525aDa86ed7af6E" } }, "strategyUNI": { "kovan": { "address": "0x9A01E6f57863bb03f7ED2ebad57123476e450FA9" + }, + "hardhat": { + "address": "0xf86115c55192beb063C4c494E2C9CFB990235ecF" } }, "aUSDC": { "kovan": { "address": "0xB98DA540268F26Eb3A328F6c183BB3A5dCb1943b" + }, + "hardhat": { + "address": "0xa8d4DF7C220903a4018C3A81BEc702fb54623bd5" } }, "strategyUSDC": { "kovan": { "address": "0xF727D07a89C98A5296CcCa71cE3Cda4f027965a9" + }, + "hardhat": { + "address": "0x936b5f546a6405012AC1DC4713f29B7CE43Fb4A2" } }, "stableDebtUSDT": { "kovan": { "address": "0xc6b875BAec3472520da7c9755E2bFF98a1DbB89F" + }, + "hardhat": { + "address": "0x47167e26421017FD2a619D99Cf747b5eB58371B2" } }, "variableDebtUSDT": { "kovan": { "address": "0x935626db98525589969745e5edc2C9256E380e17" + }, + "hardhat": { + "address": "0xBfd65BbF3fbF0bFB0f0053e092EB690904eC6876" } }, "stableDebtWBTC": { "kovan": { "address": "0xD5f7F2A4175B40cbdc53c952103AB427656D9C81" + }, + "hardhat": { + "address": "0xae18C8d1A389E005faBf3234f5F81C35561c1811" } }, "variableDebtWBTC": { "kovan": { "address": "0xf11b889cB033a51391181f0180A27489484F832c" + }, + "hardhat": { + "address": "0x7B3CAbCa23FafF9f02382Bc5A7BB73D46c2BE1ee" } }, "stableDebtWETH": { "kovan": { "address": "0x06Df93951238B7aBeCBDceE767bF76f0119Ef6dd" + }, + "hardhat": { + "address": "0x1A06De035FA3e4339f1a41C9008Ed6ba6c8f2a15" } }, "variableDebtWETH": { "kovan": { "address": "0x920e55564a59967FB7A9cbB52D806FcF9093fda9" + }, + "hardhat": { + "address": "0x61641145904737b907B4e31DBdAd829B606eB111" } }, "stableDebtYFI": { "kovan": { "address": "0xFa29EA4a56192B3435D1B44c06c105d6A68934eb" + }, + "hardhat": { + "address": "0x3049AA46A60B4253d6Cf122a25bBd26a0CCb6CAd" } }, "variableDebtYFI": { "kovan": { "address": "0x6888B4E246af31Abd68b8809C559dBAe005F3f8C" + }, + "hardhat": { + "address": "0x1Af371fA93aFAB4F461b6f978E7918B79510896A" } }, "aUSDT": { "kovan": { "address": "0xcC43E5f28B99359A91241C3C7724329752959315" + }, + "hardhat": { + "address": "0x6A45383E16554222D9AFf39c4deAd7EF598ddb95" } }, "strategyUSDT": { "kovan": { "address": "0x258B11Fe8840465aB532672Cae7552E9b9164868" + }, + "hardhat": { + "address": "0x08fd990609A0Ed943858a7493c7105E2CC784784" } }, "aWBTC": { "kovan": { "address": "0x5Df7c6D2bC373B5D4401A5Fb53c2ca0c5D54f3D9" + }, + "hardhat": { + "address": "0xEDE8C583A3fB6DcfC1a991E5B1F9C1b0b29ca60d" } }, "strategyWBTC": { "kovan": { "address": "0x9499FD7ca03BC886D9D5206Eb13ef49aFAd762D9" + }, + "hardhat": { + "address": "0x763b103B7EFEbb21Acc2b50b134681E0b5ecB247" } }, "aWETH": { "kovan": { "address": "0xC304Ee9c505e4Aa890E4738df1cd51eF344AE1af" + }, + "hardhat": { + "address": "0x24aAB62Ae5595aACae2A0fC10aA31006Cb7dC4ef" } }, "strategyWETH": { "kovan": { "address": "0x6dcb41D1EA0e01d5b411B51459F14c8DEe0271B1" + }, + "hardhat": { + "address": "0x75e2e836409aF032Fc182F2e9D6212336E2E7026" } }, "aYFI": { "kovan": { "address": "0xb88b11E148741c7182e3dF7f50f445174BFA6C80" + }, + "hardhat": { + "address": "0xE4b29Db05C1A3749d085E9eF41dC2378eE530dF0" } }, "strategyYFI": { "kovan": { "address": "0x0bDd002c01D54129ef2D258Ce39fEeC63E37d0DF" + }, + "hardhat": { + "address": "0x8c82e998506DCF9ef46518182DaF18ae962d4b3C" } }, "stableDebtZRX": { "kovan": { "address": "0x76309814279AbD6bfCA3722Db8dEC502F98012E1" + }, + "hardhat": { + "address": "0x929ef1D4eB03724462e59219506CbD5Bcf2Cce38" } }, "variableDebtZRX": { "kovan": { "address": "0x818215a596C8Cc8D27A4dC76c12e8A138570ed9B" + }, + "hardhat": { + "address": "0xDf5E00D37C010cE5FA334234c8E391F82e90fA2e" } }, "aZRX": { "kovan": { "address": "0x66Bf0A6886AC7024015C8020B0aFEdacD41b60c3" + }, + "hardhat": { + "address": "0x255AE9d92694fE823D099b42ff8088770B700029" } }, "strategyZRX": { "kovan": { "address": "0xC0499607b25dd626DF59343d7fCF246E4D875136" + }, + "hardhat": { + "address": "0xaDF23b1cAa6a7B3b077c432794FfF80A4b935cdF" } } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ca272b63..602312e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5293,13 +5293,13 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "resolved": false, "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "resolved": false, "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -5308,7 +5308,7 @@ }, "bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "resolved": false, "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, "requires": { @@ -5317,7 +5317,7 @@ }, "bip66": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "resolved": false, "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", "dev": true, "requires": { @@ -5326,19 +5326,19 @@ }, "bn.js": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "resolved": false, "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": false, "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -5352,25 +5352,25 @@ }, "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "resolved": false, "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "resolved": false, "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, "camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "resolved": false, "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "resolved": false, "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { @@ -5380,7 +5380,7 @@ }, "cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "resolved": false, "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { @@ -5391,7 +5391,7 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "resolved": false, "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -5400,13 +5400,13 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "resolved": false, "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": false, "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -5419,7 +5419,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": false, "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -5433,7 +5433,7 @@ }, "cross-spawn": { "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "resolved": false, "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { @@ -5446,13 +5446,13 @@ }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "resolved": false, "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "drbg.js": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "resolved": false, "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", "dev": true, "requires": { @@ -5463,7 +5463,7 @@ }, "elliptic": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "resolved": false, "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", "dev": true, "requires": { @@ -5478,13 +5478,13 @@ }, "emoji-regex": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "resolved": false, "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "end-of-stream": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "resolved": false, "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { @@ -5493,7 +5493,7 @@ }, "ethereumjs-util": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", + "resolved": false, "integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "dev": true, "requires": { @@ -5508,7 +5508,7 @@ }, "ethjs-util": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "resolved": false, "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dev": true, "requires": { @@ -5518,7 +5518,7 @@ }, "evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "resolved": false, "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { @@ -5528,7 +5528,7 @@ }, "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "resolved": false, "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { @@ -5543,13 +5543,13 @@ }, "file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "resolved": false, "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true }, "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "resolved": false, "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -5558,13 +5558,13 @@ }, "get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "resolved": false, "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "resolved": false, "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { @@ -5573,7 +5573,7 @@ }, "hash-base": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "resolved": false, "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { @@ -5583,7 +5583,7 @@ }, "hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "resolved": false, "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { @@ -5593,7 +5593,7 @@ }, "hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "resolved": false, "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { @@ -5604,43 +5604,43 @@ }, "inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "resolved": false, "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "invert-kv": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "resolved": false, "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "resolved": false, "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-hex-prefixed": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "resolved": false, "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", "dev": true }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "resolved": false, "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "resolved": false, "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "keccak": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "resolved": false, "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "dev": true, "requires": { @@ -5652,7 +5652,7 @@ }, "lcid": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "resolved": false, "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { @@ -5661,7 +5661,7 @@ }, "locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "resolved": false, "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -5671,7 +5671,7 @@ }, "map-age-cleaner": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "resolved": false, "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { @@ -5680,7 +5680,7 @@ }, "md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "resolved": false, "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { @@ -5691,7 +5691,7 @@ }, "mem": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "resolved": false, "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { @@ -5702,37 +5702,37 @@ }, "mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "resolved": false, "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "resolved": false, "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "resolved": false, "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, "nan": { "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "resolved": false, "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true }, "nice-try": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "resolved": false, "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "npm-run-path": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "resolved": false, "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { @@ -5741,7 +5741,7 @@ }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { @@ -5750,7 +5750,7 @@ }, "os-locale": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "resolved": false, "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { @@ -5761,25 +5761,25 @@ }, "p-defer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "resolved": false, "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "resolved": false, "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "resolved": false, "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "resolved": false, "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { @@ -5788,7 +5788,7 @@ }, "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "resolved": false, "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -5797,25 +5797,25 @@ }, "p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "resolved": false, "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "resolved": false, "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "resolved": false, "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "resolved": false, "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { @@ -5825,19 +5825,19 @@ }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "resolved": false, "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "resolved": false, "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "resolved": false, "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { @@ -5847,7 +5847,7 @@ }, "rlp": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.3.tgz", + "resolved": false, "integrity": "sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ==", "dev": true, "requires": { @@ -5857,13 +5857,13 @@ }, "safe-buffer": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "resolved": false, "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true }, "secp256k1": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "resolved": false, "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", "dev": true, "requires": { @@ -5879,19 +5879,19 @@ }, "semver": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "resolved": false, "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "resolved": false, "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": false, "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -5901,7 +5901,7 @@ }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "resolved": false, "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { @@ -5910,25 +5910,25 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "resolved": false, "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "resolved": false, "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "resolved": false, "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-support": { "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "resolved": false, "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { @@ -5938,7 +5938,7 @@ }, "string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "resolved": false, "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -5949,7 +5949,7 @@ }, "strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "resolved": false, "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -5958,13 +5958,13 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": false, "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-hex-prefix": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "resolved": false, "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", "dev": true, "requires": { @@ -5973,7 +5973,7 @@ }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "resolved": false, "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { @@ -5982,13 +5982,13 @@ }, "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "resolved": false, "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "resolved": false, "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { @@ -5999,19 +5999,19 @@ }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "resolved": false, "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "y18n": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "resolved": false, "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "resolved": false, "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "dev": true, "requires": { @@ -6030,7 +6030,7 @@ }, "yargs-parser": { "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "resolved": false, "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { From a3ee5d2ce695f3fb668c9622c5e16facc3ca8424 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:18:31 +0100 Subject: [PATCH 06/17] Added tracking of the usage as collateral to the liquidationCall --- .../LendingPoolCollateralManager.sol | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/contracts/lendingpool/LendingPoolCollateralManager.sol b/contracts/lendingpool/LendingPoolCollateralManager.sol index 993f7fe5..729895de 100644 --- a/contracts/lendingpool/LendingPoolCollateralManager.sol +++ b/contracts/lendingpool/LendingPoolCollateralManager.sol @@ -57,6 +57,13 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor bool receiveAToken ); + /** + * @dev emitted when a user disables a reserve as collateral + * @param reserve the address of the reserve + * @param user the address of the user + **/ + event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); + struct LiquidationCallLocalVars { uint256 userCollateralBalance; uint256 userStableDebt; @@ -120,7 +127,7 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor (, , , , vars.healthFactor) = GenericLogic.calculateUserAccountData( user, _reserves, - _usersConfig[user], + userConfig, _reservesList, _reservesCount, _addressesProvider.getPriceOracle() @@ -246,6 +253,14 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor ); } + //if the collateral being liquidated is equal to the user balance, + //we set the currency as not being used as collateral anymore + + if (vars.maxCollateralToLiquidate == vars.userCollateralBalance) { + userConfig.setUsingAsCollateral(collateralReserve.id, false); + emit ReserveUsedAsCollateralDisabled(collateral, user); + } + //transfers the principal currency to the aToken IERC20(principal).safeTransferFrom( msg.sender, From 31cbe9127ec118d13daaba43c4d568cce723b031 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:29:43 +0100 Subject: [PATCH 07/17] Fixed validateWithdraw --- contracts/libraries/logic/ValidationLogic.sol | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/contracts/libraries/logic/ValidationLogic.sol b/contracts/libraries/logic/ValidationLogic.sol index 259c1496..b7fadad2 100644 --- a/contracts/libraries/logic/ValidationLogic.sol +++ b/contracts/libraries/logic/ValidationLogic.sol @@ -66,15 +66,12 @@ library ValidationLogic { uint256 reservesCount, address oracle ) external view { - require(amount != 0, Errors.VL_INVALID_AMOUNT); - require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); (bool isActive,, , ) = reservesData[reserveAddress].configuration.getFlags(); require(isActive, Errors.VL_NO_ACTIVE_RESERVE); - - require(amount != 0, Errors.VL_INVALID_AMOUNT); - require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + require(amount != 0, Errors.VL_INVALID_AMOUNT); + require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); require( GenericLogic.balanceDecreaseAllowed( From 57ed9efd58260c11f133c61c684a441b2a4d2aed Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:33:00 +0100 Subject: [PATCH 08/17] Validated the user balance before isActive --- contracts/libraries/logic/ValidationLogic.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/libraries/logic/ValidationLogic.sol b/contracts/libraries/logic/ValidationLogic.sol index b7fadad2..4388d9c2 100644 --- a/contracts/libraries/logic/ValidationLogic.sol +++ b/contracts/libraries/logic/ValidationLogic.sol @@ -67,12 +67,12 @@ library ValidationLogic { address oracle ) external view { - (bool isActive,, , ) = reservesData[reserveAddress].configuration.getFlags(); - require(isActive, Errors.VL_NO_ACTIVE_RESERVE); - require(amount != 0, Errors.VL_INVALID_AMOUNT); require(amount <= userBalance, Errors.VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE); + (bool isActive,, , ) = reservesData[reserveAddress].configuration.getFlags(); + require(isActive, Errors.VL_NO_ACTIVE_RESERVE); + require( GenericLogic.balanceDecreaseAllowed( reserveAddress, From 643ed2f9bcfaee21a8c92e258aa8b0d3080b37ed Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:52:02 +0100 Subject: [PATCH 09/17] Fixed comment in ReserveConfiguration --- contracts/libraries/configuration/ReserveConfiguration.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/libraries/configuration/ReserveConfiguration.sol b/contracts/libraries/configuration/ReserveConfiguration.sol index 7951d91a..71c64bde 100644 --- a/contracts/libraries/configuration/ReserveConfiguration.sol +++ b/contracts/libraries/configuration/ReserveConfiguration.sol @@ -86,7 +86,7 @@ library ReserveConfiguration { } /** - * @dev gets the Loan to Value of the reserve + * @dev gets the liquidation threshold of the reserve * @param self the reserve configuration * @return the liquidation threshold **/ From fed8c7988464a0febb711941392c6e32d07ae998 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:52:34 +0100 Subject: [PATCH 10/17] Fixed comment in ReserveLogic --- contracts/libraries/logic/ReserveLogic.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/libraries/logic/ReserveLogic.sol b/contracts/libraries/logic/ReserveLogic.sol index 63cc0dd6..96cdbc40 100644 --- a/contracts/libraries/logic/ReserveLogic.sol +++ b/contracts/libraries/logic/ReserveLogic.sol @@ -76,7 +76,7 @@ library ReserveLogic { /** * @dev returns the ongoing normalized income for the reserve. * a value of 1e27 means there is no income. As time passes, the income is accrued. - * A value of 2*1e27 means for each unit of assset two units of income have been accrued. + * A value of 2*1e27 means for each unit of asset one unit of income has been accrued. * @param reserve the reserve object * @return the normalized income. expressed in ray **/ From 92e2ecab5198dda4dd4fedd98e158af957918fd4 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 16:57:35 +0100 Subject: [PATCH 11/17] Added more detailed comments on configureReserveAsCollateral --- contracts/lendingpool/LendingPoolConfigurator.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/lendingpool/LendingPoolConfigurator.sol b/contracts/lendingpool/LendingPoolConfigurator.sol index c9a828de..098987b9 100644 --- a/contracts/lendingpool/LendingPoolConfigurator.sol +++ b/contracts/lendingpool/LendingPoolConfigurator.sol @@ -365,11 +365,13 @@ contract LendingPoolConfigurator is VersionedInitializable { } /** - * @dev configures the reserve collateralization parameters + * @dev configures the reserve collateralization parameters. + * all the values are expressed in percentages with two decimals of precision. A valid value is 10000, which means 100.00% * @param asset the address of the reserve * @param ltv the loan to value of the asset when used as collateral * @param liquidationThreshold the threshold at which loans using this asset as collateral will be considered undercollateralized - * @param liquidationBonus the bonus liquidators receive to liquidate this asset + * @param liquidationBonus the bonus liquidators receive to liquidate this asset. The values is always above 100%. A value of 105% + * means the liquidator will receive a 5% bonus **/ function configureReserveAsCollateral( address asset, From f125eeb0c5378e5d0da31bde9d01707b5ec62014 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 17:15:36 +0100 Subject: [PATCH 12/17] Removed unneeded conditions --- contracts/libraries/logic/ReserveLogic.sol | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/contracts/libraries/logic/ReserveLogic.sol b/contracts/libraries/logic/ReserveLogic.sol index 96cdbc40..85fbe28a 100644 --- a/contracts/libraries/logic/ReserveLogic.sol +++ b/contracts/libraries/logic/ReserveLogic.sol @@ -185,15 +185,9 @@ library ReserveLogic { address interestRateStrategyAddress ) external { require(reserve.aTokenAddress == address(0), Errors.RL_RESERVE_ALREADY_INITIALIZED); - if (reserve.liquidityIndex == 0) { - //if the reserve has not been initialized yet - reserve.liquidityIndex = uint128(WadRayMath.ray()); - } - - if (reserve.variableBorrowIndex == 0) { - reserve.variableBorrowIndex = uint128(WadRayMath.ray()); - } - + + reserve.liquidityIndex = uint128(WadRayMath.ray()); + reserve.variableBorrowIndex = uint128(WadRayMath.ray()); reserve.aTokenAddress = aTokenAddress; reserve.stableDebtTokenAddress = stableDebtTokenAddress; reserve.variableDebtTokenAddress = variableDebtTokenAddress; From 6460dd9e034bf74b882f9f0e02a46ba1282a4d7e Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 17:21:59 +0100 Subject: [PATCH 13/17] fixes #133 --- contracts/libraries/configuration/UserConfiguration.sol | 6 ++++++ contracts/libraries/helpers/Errors.sol | 1 + 2 files changed, 7 insertions(+) diff --git a/contracts/libraries/configuration/UserConfiguration.sol b/contracts/libraries/configuration/UserConfiguration.sol index 71c28f0e..8679390e 100644 --- a/contracts/libraries/configuration/UserConfiguration.sol +++ b/contracts/libraries/configuration/UserConfiguration.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: agpl-3.0 pragma solidity ^0.6.8; +import {Errors} from '../helpers/Errors.sol'; /** * @title UserConfiguration library * @author Aave @@ -24,6 +25,7 @@ library UserConfiguration { uint256 reserveIndex, bool borrowing ) internal { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); self.data = (self.data & ~(1 << (reserveIndex * 2))) | (uint256(borrowing ? 1 : 0) << (reserveIndex * 2)); @@ -40,6 +42,7 @@ library UserConfiguration { uint256 reserveIndex, bool _usingAsCollateral ) internal { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); self.data = (self.data & ~(1 << (reserveIndex * 2 + 1))) | (uint256(_usingAsCollateral ? 1 : 0) << (reserveIndex * 2 + 1)); @@ -56,6 +59,7 @@ library UserConfiguration { pure returns (bool) { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); return (self.data >> (reserveIndex * 2)) & 3 != 0; } @@ -70,6 +74,7 @@ library UserConfiguration { pure returns (bool) { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); return (self.data >> (reserveIndex * 2)) & 1 != 0; } @@ -84,6 +89,7 @@ library UserConfiguration { pure returns (bool) { + require(reserveIndex < 128, Errors.UL_INVALID_INDEX); return (self.data >> (reserveIndex * 2 + 1)) & 1 != 0; } diff --git a/contracts/libraries/helpers/Errors.sol b/contracts/libraries/helpers/Errors.sol index 2dff6ced..1aeb88b1 100644 --- a/contracts/libraries/helpers/Errors.sol +++ b/contracts/libraries/helpers/Errors.sol @@ -96,6 +96,7 @@ library Errors { string public constant LPAPR_INVALID_ADDRESSES_PROVIDER_ID = '72'; string public constant VL_INCONSISTENT_FLASHLOAN_PARAMS = '73'; string public constant LP_INCONSISTENT_PARAMS_LENGTH = '74'; + string public constant UL_INVALID_INDEX = '77'; enum CollateralManagerErrors { NO_ERROR, From 12707238f8c9ca83dcfe5dae550c6d2be808337a Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 17:28:43 +0100 Subject: [PATCH 14/17] Fixes #131 --- contracts/lendingpool/LendingPool.sol | 2 +- deployed-contracts.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index 9f4ab28a..d94285f9 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -901,7 +901,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage _reserves[asset].id = uint8(reservesCount); _reservesList[reservesCount] = asset; - _reservesCount++; + _reservesCount = reservesCount + 1; } } } diff --git a/deployed-contracts.json b/deployed-contracts.json index 6fb4bcf1..b16e4e44 100644 --- a/deployed-contracts.json +++ b/deployed-contracts.json @@ -1285,4 +1285,4 @@ "address": "0xaDF23b1cAa6a7B3b077c432794FfF80A4b935cdF" } } -} +} \ No newline at end of file From 2df0598e4bfa6ce9bb989e685954a9712c115476 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 17:38:06 +0100 Subject: [PATCH 15/17] Added modifiers --- contracts/lendingpool/LendingPool.sol | 61 +++++++++++++++------------ deployed-contracts.json | 2 +- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index 9f4ab28a..910711c2 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -43,6 +43,22 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 public constant MAX_NUMBER_RESERVES = 128; uint256 public constant LENDINGPOOL_REVISION = 0x2; + /** + * @dev functions marked by this modifier can only be called when the protocol is not paused + **/ + modifier whenNotPaused() { + _whenNotPaused(); + _; + } + + /** + * @dev functions marked by this modifier can only be called by the LendingPoolConfigurator + **/ + modifier onlyLendingPoolConfigurator() { + _onlyLendingPoolConfigurator(); + _; + } + /** * @dev only lending pools configurator can use functions affected by this modifier **/ @@ -89,8 +105,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 amount, address onBehalfOf, uint16 referralCode - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; ValidationLogic.validateDeposit(reserve, amount); @@ -123,8 +138,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address asset, uint256 amount, address to - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { + ReserveLogic.ReserveData storage reserve = _reserves[asset]; address aToken = reserve.aTokenAddress; @@ -178,8 +193,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 interestRateMode, uint16 referralCode, address onBehalfOf - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; _executeBorrow( @@ -209,8 +223,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 amount, uint256 rateMode, address onBehalfOf - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; @@ -266,8 +279,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve on which the user borrowed * @param rateMode the rate mode that the user wants to swap **/ - function swapBorrowRateMode(address asset, uint256 rateMode) external override { - _whenNotPaused(); + function swapBorrowRateMode(address asset, uint256 rateMode) external override whenNotPaused { + ReserveLogic.ReserveData storage reserve = _reserves[asset]; (uint256 stableDebt, uint256 variableDebt) = Helpers.getUserCurrentDebt(msg.sender, reserve); @@ -321,8 +334,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve * @param user the address of the user to be rebalanced **/ - function rebalanceStableBorrowRate(address asset, address user) external override { - _whenNotPaused(); + function rebalanceStableBorrowRate(address asset, address user) external override whenNotPaused { ReserveLogic.ReserveData storage reserve = _reserves[asset]; @@ -360,8 +372,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve * @param useAsCollateral true if the user wants to use the deposit as collateral, false otherwise. **/ - function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external override { - _whenNotPaused(); + function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external override whenNotPaused { + ReserveLogic.ReserveData storage reserve = _reserves[asset]; ValidationLogic.validateSetUseReserveAsCollateral( @@ -399,8 +411,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address user, uint256 purchaseAmount, bool receiveAToken - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { address collateralManager = _addressesProvider.getLendingPoolCollateralManager(); //solium-disable-next-line @@ -456,8 +467,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address onBehalfOf, bytes calldata params, uint16 referralCode - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { FlashLoanLocalVars memory vars; @@ -693,8 +703,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore - ) external override { - _whenNotPaused(); + ) external override whenNotPaused { require(msg.sender == _reserves[asset].aTokenAddress, Errors.LP_CALLER_MUST_BE_AN_ATOKEN); @@ -743,8 +752,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress - ) external override { - _onlyLendingPoolConfigurator(); + ) external override onlyLendingPoolConfigurator { + _reserves[asset].init( aTokenAddress, stableDebtAddress, @@ -762,8 +771,8 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) external override + onlyLendingPoolConfigurator { - _onlyLendingPoolConfigurator(); _reserves[asset].interestRateStrategyAddress = rateStrategyAddress; } @@ -772,8 +781,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @param asset the address of the reserve * @param configuration the configuration map **/ - function setConfiguration(address asset, uint256 configuration) external override { - _onlyLendingPoolConfigurator(); + function setConfiguration(address asset, uint256 configuration) external override onlyLendingPoolConfigurator { _reserves[asset].configuration.data = configuration; } @@ -781,8 +789,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage * @dev Set the _pause state * @param val the boolean value to set the current pause state of LendingPool */ - function setPause(bool val) external override { - _onlyLendingPoolConfigurator(); + function setPause(bool val) external override onlyLendingPoolConfigurator { _paused = val; if (_paused) { diff --git a/deployed-contracts.json b/deployed-contracts.json index 6fb4bcf1..b16e4e44 100644 --- a/deployed-contracts.json +++ b/deployed-contracts.json @@ -1285,4 +1285,4 @@ "address": "0xaDF23b1cAa6a7B3b077c432794FfF80A4b935cdF" } } -} +} \ No newline at end of file From 743eb6ec2954a21c6eb287d02ef1906500d2a27d Mon Sep 17 00:00:00 2001 From: David Racero Date: Tue, 10 Nov 2020 17:50:13 +0100 Subject: [PATCH 16/17] Added isContract to check asset at LendingPool.initResetve function --- contracts/lendingpool/LendingPool.sol | 2 ++ contracts/libraries/helpers/Errors.sol | 1 + 2 files changed, 3 insertions(+) diff --git a/contracts/lendingpool/LendingPool.sol b/contracts/lendingpool/LendingPool.sol index 9f4ab28a..c625f8b2 100644 --- a/contracts/lendingpool/LendingPool.sol +++ b/contracts/lendingpool/LendingPool.sol @@ -25,6 +25,7 @@ import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; import {SafeERC20} from '../dependencies/openzeppelin/contracts/SafeERC20.sol'; import {ILendingPool} from '../interfaces/ILendingPool.sol'; import {LendingPoolStorage} from './LendingPoolStorage.sol'; +import {Address} from '../dependencies/openzeppelin/contracts/Address.sol'; /** * @title LendingPool contract @@ -744,6 +745,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage address variableDebtAddress, address interestRateStrategyAddress ) external override { + require(Address.isContract(asset), Errors.LP_NOT_CONTRACT); _onlyLendingPoolConfigurator(); _reserves[asset].init( aTokenAddress, diff --git a/contracts/libraries/helpers/Errors.sol b/contracts/libraries/helpers/Errors.sol index 1aeb88b1..3f044b17 100644 --- a/contracts/libraries/helpers/Errors.sol +++ b/contracts/libraries/helpers/Errors.sol @@ -97,6 +97,7 @@ library Errors { string public constant VL_INCONSISTENT_FLASHLOAN_PARAMS = '73'; string public constant LP_INCONSISTENT_PARAMS_LENGTH = '74'; string public constant UL_INVALID_INDEX = '77'; + string public constant LP_NOT_CONTRACT = '78'; enum CollateralManagerErrors { NO_ERROR, From 80997ea965f3ac564e3a16040fe1574b75b68700 Mon Sep 17 00:00:00 2001 From: The3D Date: Tue, 10 Nov 2020 18:16:27 +0100 Subject: [PATCH 17/17] Added checks on liquidationBonus --- contracts/lendingpool/LendingPoolConfigurator.sol | 13 ++++++++----- deployed-contracts.json | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/contracts/lendingpool/LendingPoolConfigurator.sol b/contracts/lendingpool/LendingPoolConfigurator.sol index 098987b9..de091dbb 100644 --- a/contracts/lendingpool/LendingPoolConfigurator.sol +++ b/contracts/lendingpool/LendingPoolConfigurator.sol @@ -388,11 +388,14 @@ contract LendingPoolConfigurator is VersionedInitializable { if (liquidationThreshold != 0) { //liquidation bonus must be bigger than 100.00%, otherwise the liquidator would receive less - //collateral than needed to cover the debt - require( - liquidationBonus > PercentageMath.PERCENTAGE_FACTOR, - Errors.LPC_INVALID_CONFIGURATION - ); + //collateral than needed to cover the debt. + uint256 absoluteBonus = liquidationBonus.sub(PercentageMath.PERCENTAGE_FACTOR, Errors.LPC_INVALID_CONFIGURATION); + require(absoluteBonus > 0, Errors.LPC_INVALID_CONFIGURATION); + + //we also need to require that the liq threshold is lower or equal than the liquidation bonus, to ensure that + //there is always enough margin for liquidators to receive the bonus. + require(liquidationThreshold.add(absoluteBonus) <= PercentageMath.PERCENTAGE_FACTOR, Errors.LPC_INVALID_CONFIGURATION); + } else { require(liquidationBonus == 0, Errors.LPC_INVALID_CONFIGURATION); //if the liquidation threshold is being set to 0, diff --git a/deployed-contracts.json b/deployed-contracts.json index 6fb4bcf1..b16e4e44 100644 --- a/deployed-contracts.json +++ b/deployed-contracts.json @@ -1285,4 +1285,4 @@ "address": "0xaDF23b1cAa6a7B3b077c432794FfF80A4b935cdF" } } -} +} \ No newline at end of file