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);
|
|
}
|
|
}
|
|
}
|