Skip to content

Commit

Permalink
Merge branch 'fix/58' into 'master'
Browse files Browse the repository at this point in the history
Resolve "Optimize the reading of the list of reserves by replacing the array with a mapping"

Closes #58

See merge request aave-tech/protocol-v2!66
  • Loading branch information
eboadom committed Oct 8, 2020
2 parents 5ddd98c + 9fdfc8b commit 7a0d201
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 42 deletions.
2 changes: 1 addition & 1 deletion contracts/interfaces/ILendingPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ interface ILendingPool {
uint256 amount
) external view returns (bool);

function getReserves() external view returns (address[] memory);
function getReservesList() external view returns (address[] memory);

/**
* @dev Set the _pause state
Expand Down
47 changes: 34 additions & 13 deletions contracts/lendingpool/LendingPool.sol
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
_reserves,
_usersConfig[msg.sender],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);

Expand Down Expand Up @@ -424,6 +425,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
_reserves,
_usersConfig[msg.sender],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);

Expand Down Expand Up @@ -753,6 +755,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
_reserves,
_usersConfig[user],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);

Expand Down Expand Up @@ -793,10 +796,6 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
usageAsCollateralEnabled = _usersConfig[user].isUsingAsCollateral(reserve.id);
}

function getReserves() external override view returns (address[] memory) {
return _reservesList;
}

receive() external payable {
revert();
}
Expand Down Expand Up @@ -889,6 +888,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
_reserves,
userConfig,
_reservesList,
_reservesCount,
oracle
);

Expand Down Expand Up @@ -948,15 +948,16 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
* @dev adds a reserve to the array of the _reserves address
**/
function _addReserveToList(address asset) internal {
bool reserveAlreadyAdded = false;
require(_reservesList.length < MAX_NUMBER_RESERVES, Errors.NO_MORE_RESERVES_ALLOWED);
for (uint256 i = 0; i < _reservesList.length; i++)
if (_reservesList[i] == asset) {
reserveAlreadyAdded = true;
}
if (!reserveAlreadyAdded) {
_reserves[asset].id = uint8(_reservesList.length);
_reservesList.push(asset);

require(_reservesCount < MAX_NUMBER_RESERVES, Errors.NO_MORE_RESERVES_ALLOWED);

bool reserveAlreadyAdded = _reserves[asset].id != 0 || _reservesList[0]==asset;

if(!reserveAlreadyAdded){
_reserves[asset].id = uint8(_reservesCount);
_reservesList[_reservesCount] = asset;

_reservesCount++;
}
}

Expand Down Expand Up @@ -1004,6 +1005,7 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
_reserves,
_usersConfig[user],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);
}
Expand All @@ -1029,4 +1031,23 @@ contract LendingPool is VersionedInitializable, ILendingPool, LendingPoolStorage
function paused() external override view returns (bool) {
return _paused;
}

/**
* @dev returns the list of the initialized reserves
**/
function getReservesList() external override view returns (address[] memory) {
address[] memory _activeReserves = new address[](_reservesCount);

for(uint256 i = 0; i < _reservesCount; i++){
_activeReserves[i] = _reservesList[i];
}
return _activeReserves;
}

/**
* @dev returns the addresses provider
**/
function getAddressesProvider() external view returns (ILendingPoolAddressesProvider) {
return _addressesProvider;
}
}
9 changes: 8 additions & 1 deletion contracts/lendingpool/LendingPoolCollateralManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor
_reserves,
_usersConfig[user],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);

Expand Down Expand Up @@ -325,6 +326,7 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor
_reserves,
_usersConfig[user],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);

Expand Down Expand Up @@ -412,7 +414,11 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor
vars.actualAmountToLiquidate,
0
);
IERC20(principal).safeTransferFrom(receiver, vars.principalAToken, vars.actualAmountToLiquidate);
IERC20(principal).safeTransferFrom(
receiver,
vars.principalAToken,
vars.actualAmountToLiquidate
);

