mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
155 lines
5.7 KiB
Solidity
155 lines
5.7 KiB
Solidity
pragma solidity ^0.7.0;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import { Basic } from "../../common/basic.sol";
|
|
|
|
|
|
import {
|
|
AaveV1ProviderInterface,
|
|
AaveV1Interface,
|
|
AaveV2LendingPoolProviderInterface,
|
|
AaveV2DataProviderInterface,
|
|
AaveV2Interface,
|
|
ComptrollerInterface,
|
|
CTokenInterface,
|
|
CompoundMappingInterface
|
|
} from "./interfaces.sol";
|
|
|
|
|
|
import { TokenInterface } from "../../common/interfaces.sol";
|
|
|
|
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
|
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
|
|
contract Helpers is Basic {
|
|
using SafeERC20 for IERC20;
|
|
|
|
enum Protocol {
|
|
Aave,
|
|
AaveV2,
|
|
Compound
|
|
}
|
|
|
|
address payable constant feeCollector = 0xb1DC62EC38E6E3857a887210C38418E4A17Da5B2;
|
|
|
|
/**
|
|
* @dev Return InstaDApp Mapping Address
|
|
*/
|
|
address constant internal getMappingAddr = 0xe7a85d0adDB972A4f0A4e57B698B37f171519e88; // CompoundMapping Address
|
|
|
|
/**
|
|
* @dev Return Compound Comptroller Address
|
|
*/
|
|
address constant internal getComptrollerAddress = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B; // CompoundMapping Address
|
|
|
|
/**
|
|
* @dev get Aave Provider
|
|
*/
|
|
AaveV1ProviderInterface constant internal getAaveProvider =
|
|
AaveV1ProviderInterface(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
|
|
|
|
/**
|
|
* @dev get Aave Lending Pool Provider
|
|
*/
|
|
AaveV2LendingPoolProviderInterface constant internal getAaveV2Provider =
|
|
AaveV2LendingPoolProviderInterface(0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5);
|
|
|
|
/**
|
|
* @dev get Aave Protocol Data Provider
|
|
*/
|
|
AaveV2DataProviderInterface constant internal getAaveV2DataProvider =
|
|
AaveV2DataProviderInterface(0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d);
|
|
|
|
/**
|
|
* @dev get Referral Code
|
|
*/
|
|
uint16 constant internal getReferralCode = 3228;
|
|
}
|
|
|
|
contract protocolHelpers is Helpers {
|
|
using SafeERC20 for IERC20;
|
|
|
|
function getWithdrawBalance(AaveV1Interface aave, address token) internal view returns (uint bal) {
|
|
(bal, , , , , , , , , ) = aave.getUserReserveData(token, address(this));
|
|
}
|
|
|
|
function getPaybackBalance(AaveV1Interface aave, address token) internal view returns (uint bal, uint fee) {
|
|
(, bal, , , , , fee, , , ) = aave.getUserReserveData(token, address(this));
|
|
}
|
|
|
|
function getTotalBorrowBalance(AaveV1Interface aave, address token) internal view returns (uint amt) {
|
|
(, uint bal, , , , , uint fee, , , ) = aave.getUserReserveData(token, address(this));
|
|
amt = add(bal, fee);
|
|
}
|
|
|
|
function getWithdrawBalanceV2(AaveV2DataProviderInterface aaveData, address token) internal view returns (uint bal) {
|
|
(bal, , , , , , , , ) = aaveData.getUserReserveData(token, address(this));
|
|
}
|
|
|
|
function getPaybackBalanceV2(AaveV2DataProviderInterface aaveData, address token, uint rateMode) internal view returns (uint bal) {
|
|
if (rateMode == 1) {
|
|
(, bal, , , , , , , ) = aaveData.getUserReserveData(token, address(this));
|
|
} else {
|
|
(, , bal, , , , , , ) = aaveData.getUserReserveData(token, address(this));
|
|
}
|
|
}
|
|
|
|
function getIsColl(AaveV1Interface aave, address token) internal view returns (bool isCol) {
|
|
(, , , , , , , , , isCol) = aave.getUserReserveData(token, address(this));
|
|
}
|
|
|
|
function getIsCollV2(AaveV2DataProviderInterface aaveData, address token) internal view returns (bool isCol) {
|
|
(, , , , , , , , isCol) = aaveData.getUserReserveData(token, address(this));
|
|
}
|
|
|
|
function getMaxBorrow(Protocol target, address token, CTokenInterface ctoken, uint rateMode) internal returns (uint amt) {
|
|
AaveV1Interface aaveV1 = AaveV1Interface(getAaveProvider.getLendingPool());
|
|
AaveV2DataProviderInterface aaveData = getAaveV2DataProvider;
|
|
|
|
if (target == Protocol.Aave) {
|
|
(uint _amt, uint _fee) = getPaybackBalance(aaveV1, token);
|
|
amt = _amt + _fee;
|
|
} else if (target == Protocol.AaveV2) {
|
|
amt = getPaybackBalanceV2(aaveData, token, rateMode);
|
|
} else if (target == Protocol.Compound) {
|
|
amt = ctoken.borrowBalanceCurrent(address(this));
|
|
}
|
|
}
|
|
|
|
function transferFees(address token, uint feeAmt) internal {
|
|
if (feeAmt > 0) {
|
|
if (token == ethAddr) {
|
|
feeCollector.transfer(feeAmt);
|
|
} else {
|
|
IERC20(token).safeTransfer(feeCollector, feeAmt);
|
|
}
|
|
}
|
|
}
|
|
|
|
function calculateFee(uint256 amount, uint256 fee, bool toAdd) internal pure returns(uint feeAmount, uint _amount){
|
|
feeAmount = wmul(amount, fee);
|
|
_amount = toAdd ? add(amount, feeAmount) : sub(amount, feeAmount);
|
|
}
|
|
|
|
function getTokenInterfaces(uint length, address[] memory tokens) internal pure returns (TokenInterface[] memory) {
|
|
TokenInterface[] memory _tokens = new TokenInterface[](length);
|
|
for (uint i = 0; i < length; i++) {
|
|
if (tokens[i] == ethAddr) {
|
|
_tokens[i] = TokenInterface(wethAddr);
|
|
} else {
|
|
_tokens[i] = TokenInterface(tokens[i]);
|
|
}
|
|
}
|
|
return _tokens;
|
|
}
|
|
|
|
function getCtokenInterfaces(uint length, string[] memory tokenIds) internal view returns (CTokenInterface[] memory) {
|
|
CTokenInterface[] memory _ctokens = new CTokenInterface[](length);
|
|
for (uint i = 0; i < length; i++) {
|
|
(address token, address cToken) = CompoundMappingInterface(getMappingAddr).getMapping(tokenIds[i]);
|
|
require(token != address(0) && cToken != address(0), "invalid token/ctoken address");
|
|
_ctokens[i] = CTokenInterface(cToken);
|
|
}
|
|
return _ctokens;
|
|
}
|
|
} |