2021-08-18 19:30:56 +00:00
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity 0.7.6;
|
2021-08-21 09:34:40 +00:00
|
|
|
pragma abicoder v2;
|
2021-08-18 19:30:56 +00:00
|
|
|
|
2021-08-21 09:34:40 +00:00
|
|
|
import {
|
|
|
|
LendingPoolInterface,
|
|
|
|
AaveServicesInterface,
|
|
|
|
IERC20
|
|
|
|
} from "./interface.sol";
|
2021-08-18 19:30:56 +00:00
|
|
|
|
|
|
|
abstract contract Helpers {
|
|
|
|
// solhint-disable-next-line const-name-snakecase
|
|
|
|
LendingPoolInterface internal constant _lendingPool =
|
|
|
|
LendingPoolInterface(0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf);
|
|
|
|
|
|
|
|
// solhint-disable-next-line const-name-snakecase
|
|
|
|
AaveServicesInterface internal constant _aaveServices =
|
|
|
|
AaveServicesInterface(0x18FAbC997fDd624764E1974b283B1b904b66d613);
|
|
|
|
|
|
|
|
// solhint-disable-next-line const-name-snakecase
|
|
|
|
address internal constant _protectionAction =
|
|
|
|
0xc38b6dbd0F84777AA4fae2d36FE1506428A22b9B;
|
2021-08-21 09:34:40 +00:00
|
|
|
|
|
|
|
function _cancelProtection() internal {
|
|
|
|
_aaveServices.cancelTask(_protectionAction);
|
|
|
|
}
|
|
|
|
|
|
|
|
function _submitProtection(
|
|
|
|
uint256 _wantedHealthFactor,
|
|
|
|
uint256 _minimumHealthFactor,
|
|
|
|
bool _isPermanent
|
|
|
|
) internal {
|
|
|
|
_giveAllowance();
|
|
|
|
|
|
|
|
_aaveServices.submitTask(
|
|
|
|
_protectionAction,
|
|
|
|
abi.encode(
|
|
|
|
_wantedHealthFactor,
|
|
|
|
_minimumHealthFactor,
|
|
|
|
address(this)
|
|
|
|
),
|
|
|
|
_isPermanent
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function _updateProtection(
|
|
|
|
uint256 _wantedHealthFactor,
|
|
|
|
uint256 _minimumHealthFactor,
|
|
|
|
bool _isPermanent
|
|
|
|
) internal {
|
|
|
|
_giveAllowance();
|
|
|
|
|
|
|
|
_aaveServices.updateTask(
|
|
|
|
_protectionAction,
|
|
|
|
abi.encode(
|
|
|
|
_wantedHealthFactor,
|
|
|
|
_minimumHealthFactor,
|
|
|
|
address(this)
|
|
|
|
),
|
|
|
|
_isPermanent
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function _giveAllowance() internal {
|
|
|
|
address[] memory aTokenList = _getATokenList();
|
|
|
|
for (uint256 i = 0; i < aTokenList.length; i++) {
|
|
|
|
if (
|
|
|
|
!(IERC20(aTokenList[i]).allowance(
|
|
|
|
address(this),
|
|
|
|
_protectionAction
|
|
|
|
) == type(uint256).max)
|
|
|
|
) {
|
|
|
|
IERC20(aTokenList[i]).approve(
|
|
|
|
_protectionAction,
|
|
|
|
type(uint256).max
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function _revokeAllowance() internal {
|
|
|
|
address[] memory aTokenList = _getATokenList();
|
|
|
|
for (uint256 i = 0; i < aTokenList.length; i++) {
|
|
|
|
if (
|
|
|
|
!(IERC20(aTokenList[i]).allowance(
|
|
|
|
address(this),
|
|
|
|
_protectionAction
|
|
|
|
) == 0)
|
|
|
|
) {
|
|
|
|
IERC20(aTokenList[i]).approve(_protectionAction, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function _getATokenList()
|
|
|
|
internal
|
|
|
|
view
|
|
|
|
returns (address[] memory aTokenList)
|
|
|
|
{
|
|
|
|
address[] memory underlyingsList = _lendingPool.getReservesList();
|
|
|
|
aTokenList = new address[](underlyingsList.length);
|
|
|
|
for (uint256 i = 0; i < underlyingsList.length; i++) {
|
|
|
|
aTokenList[i] = (_lendingPool.getReserveData(underlyingsList[i]))
|
|
|
|
.aTokenAddress;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function _dsaHasProtection() internal view returns (bool) {
|
|
|
|
return
|
|
|
|
_aaveServices.taskByUsersAction(address(this), _protectionAction) !=
|
|
|
|
bytes32(0);
|
|
|
|
}
|
2021-08-18 19:30:56 +00:00
|
|
|
}
|