pragma solidity ^0.5.0; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../Invoker.sol"; import "../KToken.sol"; contract KollateralInvokable { using SafeMath for uint256; function currentKTokenAddress() internal view returns (address) { return Invoker(msg.sender).currentKTokenAddress(); } function currentTokenAddress() internal view returns (address) { return Invoker(msg.sender).currentTokenAddress(); } function currentTokenAmount() internal view returns (uint256) { return Invoker(msg.sender).currentTokenAmount(); } function currentExpectedBalance() internal view returns (uint256) { return Invoker(msg.sender).currentExpectedBalance(); } function currentKTokenTotalReserve() internal view returns (uint256) { return KToken(currentKTokenAddress()).totalReserve(); } function currentOutstandingTokenAmount() internal view returns (uint256) { return currentExpectedBalance().sub(currentKTokenTotalReserve()); } function isKTokenKEther() internal view returns (bool) { return KToken(currentKTokenAddress()).isKEther(); } function repay() internal returns (bool) { return repayAmount(currentOutstandingTokenAmount()); } function repayAmount(uint256 amount) internal returns (bool) { if (isKTokenKEther()) { address payable kEtherAddress = address(uint160(currentKTokenAddress())); require(address(this).balance >= amount, "KollateralInvokable: not enough ether balance"); kEtherAddress.transfer(amount); return true; } else { IERC20 token = IERC20(currentTokenAddress()); require(token.balanceOf(address(this)) >= amount, "KollateralInvokable: not enough token balance"); return token.transfer(currentKTokenAddress(), amount); } } }