dsa-connectors/contracts/mainnet/connectors/gelato/aave-services/protection/helpers.sol
2021-09-23 17:05:33 +02:00

113 lines
3.2 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import {
LendingPoolInterface,
AaveServicesInterface,
IERC20
} from "./interface.sol";
abstract contract Helpers {
// solhint-disable-next-line const-name-snakecase
LendingPoolInterface internal constant _lendingPool =
LendingPoolInterface(0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9);
// solhint-disable-next-line const-name-snakecase
AaveServicesInterface internal constant _aaveServices =
AaveServicesInterface(0xE3d373c78803C1d22cE96bdC43d47542835bBF42);
// solhint-disable-next-line const-name-snakecase
address internal constant _protectionAction =
0xD2579361F3C402938841774ECc1acdd51d3a4345;
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 _cancelProtection() internal {
_aaveServices.cancelTask(_protectionAction);
}
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);
}
}