Branch data Line data Source code
1 : : // SPDX-License-Identifier: BUSL-1.1
2 : : pragma solidity ^0.8.10;
3 : :
4 : : import {VersionedInitializable} from '../../misc/aave-upgradeability/VersionedInitializable.sol';
5 : : import {Errors} from '../libraries/helpers/Errors.sol';
6 : : import {ReserveConfiguration} from '../libraries/configuration/ReserveConfiguration.sol';
7 : : import {PoolLogic} from '../libraries/logic/PoolLogic.sol';
8 : : import {ReserveLogic} from '../libraries/logic/ReserveLogic.sol';
9 : : import {EModeLogic} from '../libraries/logic/EModeLogic.sol';
10 : : import {SupplyLogic} from '../libraries/logic/SupplyLogic.sol';
11 : : import {FlashLoanLogic} from '../libraries/logic/FlashLoanLogic.sol';
12 : : import {BorrowLogic} from '../libraries/logic/BorrowLogic.sol';
13 : : import {LiquidationLogic} from '../libraries/logic/LiquidationLogic.sol';
14 : : import {DataTypes} from '../libraries/types/DataTypes.sol';
15 : : import {BridgeLogic} from '../libraries/logic/BridgeLogic.sol';
16 : : import {IERC20WithPermit} from '../../interfaces/IERC20WithPermit.sol';
17 : : import {IPoolAddressesProvider} from '../../interfaces/IPoolAddressesProvider.sol';
18 : : import {IPool} from '../../interfaces/IPool.sol';
19 : : import {IACLManager} from '../../interfaces/IACLManager.sol';
20 : : import {PoolStorage} from './PoolStorage.sol';
21 : :
22 : : /**
23 : : * @title Pool contract
24 : : * @author Aave
25 : : * @notice Main point of interaction with an Aave protocol's market
26 : : * - Users can:
27 : : * # Supply
28 : : * # Withdraw
29 : : * # Borrow
30 : : * # Repay
31 : : * # Enable/disable their supplied assets as collateral
32 : : * # Liquidate positions
33 : : * # Execute Flash Loans
34 : : * @dev To be covered by a proxy contract, owned by the PoolAddressesProvider of the specific market
35 : : * @dev All admin functions are callable by the PoolConfigurator contract defined also in the
36 : : * PoolAddressesProvider
37 : : */
38 : : abstract contract Pool is VersionedInitializable, PoolStorage, IPool {
39 : : using ReserveLogic for DataTypes.ReserveData;
40 : :
41 : : IPoolAddressesProvider public immutable ADDRESSES_PROVIDER;
42 : :
43 : : /**
44 : : * @dev Only pool configurator can call functions marked by this modifier.
45 : : */
46 : : modifier onlyPoolConfigurator() {
47 : 6046 : _onlyPoolConfigurator();
48 : : _;
49 : : }
50 : :
51 : : /**
52 : : * @dev Only pool admin can call functions marked by this modifier.
53 : : */
54 : : modifier onlyPoolAdmin() {
55 : 2000 : _onlyPoolAdmin();
56 : : _;
57 : : }
58 : :
59 : : /**
60 : : * @dev Only bridge can call functions marked by this modifier.
61 : : */
62 : : modifier onlyBridge() {
63 : 17 : _onlyBridge();
64 : : _;
65 : : }
66 : :
67 : : function _onlyPoolConfigurator() internal view virtual {
68 : 447472 : require(
69 : : ADDRESSES_PROVIDER.getPoolConfigurator() == msg.sender,
70 : : Errors.CALLER_NOT_POOL_CONFIGURATOR
71 : : );
72 : : }
73 : :
74 : : function _onlyPoolAdmin() internal view virtual {
75 : 2000 : require(
76 : : IACLManager(ADDRESSES_PROVIDER.getACLManager()).isPoolAdmin(msg.sender),
77 : : Errors.CALLER_NOT_POOL_ADMIN
78 : : );
79 : : }
80 : :
81 : : function _onlyBridge() internal view virtual {
82 : 26 : require(
83 : : IACLManager(ADDRESSES_PROVIDER.getACLManager()).isBridge(msg.sender),
84 : : Errors.CALLER_NOT_BRIDGE
85 : : );
86 : : }
87 : :
88 : : /**
89 : : * @dev Constructor.
90 : : * @param provider The address of the PoolAddressesProvider contract
91 : : */
92 : : constructor(IPoolAddressesProvider provider) {
93 : 44 : ADDRESSES_PROVIDER = provider;
94 : : }
95 : :
96 : : /**
97 : : * @notice Initializes the Pool.
98 : : * @dev Function is invoked by the proxy contract when the Pool contract is added to the
99 : : * PoolAddressesProvider of the market.
100 : : * @dev Caching the address of the PoolAddressesProvider in order to reduce gas consumption on subsequent operations
101 : : * @param provider The address of the PoolAddressesProvider
102 : : */
103 : : function initialize(IPoolAddressesProvider provider) external virtual;
104 : :
105 : : /// @inheritdoc IPool
106 : : function mintUnbacked(
107 : : address asset,
108 : : uint256 amount,
109 : : address onBehalfOf,
110 : : uint16 referralCode
111 : : ) external virtual override onlyBridge {
112 : 16 : BridgeLogic.executeMintUnbacked(
113 : : _reserves,
114 : : _reservesList,
115 : : _usersConfig[onBehalfOf],
116 : : asset,
117 : : amount,
118 : : onBehalfOf,
119 : : referralCode
120 : : );
121 : : }
122 : :
123 : : /// @inheritdoc IPool
124 : : function backUnbacked(
125 : : address asset,
126 : : uint256 amount,
127 : : uint256 fee
128 : : ) external virtual override onlyBridge returns (uint256) {
129 : 9 : return
130 : 9 : BridgeLogic.executeBackUnbacked(_reserves[asset], asset, amount, fee, _bridgeProtocolFee);
131 : : }
132 : :
133 : : /// @inheritdoc IPool
134 : : function supply(
135 : : address asset,
136 : : uint256 amount,
137 : : address onBehalfOf,
138 : : uint16 referralCode
139 : : ) public virtual override {
140 : 20490 : SupplyLogic.executeSupply(
141 : : _reserves,
142 : : _reservesList,
143 : : _usersConfig[onBehalfOf],
144 : : DataTypes.ExecuteSupplyParams({
145 : : asset: asset,
146 : : amount: amount,
147 : : onBehalfOf: onBehalfOf,
148 : : referralCode: referralCode
149 : : })
150 : : );
151 : : }
152 : :
153 : : /// @inheritdoc IPool
154 : : function supplyWithPermit(
155 : : address asset,
156 : : uint256 amount,
157 : : address onBehalfOf,
158 : : uint16 referralCode,
159 : : uint256 deadline,
160 : : uint8 permitV,
161 : : bytes32 permitR,
162 : : bytes32 permitS
163 : : ) public virtual override {
164 : : try
165 : 4000 : IERC20WithPermit(asset).permit(
166 : : msg.sender,
167 : : address(this),
168 : : amount,
169 : : deadline,
170 : : permitV,
171 : : permitR,
172 : : permitS
173 : : )
174 : 0 : {} catch {}
175 : 4000 : SupplyLogic.executeSupply(
176 : : _reserves,
177 : : _reservesList,
178 : : _usersConfig[onBehalfOf],
179 : : DataTypes.ExecuteSupplyParams({
180 : : asset: asset,
181 : : amount: amount,
182 : : onBehalfOf: onBehalfOf,
183 : : referralCode: referralCode
184 : : })
185 : : );
186 : : }
187 : :
188 : : /// @inheritdoc IPool
189 : : function withdraw(
190 : : address asset,
191 : : uint256 amount,
192 : : address to
193 : : ) public virtual override returns (uint256) {
194 : 2045 : return
195 : 2045 : SupplyLogic.executeWithdraw(
196 : : _reserves,
197 : : _reservesList,
198 : : _eModeCategories,
199 : : _usersConfig[msg.sender],
200 : : DataTypes.ExecuteWithdrawParams({
201 : : asset: asset,
202 : : amount: amount,
203 : : to: to,
204 : : reservesCount: _reservesCount,
205 : : oracle: ADDRESSES_PROVIDER.getPriceOracle(),
206 : : userEModeCategory: _usersEModeCategory[msg.sender]
207 : : })
208 : : );
209 : : }
210 : :
211 : : /// @inheritdoc IPool
212 : : function borrow(
213 : : address asset,
214 : : uint256 amount,
215 : : uint256 interestRateMode,
216 : : uint16 referralCode,
217 : : address onBehalfOf
218 : : ) public virtual override {
219 : 16108 : BorrowLogic.executeBorrow(
220 : : _reserves,
221 : : _reservesList,
222 : : _eModeCategories,
223 : : _usersConfig[onBehalfOf],
224 : : DataTypes.ExecuteBorrowParams({
225 : : asset: asset,
226 : : user: msg.sender,
227 : : onBehalfOf: onBehalfOf,
228 : : amount: amount,
229 : : interestRateMode: DataTypes.InterestRateMode(interestRateMode),
230 : : referralCode: referralCode,
231 : : releaseUnderlying: true,
232 : : reservesCount: _reservesCount,
233 : : oracle: ADDRESSES_PROVIDER.getPriceOracle(),
234 : : userEModeCategory: _usersEModeCategory[onBehalfOf],
235 : : priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel()
236 : : })
237 : : );
238 : : }
239 : :
240 : : /// @inheritdoc IPool
241 : : function repay(
242 : : address asset,
243 : : uint256 amount,
244 : : uint256 interestRateMode,
245 : : address onBehalfOf
246 : : ) public virtual override returns (uint256) {
247 : 24 : return
248 : 24 : BorrowLogic.executeRepay(
249 : : _reserves,
250 : : _reservesList,
251 : : _usersConfig[onBehalfOf],
252 : : DataTypes.ExecuteRepayParams({
253 : : asset: asset,
254 : : amount: amount,
255 : : interestRateMode: DataTypes.InterestRateMode(interestRateMode),
256 : : onBehalfOf: onBehalfOf,
257 : : useATokens: false
258 : : })
259 : : );
260 : : }
261 : :
262 : : /// @inheritdoc IPool
263 : : function repayWithPermit(
264 : : address asset,
265 : : uint256 amount,
266 : : uint256 interestRateMode,
267 : : address onBehalfOf,
268 : : uint256 deadline,
269 : : uint8 permitV,
270 : : bytes32 permitR,
271 : : bytes32 permitS
272 : : ) public virtual override returns (uint256) {
273 : : try
274 : 4000 : IERC20WithPermit(asset).permit(
275 : : msg.sender,
276 : : address(this),
277 : : amount,
278 : : deadline,
279 : : permitV,
280 : : permitR,
281 : : permitS
282 : : )
283 : 0 : {} catch {}
284 : :
285 : : {
286 : 4000 : DataTypes.ExecuteRepayParams memory params = DataTypes.ExecuteRepayParams({
287 : : asset: asset,
288 : : amount: amount,
289 : : interestRateMode: DataTypes.InterestRateMode(interestRateMode),
290 : : onBehalfOf: onBehalfOf,
291 : : useATokens: false
292 : : });
293 : 4000 : return BorrowLogic.executeRepay(_reserves, _reservesList, _usersConfig[onBehalfOf], params);
294 : : }
295 : : }
296 : :
297 : : /// @inheritdoc IPool
298 : : function repayWithATokens(
299 : : address asset,
300 : : uint256 amount,
301 : : uint256 interestRateMode
302 : : ) public virtual override returns (uint256) {
303 : 1006 : return
304 : 1006 : BorrowLogic.executeRepay(
305 : : _reserves,
306 : : _reservesList,
307 : : _usersConfig[msg.sender],
308 : : DataTypes.ExecuteRepayParams({
309 : : asset: asset,
310 : : amount: amount,
311 : : interestRateMode: DataTypes.InterestRateMode(interestRateMode),
312 : : onBehalfOf: msg.sender,
313 : : useATokens: true
314 : : })
315 : : );
316 : : }
317 : :
318 : : /// @inheritdoc IPool
319 : : function setUserUseReserveAsCollateral(
320 : : address asset,
321 : : bool useAsCollateral
322 : : ) public virtual override {
323 : 43 : SupplyLogic.executeUseReserveAsCollateral(
324 : : _reserves,
325 : : _reservesList,
326 : : _eModeCategories,
327 : : _usersConfig[msg.sender],
328 : : asset,
329 : : useAsCollateral,
330 : : _reservesCount,
331 : : ADDRESSES_PROVIDER.getPriceOracle(),
332 : : _usersEModeCategory[msg.sender]
333 : : );
334 : : }
335 : :
336 : : /// @inheritdoc IPool
337 : : function liquidationCall(
338 : : address collateralAsset,
339 : : address debtAsset,
340 : : address user,
341 : : uint256 debtToCover,
342 : : bool receiveAToken
343 : : ) public virtual override {
344 : 14501 : LiquidationLogic.executeLiquidationCall(
345 : : _reserves,
346 : : _reservesList,
347 : : _usersConfig,
348 : : _eModeCategories,
349 : : DataTypes.ExecuteLiquidationCallParams({
350 : : reservesCount: _reservesCount,
351 : : debtToCover: debtToCover,
352 : : collateralAsset: collateralAsset,
353 : : debtAsset: debtAsset,
354 : : user: user,
355 : : receiveAToken: receiveAToken,
356 : : priceOracle: ADDRESSES_PROVIDER.getPriceOracle(),
357 : : userEModeCategory: _usersEModeCategory[user],
358 : : priceOracleSentinel: ADDRESSES_PROVIDER.getPriceOracleSentinel()
359 : : })
360 : : );
361 : : }
362 : :
363 : : /// @inheritdoc IPool
364 : : function flashLoan(
365 : : address receiverAddress,
366 : : address[] calldata assets,
367 : : uint256[] calldata amounts,
368 : : uint256[] calldata interestRateModes,
369 : : address onBehalfOf,
370 : : bytes calldata params,
371 : : uint16 referralCode
372 : : ) public virtual override {
373 : 1011 : DataTypes.FlashloanParams memory flashParams = DataTypes.FlashloanParams({
374 : : receiverAddress: receiverAddress,
375 : : assets: assets,
376 : : amounts: amounts,
377 : : interestRateModes: interestRateModes,
378 : : onBehalfOf: onBehalfOf,
379 : : params: params,
380 : : referralCode: referralCode,
381 : : flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol,
382 : : flashLoanPremiumTotal: _flashLoanPremiumTotal,
383 : : reservesCount: _reservesCount,
384 : : addressesProvider: address(ADDRESSES_PROVIDER),
385 : : pool: address(this),
386 : : userEModeCategory: _usersEModeCategory[onBehalfOf],
387 : : isAuthorizedFlashBorrower: IACLManager(ADDRESSES_PROVIDER.getACLManager()).isFlashBorrower(
388 : : msg.sender
389 : : )
390 : : });
391 : :
392 : 1011 : FlashLoanLogic.executeFlashLoan(
393 : : _reserves,
394 : : _reservesList,
395 : : _eModeCategories,
396 : : _usersConfig[onBehalfOf],
397 : : flashParams
398 : : );
399 : : }
400 : :
401 : : /// @inheritdoc IPool
402 : : function flashLoanSimple(
403 : : address receiverAddress,
404 : : address asset,
405 : : uint256 amount,
406 : : bytes calldata params,
407 : : uint16 referralCode
408 : : ) public virtual override {
409 : 11 : DataTypes.FlashloanSimpleParams memory flashParams = DataTypes.FlashloanSimpleParams({
410 : : receiverAddress: receiverAddress,
411 : : asset: asset,
412 : : amount: amount,
413 : : params: params,
414 : : referralCode: referralCode,
415 : : flashLoanPremiumToProtocol: _flashLoanPremiumToProtocol,
416 : : flashLoanPremiumTotal: _flashLoanPremiumTotal
417 : : });
418 : 11 : FlashLoanLogic.executeFlashLoanSimple(_reserves[asset], flashParams);
419 : : }
420 : :
421 : : /// @inheritdoc IPool
422 : : function mintToTreasury(address[] calldata assets) external virtual override {
423 : 4 : PoolLogic.executeMintToTreasury(_reserves, assets);
424 : : }
425 : :
426 : : /// @inheritdoc IPool
427 : : function getReserveDataExtended(
428 : : address asset
429 : : ) external view returns (DataTypes.ReserveData memory) {
430 : 6011 : return _reserves[asset];
431 : : }
432 : :
433 : : /// @inheritdoc IPool
434 : : function getReserveData(
435 : : address asset
436 : : ) external view virtual override returns (DataTypes.ReserveDataLegacy memory) {
437 : 83030 : DataTypes.ReserveData memory reserve = _reserves[asset];
438 : 83030 : DataTypes.ReserveDataLegacy memory res;
439 : :
440 : 83030 : res.configuration = reserve.configuration;
441 : 83030 : res.liquidityIndex = reserve.liquidityIndex;
442 : 83030 : res.currentLiquidityRate = reserve.currentLiquidityRate;
443 : 83030 : res.variableBorrowIndex = reserve.variableBorrowIndex;
444 : 83030 : res.currentVariableBorrowRate = reserve.currentVariableBorrowRate;
445 : 83030 : res.lastUpdateTimestamp = reserve.lastUpdateTimestamp;
446 : 83030 : res.id = reserve.id;
447 : 83030 : res.aTokenAddress = reserve.aTokenAddress;
448 : 83030 : res.variableDebtTokenAddress = reserve.variableDebtTokenAddress;
449 : 83030 : res.interestRateStrategyAddress = reserve.interestRateStrategyAddress;
450 : 83030 : res.accruedToTreasury = reserve.accruedToTreasury;
451 : 83030 : res.unbacked = reserve.unbacked;
452 : 83030 : res.isolationModeTotalDebt = reserve.isolationModeTotalDebt;
453 : 83030 : return res;
454 : : }
455 : :
456 : : /// @inheritdoc IPool
457 : : function getVirtualUnderlyingBalance(
458 : : address asset
459 : : ) external view virtual override returns (uint128) {
460 : 8111 : return _reserves[asset].virtualUnderlyingBalance;
461 : : }
462 : :
463 : : /// @inheritdoc IPool
464 : : function getUserAccountData(
465 : : address user
466 : : )
467 : : external
468 : : view
469 : : virtual
470 : : override
471 : : returns (
472 : : uint256 totalCollateralBase,
473 : : uint256 totalDebtBase,
474 : : uint256 availableBorrowsBase,
475 : : uint256 currentLiquidationThreshold,
476 : : uint256 ltv,
477 : : uint256 healthFactor
478 : : )
479 : : {
480 : 10015 : return
481 : 10015 : PoolLogic.executeGetUserAccountData(
482 : : _reserves,
483 : : _reservesList,
484 : : _eModeCategories,
485 : : DataTypes.CalculateUserAccountDataParams({
486 : : userConfig: _usersConfig[user],
487 : : reservesCount: _reservesCount,
488 : : user: user,
489 : : oracle: ADDRESSES_PROVIDER.getPriceOracle(),
490 : : userEModeCategory: _usersEModeCategory[user]
491 : : })
492 : : );
493 : : }
494 : :
495 : : /// @inheritdoc IPool
496 : : function getConfiguration(
497 : : address asset
498 : : ) external view virtual override returns (DataTypes.ReserveConfigurationMap memory) {
499 : 162047 : return _reserves[asset].configuration;
500 : : }
501 : :
502 : : /// @inheritdoc IPool
503 : : function getUserConfiguration(
504 : : address user
505 : : ) external view virtual override returns (DataTypes.UserConfigurationMap memory) {
506 : 7029 : return _usersConfig[user];
507 : : }
508 : :
509 : : /// @inheritdoc IPool
510 : : function getReserveNormalizedIncome(
511 : : address asset
512 : : ) external view virtual override returns (uint256) {
513 : 115423 : return _reserves[asset].getNormalizedIncome();
514 : : }
515 : :
516 : : /// @inheritdoc IPool
517 : : function getReserveNormalizedVariableDebt(
518 : : address asset
519 : : ) external view virtual override returns (uint256) {
520 : 29583 : return _reserves[asset].getNormalizedDebt();
521 : : }
522 : :
523 : : /// @inheritdoc IPool
524 : : function getReservesList() external view virtual override returns (address[] memory) {
525 : 16076 : uint256 reservesListCount = _reservesCount;
526 : 16076 : uint256 droppedReservesCount = 0;
527 : 16076 : address[] memory reservesList = new address[](reservesListCount);
528 : :
529 : 16076 : for (uint256 i = 0; i < reservesListCount; i++) {
530 : 82300 : if (_reservesList[i] != address(0)) {
531 : 82299 : reservesList[i - droppedReservesCount] = _reservesList[i];
532 : : } else {
533 : 1 : droppedReservesCount++;
534 : : }
535 : : }
536 : :
537 : : // Reduces the length of the reserves array by `droppedReservesCount`
538 : : assembly {
539 : 16076 : mstore(reservesList, sub(reservesListCount, droppedReservesCount))
540 : : }
541 : 16076 : return reservesList;
542 : : }
543 : :
544 : : /// @inheritdoc IPool
545 : : function getReservesCount() external view virtual override returns (uint256) {
546 : 2 : return _reservesCount;
547 : : }
548 : :
549 : : /// @inheritdoc IPool
550 : : function getReserveAddressById(uint16 id) external view returns (address) {
551 : 1 : return _reservesList[id];
552 : : }
553 : :
554 : : /// @inheritdoc IPool
555 : : function BRIDGE_PROTOCOL_FEE() public view virtual override returns (uint256) {
556 : 25 : return _bridgeProtocolFee;
557 : : }
558 : :
559 : : /// @inheritdoc IPool
560 : : function FLASHLOAN_PREMIUM_TOTAL() public view virtual override returns (uint128) {
561 : 1368 : return _flashLoanPremiumTotal;
562 : : }
563 : :
564 : : /// @inheritdoc IPool
565 : : function FLASHLOAN_PREMIUM_TO_PROTOCOL() public view virtual override returns (uint128) {
566 : 1365 : return _flashLoanPremiumToProtocol;
567 : : }
568 : :
569 : : /// @inheritdoc IPool
570 : : function MAX_NUMBER_RESERVES() public view virtual override returns (uint16) {
571 : 168018 : return ReserveConfiguration.MAX_RESERVES_COUNT;
572 : : }
573 : :
574 : : /// @inheritdoc IPool
575 : : function finalizeTransfer(
576 : : address asset,
577 : : address from,
578 : : address to,
579 : : uint256 amount,
580 : : uint256 balanceFromBefore,
581 : : uint256 balanceToBefore
582 : : ) external virtual override {
583 : 17042 : require(msg.sender == _reserves[asset].aTokenAddress, Errors.CALLER_NOT_ATOKEN);
584 : 17042 : SupplyLogic.executeFinalizeTransfer(
585 : : _reserves,
586 : : _reservesList,
587 : : _eModeCategories,
588 : : _usersConfig,
589 : : DataTypes.FinalizeTransferParams({
590 : : asset: asset,
591 : : from: from,
592 : : to: to,
593 : : amount: amount,
594 : : balanceFromBefore: balanceFromBefore,
595 : : balanceToBefore: balanceToBefore,
596 : : reservesCount: _reservesCount,
597 : : oracle: ADDRESSES_PROVIDER.getPriceOracle(),
598 : : fromEModeCategory: _usersEModeCategory[from]
599 : : })
600 : : );
601 : : }
602 : :
603 : : /// @inheritdoc IPool
604 : : function initReserve(
605 : : address asset,
606 : : address aTokenAddress,
607 : : address variableDebtAddress,
608 : : address interestRateStrategyAddress
609 : : ) external virtual override onlyPoolConfigurator {
610 : : if (
611 : 166016 : PoolLogic.executeInitReserve(
612 : : _reserves,
613 : : _reservesList,
614 : : DataTypes.InitReserveParams({
615 : : asset: asset,
616 : : aTokenAddress: aTokenAddress,
617 : : variableDebtAddress: variableDebtAddress,
618 : : interestRateStrategyAddress: interestRateStrategyAddress,
619 : : reservesCount: _reservesCount,
620 : : maxNumberReserves: MAX_NUMBER_RESERVES()
621 : : })
622 : : )
623 : : ) {
624 : 165016 : _reservesCount++;
625 : : }
626 : : }
627 : :
628 : : /// @inheritdoc IPool
629 : : function dropReserve(address asset) external virtual override onlyPoolConfigurator {
630 : 7 : PoolLogic.executeDropReserve(_reserves, _reservesList, asset);
631 : : }
632 : :
633 : : /// @inheritdoc IPool
634 : : function setReserveInterestRateStrategyAddress(
635 : : address asset,
636 : : address rateStrategyAddress
637 : : ) external virtual override onlyPoolConfigurator {
638 : 4046 : require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID);
639 : 2046 : require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED);
640 : :
641 : 46 : _reserves[asset].interestRateStrategyAddress = rateStrategyAddress;
642 : : }
643 : :
644 : : /// @inheritdoc IPool
645 : : function syncIndexesState(address asset) external virtual override onlyPoolConfigurator {
646 : 1994 : DataTypes.ReserveData storage reserve = _reserves[asset];
647 : 1994 : DataTypes.ReserveCache memory reserveCache = reserve.cache();
648 : :
649 : 1994 : reserve.updateState(reserveCache);
650 : : }
651 : :
652 : : /// @inheritdoc IPool
653 : : function syncRatesState(address asset) external virtual override onlyPoolConfigurator {
654 : 1994 : DataTypes.ReserveData storage reserve = _reserves[asset];
655 : 1994 : DataTypes.ReserveCache memory reserveCache = reserve.cache();
656 : :
657 : 1994 : ReserveLogic.updateInterestRatesAndVirtualBalance(reserve, reserveCache, asset, 0, 0);
658 : : }
659 : :
660 : : /// @inheritdoc IPool
661 : : function setConfiguration(
662 : : address asset,
663 : : DataTypes.ReserveConfigurationMap calldata configuration
664 : : ) external virtual override onlyPoolConfigurator {
665 : 208599 : require(asset != address(0), Errors.ZERO_ADDRESS_NOT_VALID);
666 : 208599 : require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED);
667 : 208599 : _reserves[asset].configuration = configuration;
668 : : }
669 : :
670 : : /// @inheritdoc IPool
671 : : function updateBridgeProtocolFee(
672 : : uint256 protocolFee
673 : : ) external virtual override onlyPoolConfigurator {
674 : 13 : _bridgeProtocolFee = protocolFee;
675 : : }
676 : :
677 : : /// @inheritdoc IPool
678 : : function updateFlashloanPremiums(
679 : : uint128 flashLoanPremiumTotal,
680 : : uint128 flashLoanPremiumToProtocol
681 : : ) external virtual override onlyPoolConfigurator {
682 : 1362 : _flashLoanPremiumTotal = flashLoanPremiumTotal;
683 : 1362 : _flashLoanPremiumToProtocol = flashLoanPremiumToProtocol;
684 : : }
685 : :
686 : : /// @inheritdoc IPool
687 : : function configureEModeCategory(
688 : : uint8 id,
689 : : DataTypes.EModeCategoryBaseConfiguration memory category
690 : : ) external virtual override onlyPoolConfigurator {
691 : : // category 0 is reserved for volatile heterogeneous assets and it's always disabled
692 : 10029 : require(id != 0, Errors.EMODE_CATEGORY_RESERVED);
693 : 10029 : _eModeCategories[id].ltv = category.ltv;
694 : 10029 : _eModeCategories[id].liquidationThreshold = category.liquidationThreshold;
695 : 10029 : _eModeCategories[id].liquidationBonus = category.liquidationBonus;
696 : 10029 : _eModeCategories[id].label = category.label;
697 : : }
698 : :
699 : : /// @inheritdoc IPool
700 : : function configureEModeCategoryCollateralBitmap(
701 : : uint8 id,
702 : : uint128 collateralBitmap
703 : : ) external virtual override onlyPoolConfigurator {
704 : : // category 0 is reserved for volatile heterogeneous assets and it's always disabled
705 : 10039 : require(id != 0, Errors.EMODE_CATEGORY_RESERVED);
706 : 10039 : _eModeCategories[id].collateralBitmap = collateralBitmap;
707 : : }
708 : :
709 : : /// @inheritdoc IPool
710 : : function configureEModeCategoryBorrowableBitmap(
711 : : uint8 id,
712 : : uint128 borrowableBitmap
713 : : ) external virtual override onlyPoolConfigurator {
714 : : // category 0 is reserved for volatile heterogeneous assets and it's always disabled
715 : 7010 : require(id != 0, Errors.EMODE_CATEGORY_RESERVED);
716 : 7010 : _eModeCategories[id].borrowableBitmap = borrowableBitmap;
717 : : }
718 : :
719 : : /// @inheritdoc IPool
720 : : function getEModeCategoryData(
721 : : uint8 id
722 : : ) external view virtual override returns (DataTypes.EModeCategoryLegacy memory) {
723 : 3 : DataTypes.EModeCategory memory category = _eModeCategories[id];
724 : 3 : return
725 : : DataTypes.EModeCategoryLegacy({
726 : : ltv: category.ltv,
727 : : liquidationThreshold: category.liquidationThreshold,
728 : : liquidationBonus: category.liquidationBonus,
729 : : priceSource: address(0),
730 : : label: category.label
731 : : });
732 : : }
733 : :
734 : : /// @inheritdoc IPool
735 : : function getEModeCategoryCollateralConfig(
736 : : uint8 id
737 : : ) external view returns (DataTypes.CollateralConfig memory) {
738 : 110 : return
739 : : DataTypes.CollateralConfig({
740 : : ltv: _eModeCategories[id].ltv,
741 : : liquidationThreshold: _eModeCategories[id].liquidationThreshold,
742 : : liquidationBonus: _eModeCategories[id].liquidationBonus
743 : : });
744 : : }
745 : :
746 : : /// @inheritdoc IPool
747 : : function getEModeCategoryLabel(uint8 id) external view returns (string memory) {
748 : 25 : return _eModeCategories[id].label;
749 : : }
750 : :
751 : : /// @inheritdoc IPool
752 : : function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128) {
753 : 10064 : return _eModeCategories[id].collateralBitmap;
754 : : }
755 : :
756 : : /// @inheritdoc IPool
757 : : function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128) {
758 : 7035 : return _eModeCategories[id].borrowableBitmap;
759 : : }
760 : :
761 : : /// @inheritdoc IPool
762 : : function setUserEMode(uint8 categoryId) external virtual override {
763 : 10023 : EModeLogic.executeSetUserEMode(
764 : : _reserves,
765 : : _reservesList,
766 : : _eModeCategories,
767 : : _usersEModeCategory,
768 : : _usersConfig[msg.sender],
769 : : DataTypes.ExecuteSetUserEModeParams({
770 : : reservesCount: _reservesCount,
771 : : oracle: ADDRESSES_PROVIDER.getPriceOracle(),
772 : : categoryId: categoryId
773 : : })
774 : : );
775 : : }
776 : :
777 : : /// @inheritdoc IPool
778 : : function getUserEMode(address user) external view virtual override returns (uint256) {
779 : 5016 : return _usersEModeCategory[user];
780 : : }
781 : :
782 : : /// @inheritdoc IPool
783 : : function resetIsolationModeTotalDebt(
784 : : address asset
785 : : ) external virtual override onlyPoolConfigurator {
786 : 1951 : PoolLogic.executeResetIsolationModeTotalDebt(_reserves, asset);
787 : : }
788 : :
789 : : /// @inheritdoc IPool
790 : : function getLiquidationGracePeriod(address asset) external virtual override returns (uint40) {
791 : 8756 : return _reserves[asset].liquidationGracePeriodUntil;
792 : : }
793 : :
794 : : /// @inheritdoc IPool
795 : : function setLiquidationGracePeriod(
796 : : address asset,
797 : : uint40 until
798 : : ) external virtual override onlyPoolConfigurator {
799 : 14412 : require(_reserves[asset].id != 0 || _reservesList[0] == asset, Errors.ASSET_NOT_LISTED);
800 : 12412 : PoolLogic.executeSetLiquidationGracePeriod(_reserves, asset, until);
801 : : }
802 : :
803 : : /// @inheritdoc IPool
804 : : function rescueTokens(
805 : : address token,
806 : : address to,
807 : : uint256 amount
808 : : ) external virtual override onlyPoolAdmin {
809 : 2000 : PoolLogic.executeRescueTokens(token, to, amount);
810 : : }
811 : :
812 : : /// @inheritdoc IPool
813 : : /// @dev Deprecated: maintained for compatibility purposes
814 : : function deposit(
815 : : address asset,
816 : : uint256 amount,
817 : : address onBehalfOf,
818 : : uint16 referralCode
819 : : ) external virtual override {
820 : 20025 : SupplyLogic.executeSupply(
821 : : _reserves,
822 : : _reservesList,
823 : : _usersConfig[onBehalfOf],
824 : : DataTypes.ExecuteSupplyParams({
825 : : asset: asset,
826 : : amount: amount,
827 : : onBehalfOf: onBehalfOf,
828 : : referralCode: referralCode
829 : : })
830 : : );
831 : : }
832 : :
833 : : /// @inheritdoc IPool
834 : : function getFlashLoanLogic() external pure returns (address) {
835 : 2 : return address(FlashLoanLogic);
836 : : }
837 : :
838 : : /// @inheritdoc IPool
839 : : function getBorrowLogic() external pure returns (address) {
840 : 2 : return address(BorrowLogic);
841 : : }
842 : :
843 : : /// @inheritdoc IPool
844 : : function getBridgeLogic() external pure returns (address) {
845 : 2 : return address(BridgeLogic);
846 : : }
847 : :
848 : : /// @inheritdoc IPool
849 : : function getEModeLogic() external pure returns (address) {
850 : 2 : return address(EModeLogic);
851 : : }
852 : :
853 : : /// @inheritdoc IPool
854 : : function getLiquidationLogic() external pure returns (address) {
855 : 2 : return address(LiquidationLogic);
856 : : }
857 : :
858 : : /// @inheritdoc IPool
859 : : function getPoolLogic() external pure returns (address) {
860 : 2 : return address(PoolLogic);
861 : : }
862 : :
863 : : /// @inheritdoc IPool
864 : : function getSupplyLogic() external pure returns (address) {
865 : 2 : return address(SupplyLogic);
866 : : }
867 : : }
|