if (vars.userVariableDebt >= vars.actualAmountToLiquidate) {
IVariableDebtToken(debtReserve.variableDebtTokenAddress).burn(
Expand Down Expand Up @@ -528,6 +534,7 @@ contract LendingPoolCollateralManager is VersionedInitializable, LendingPoolStor
_reserves,
_usersConfig[msg.sender],
_reservesList,
_reservesCount,
_addressesProvider.getPriceOracle()
);

Expand Down
18 changes: 4 additions & 14 deletions contracts/lendingpool/LendingPoolStorage.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,12 @@ contract LendingPoolStorage {
// debt token address => user who gives allowance => user who receives allowance => amount
mapping(address => mapping(address => mapping(address => uint256))) internal _borrowAllowance;

address[] internal _reservesList;
// the list of the available reserves, structured as a mapping for gas savings reasons
mapping(uint256 => address) internal _reservesList;

uint256 internal _reservesCount;

bool internal _flashLiquidationLocked;
bool internal _paused;

/**
* @dev returns the list of the initialized reserves
**/
function getReservesList() external view returns (address[] memory) {
return _reservesList;
}

/**
* @dev returns the addresses provider
**/
function getAddressesProvider() external view returns (ILendingPoolAddressesProvider) {
return _addressesProvider;
}
}
10 changes: 6 additions & 4 deletions contracts/libraries/logic/GenericLogic.sol
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ library GenericLogic {
uint256 amount,
mapping(address => ReserveLogic.ReserveData) storage reservesData,
UserConfiguration.Map calldata userConfig,
address[] calldata reserves,
mapping(uint256 => address) storage reserves,
uint256 reservesCount,
address oracle
) external view returns (bool) {
if (!userConfig.isBorrowingAny() || !userConfig.isUsingAsCollateral(reservesData[asset].id)) {
Expand All @@ -79,7 +80,7 @@ library GenericLogic {
,
vars.avgLiquidationThreshold,

) = calculateUserAccountData(user, reservesData, userConfig, reserves, oracle);
) = calculateUserAccountData(user, reservesData, userConfig, reserves, reservesCount, oracle);

if (vars.borrowBalanceETH == 0) {
return true; //no borrows - no reasons to block the transfer
Expand Down Expand Up @@ -149,7 +150,8 @@ library GenericLogic {
address user,
mapping(address => ReserveLogic.ReserveData) storage reservesData,
UserConfiguration.Map memory userConfig,
address[] memory reserves,
mapping(uint256 => address) storage reserves,
uint256 reservesCount,
address oracle
)
internal
Expand All @@ -167,7 +169,7 @@ library GenericLogic {
if (userConfig.isEmpty()) {
return (0, 0, 0, 0, uint256(-1));
}
for (vars.i = 0; vars.i < reserves.length; vars.i++) {
for (vars.i = 0; vars.i < reservesCount; vars.i++) {
if (!userConfig.isUsingAsCollateralOrBorrowing(vars.i)) {
continue;
}
Expand Down
12 changes: 9 additions & 3 deletions contracts/libraries/logic/ValidationLogic.sol
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ library ValidationLogic {
uint256 userBalance,
mapping(address => ReserveLogic.ReserveData) storage reservesData,
UserConfiguration.Map storage userConfig,
address[] calldata reserves,
mapping(uint256 => address) storage reserves,
uint256 reservesCount,
address oracle
) external view {
require(amount > 0, Errors.AMOUNT_NOT_GREATER_THAN_0);
Expand All @@ -69,6 +70,7 @@ library ValidationLogic {
reservesData,
userConfig,
reserves,
reservesCount,
oracle
),
Errors.TRANSFER_NOT_ALLOWED
Expand Down Expand Up @@ -119,7 +121,8 @@ library ValidationLogic {
uint256 maxStableLoanPercent,
mapping(address => ReserveLogic.ReserveData) storage reservesData,
UserConfiguration.Map storage userConfig,
address[] calldata reserves,
mapping(uint256 => address) storage reserves,
uint256 reservesCount,
address oracle
) external view {
ValidateBorrowLocalVars memory vars;
Expand Down Expand Up @@ -154,6 +157,7 @@ library ValidationLogic {
reservesData,
userConfig,
reserves,
reservesCount,
oracle
);

Expand Down Expand Up @@ -298,7 +302,8 @@ library ValidationLogic {
address reserveAddress,
mapping(address => ReserveLogic.ReserveData) storage reservesData,
UserConfiguration.Map storage userConfig,
address[] calldata reserves,
mapping(uint256 => address) storage reserves,
uint256 reservesCount,
address oracle
) external view {
uint256 underlyingBalance = IERC20(reserve.aTokenAddress).balanceOf(msg.sender);
Expand All @@ -313,6 +318,7 @@ library ValidationLogic {
reservesData,
userConfig,
reserves,
reservesCount,
oracle
),
Errors.DEPOSIT_ALREADY_IN_USE
Expand Down
4 changes: 2 additions & 2 deletions contracts/misc/AaveProtocolTestHelpers.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ contract AaveProtocolTestHelpers {

function getAllReservesTokens() external view returns (TokenData[] memory) {
ILendingPool pool = ILendingPool(ADDRESSES_PROVIDER.getLendingPool());
address[] memory reserves = pool.getReserves();
address[] memory reserves = pool.getReservesList();
TokenData[] memory reservesTokens = new TokenData[](reserves.length);
for (uint256 i = 0; i < reserves.length; i++) {
reservesTokens[i] = TokenData({
Expand All @@ -35,7 +35,7 @@ contract AaveProtocolTestHelpers {

function getAllATokens() external view returns (TokenData[] memory) {
ILendingPool pool = ILendingPool(ADDRESSES_PROVIDER.getLendingPool());
address[] memory reserves = pool.getReserves();
address[] memory reserves = pool.getReservesList();
TokenData[] memory aTokens = new TokenData[](reserves.length);
for (uint256 i = 0; i < reserves.length; i++) {
(address aTokenAddress, , ) = pool.getReserveTokensAddresses(reserves[i]);
Expand Down
2 changes: 1 addition & 1 deletion contracts/misc/WalletBalanceProvider.sol
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ contract WalletBalanceProvider {
{
ILendingPool pool = ILendingPool(_provider.getLendingPool());

address[] memory reserves = pool.getReserves();
address[] memory reserves = pool.getReservesList();

uint256[] memory balances = new uint256[](reserves.length);

Expand Down
6 changes: 3 additions & 3 deletions deployed-contracts.json
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,7 @@
"deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6"
},
"localhost": {
"address": "0xEcb928A3c079a1696Aa5244779eEc3dE1717fACd",
"address": "0xa89E20284Bd638F31b0011D0fC754Fc9d2fa73e3",
"deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6"
},
"coverage": {
Expand Down Expand Up @@ -636,7 +636,7 @@
"deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6"
},
"localhost": {
"address": "0xDFbeeed692AA81E7f86E72F7ACbEA2A1C4d63544",
"address": "0xaA935993065F2dDB1d13623B1941C7AEE3A60F23",
"deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6"
},
"coverage": {
Expand All @@ -650,7 +650,7 @@
"deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6"
},
"localhost": {
"address": "0x5191aA68c7dB195181Dd2441dBE23A48EA24b040",
"address": "0x35A2624888e207e4B3434E9a9E250bF6Ee68FeA3",
"deployer": "0xc783df8a850f42e7F7e57013759C285caa701eB6"
},
"coverage": {
Expand Down

0 comments on commit 7a0d201

Please sign in to comment.