mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| pragma solidity ^0.7.0;
 | |
| pragma experimental ABIEncoderV2;
 | |
| 
 | |
| import { protocolHelpers } from "../helpers.sol";
 | |
| 
 | |
| import {
 | |
|     // AaveV1ProviderInterface,
 | |
|     // AaveV1Interface,
 | |
|     // AaveV1CoreInterface,
 | |
|     AaveV2LendingPoolProviderInterface, 
 | |
|     AaveV2DataProviderInterface,
 | |
|     AaveV2Interface,
 | |
|     ATokenV1Interface,
 | |
|     CTokenInterface
 | |
| } from "../interfaces.sol";
 | |
| 
 | |
| import { TokenInterface } from "../../../common/interfaces.sol";
 | |
| 
 | |
| contract AaveV2Helpers is protocolHelpers {
 | |
| 
 | |
|     struct AaveV2BorrowData {
 | |
|         AaveV2Interface aave;
 | |
|         uint length;
 | |
|         uint fee;
 | |
|         Protocol target;
 | |
|         TokenInterface[] tokens;
 | |
|         CTokenInterface[] ctokens;
 | |
|         uint[] amts;
 | |
|         uint[] rateModes;
 | |
|     }
 | |
| 
 | |
|     struct AaveV2PaybackData {
 | |
|         AaveV2Interface aave;
 | |
|         AaveV2DataProviderInterface aaveData;
 | |
|         uint length;
 | |
|         TokenInterface[] tokens;
 | |
|         uint[] amts;
 | |
|         uint[] rateModes;
 | |
|     }
 | |
| 
 | |
|     struct AaveV2WithdrawData {
 | |
|         AaveV2Interface aave;
 | |
|         AaveV2DataProviderInterface aaveData;
 | |
|         uint length;
 | |
|         TokenInterface[] tokens;
 | |
|         uint[] amts;
 | |
|     }
 | |
| 
 | |
|     function _aaveV2BorrowOne(
 | |
|         AaveV2Interface aave,
 | |
|         uint fee,
 | |
|         Protocol target,
 | |
|         TokenInterface token,
 | |
|         CTokenInterface ctoken,
 | |
|         uint amt,
 | |
|         uint rateMode
 | |
|     ) internal returns (uint) {
 | |
|         if (amt > 0) {
 | |
|             bool isEth = address(token) == wethAddr;
 | |
|             
 | |
|             address _token = isEth ? ethAddr : address(token);
 | |
| 
 | |
|             if (amt == uint(-1)) {
 | |
|                 amt = getMaxBorrow(target, _token, ctoken, rateMode);
 | |
|             }
 | |
| 
 | |
|             (uint feeAmt, uint _amt) = calculateFee(amt, fee, true);
 | |
| 
 | |
|             aave.borrow(address(token), _amt, rateMode, getReferralCode, address(this));
 | |
|             convertWethToEth(isEth, token, amt);
 | |
| 
 | |
|             transferFees(_token, feeAmt);
 | |
|         }
 | |
|         return amt;
 | |
|     }
 | |
| 
 | |
|     function _aaveV2Borrow(
 | |
|         AaveV2BorrowData memory data
 | |
|     ) internal returns (uint[] memory) {
 | |
|         uint[] memory finalAmts = new uint[](data.length);
 | |
|         for (uint i = 0; i < data.length; i++) {
 | |
|             finalAmts[i] = _aaveV2BorrowOne(
 | |
|                 data.aave,
 | |
|                 data.fee,
 | |
|                 data.target,
 | |
|                 data.tokens[i],
 | |
|                 data.ctokens[i],
 | |
|                 data.amts[i],
 | |
|                 data.rateModes[i]
 | |
|             );
 | |
|         }
 | |
|         return finalAmts;
 | |
|     }
 | |
| 
 | |
|     function _aaveV2DepositOne(
 | |
|         AaveV2Interface aave,
 | |
|         AaveV2DataProviderInterface aaveData,
 | |
|         uint fee,
 | |
|         TokenInterface token,
 | |
|         uint amt
 | |
|     ) internal {
 | |
|         if (amt > 0) {
 | |
|             (uint feeAmt, uint _amt) = calculateFee(amt, fee, false);
 | |
| 
 | |
|             bool isEth = address(token) == wethAddr;
 | |
|             address _token = isEth ? ethAddr : address(token);
 | |
| 
 | |
|             transferFees(_token, feeAmt);
 | |
| 
 | |
|             convertEthToWeth(isEth, token, _amt);
 | |
| 
 | |
|             approve(token, address(aave), _amt);
 | |
| 
 | |
|             aave.deposit(address(token), _amt, address(this), getReferralCode);
 | |
| 
 | |
|             if (!getIsCollV2(aaveData, address(token))) {
 | |
|                 aave.setUserUseReserveAsCollateral(address(token), true);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function _aaveV2Deposit(
 | |
|         AaveV2Interface aave,
 | |
|         AaveV2DataProviderInterface aaveData,
 | |
|         uint length,
 | |
|         uint fee,
 | |
|         TokenInterface[] memory tokens,
 | |
|         uint[] memory amts
 | |
|     ) internal {
 | |
|         for (uint i = 0; i < length; i++) {
 | |
|             _aaveV2DepositOne(aave, aaveData, fee, tokens[i], amts[i]);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function _aaveV2WithdrawOne(
 | |
|         AaveV2Interface aave,
 | |
|         AaveV2DataProviderInterface aaveData,
 | |
|         TokenInterface token,
 | |
|         uint amt
 | |
|     ) internal returns (uint _amt) {
 | |
|         if (amt > 0) {
 | |
|             bool isEth = address(token) == wethAddr;
 | |
| 
 | |
|             aave.withdraw(address(token), amt, address(this));
 | |
| 
 | |
|             _amt = amt == uint(-1) ? getWithdrawBalanceV2(aaveData, address(token)) : amt;
 | |
| 
 | |
|             convertWethToEth(isEth, token, _amt);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function _aaveV2Withdraw(
 | |
|         AaveV2WithdrawData memory data
 | |
|     ) internal returns (uint[] memory) {
 | |
|         uint[] memory finalAmts = new uint[](data.length);
 | |
|         for (uint i = 0; i < data.length; i++) {
 | |
|             finalAmts[i] = _aaveV2WithdrawOne(
 | |
|                 data.aave,
 | |
|                 data.aaveData,
 | |
|                 data.tokens[i],
 | |
|                 data.amts[i]
 | |
|             );
 | |
|         }
 | |
|         return finalAmts;
 | |
|     }
 | |
| 
 | |
|     function _aaveV2PaybackOne(
 | |
|         AaveV2Interface aave,
 | |
|         AaveV2DataProviderInterface aaveData,
 | |
|         TokenInterface token,
 | |
|         uint amt,
 | |
|         uint rateMode
 | |
|     ) internal returns (uint _amt) {
 | |
|         if (amt > 0) {
 | |
|             bool isEth = address(token) == wethAddr;
 | |
| 
 | |
|             _amt = amt == uint(-1) ? getPaybackBalanceV2(aaveData, address(token), rateMode) : amt;
 | |
| 
 | |
|             convertEthToWeth(isEth, token, _amt);
 | |
| 
 | |
|             approve(token, address(aave), _amt);
 | |
| 
 | |
|             aave.repay(address(token), _amt, rateMode, address(this));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function _aaveV2Payback(
 | |
|         AaveV2PaybackData memory data
 | |
|     ) internal {
 | |
|         for (uint i = 0; i < data.length; i++) {
 | |
|             _aaveV2PaybackOne(
 | |
|                 data.aave,
 | |
|                 data.aaveData,
 | |
|                 data.tokens[i],
 | |
|                 data.amts[i],
 | |
|                 data.rateModes[i]
 | |
|             );
 | |
|         }
 | |
|     }
 | |
| }
 | 
