mirror of
				https://github.com/Instadapp/dsa-connectors.git
				synced 2024-07-29 22:37:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| pragma solidity ^0.7.0;
 | |
| 
 | |
| import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
 | |
| import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
 | |
| 
 | |
| import { DSMath } from "../../common/math.sol";
 | |
| import { Basic } from "../../common/basic.sol";
 | |
| import { InstaPoolFeeInterface, LiqudityInterface } from "./interface.sol";
 | |
| 
 | |
| abstract contract Helpers is DSMath, Basic {
 | |
| 
 | |
|     using SafeERC20 for IERC20;
 | |
| 
 | |
|     /**
 | |
|      * @dev Instapool Helper
 | |
|      */
 | |
|     LiqudityInterface internal constant instaPool = LiqudityInterface(0x06cB7C24990cBE6b9F99982f975f9147c000fec6);
 | |
| 
 | |
|     /**
 | |
|      * @dev Instapool Fee
 | |
|      */
 | |
|     InstaPoolFeeInterface internal constant instaPoolFee = InstaPoolFeeInterface(0xAaA91046C1D1a210017e36394C83bD5070dadDa5);
 | |
| 
 | |
|     function _transfer(address payable to, IERC20 token, uint _amt) internal {
 | |
|         address(token) == ethAddr ?
 | |
|             to.transfer(_amt) :
 | |
|             token.safeTransfer(to, _amt);
 | |
|     }
 | |
| 
 | |
|     function _getBalance(IERC20 token) internal view returns (uint256) {
 | |
|         return address(token) == ethAddr ?
 | |
|             address(this).balance :
 | |
|             token.balanceOf(address(this));
 | |
|     }
 | |
| 
 | |
|     function calculateTotalFeeAmt(IERC20 token, uint amt) internal view returns (uint totalAmt) {
 | |
|         uint fee = instaPoolFee.fee();
 | |
|         uint flashAmt = instaPool.borrowedToken(address(token));
 | |
|         if (fee == 0) {
 | |
|             totalAmt = amt;
 | |
|         } else {
 | |
|             uint feeAmt = wmul(flashAmt, fee);
 | |
|             totalAmt = add(amt, feeAmt);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function calculateFeeAmt(IERC20 token, uint amt) internal view returns (address feeCollector, uint feeAmt) {
 | |
|         uint fee = instaPoolFee.fee();
 | |
|         feeCollector = instaPoolFee.feeCollector();
 | |
|         if (fee == 0) {
 | |
|             feeAmt = 0;
 | |
|         } else {
 | |
|             feeAmt = wmul(amt, fee);
 | |
|             uint totalAmt = add(amt, feeAmt);
 | |
| 
 | |
|             uint totalBal = _getBalance(token);
 | |
|             require(totalBal >= totalAmt - 10, "Not-enough-balance");
 | |
|             feeAmt = totalBal > totalAmt ? feeAmt : sub(totalBal, amt);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function calculateFeeAmtOrigin(IERC20 token, uint amt)
 | |
|         internal
 | |
|         view
 | |
|     returns (
 | |
|         address feeCollector,
 | |
|         uint poolFeeAmt,
 | |
|         uint originFee
 | |
|     )
 | |
|     {
 | |
|         uint feeAmt;
 | |
|         (feeCollector, feeAmt) = calculateFeeAmt(token, amt);
 | |
|         if (feeAmt == 0) {
 | |
|             poolFeeAmt = 0;
 | |
|             originFee = 0;
 | |
|         } else {
 | |
|             originFee = wmul(feeAmt, 20 * 10 ** 16); // 20%
 | |
|             poolFeeAmt = sub(feeAmt, originFee);
 | |
|         }
 | |
|     }
 | |
| }
 | 
