pragma solidity ^0.5.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract IKToken is IERC20 { event Mint(address minter, uint256 tokenAmount, uint256 kTokenAmount); event Redeem(address redeemer, uint256 tokenAmount, uint256 kTokenAmount); /* * PUBLIC STATE CHANGING */ function redeem(uint256 kTokenAmount) external returns (bool); function redeemUnderlying(uint256 tokenAmount) external returns (bool); function mintInternal(uint256 amount) internal returns (bool); function redeemInternal(uint256 tokenAmount, uint256 kTokenAmount) internal returns (bool); /* * INVOKER STATE-CHANGING HOOKS */ function transferUnderlying(address to, uint256 amount) external returns (bool); function transferUnderlyingInternal(address to, uint256 amount) internal returns (bool); /* Lock automatically clears after block in case of any unintended locking attacks */ function lock() external; function unlock() external; /* Adds unlimited allowance functionality to standard transferFrom implementation */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool); /* * VIEWS */ function tokenAmountToKTokenAmount(uint256 tokenAmount, bool ceiling) public view returns (uint256); function tokenAmountToKTokenAmountInternal(uint256 tokenAmount, bool ceiling, bool alreadyDeposited) internal view returns (uint256); function kTokenAmountToTokenAmount(uint256 kTokenAmount) public view returns (uint256); function isKEther() public view returns (bool); function totalReserve() public view returns (uint256); function balanceOfUnderlying(address owner) public view returns (uint256); function tokenAddress() external view returns (address); function invokerAddress() external view returns (address); /* * ADMIN FUNCTIONS */ /* KToken ownership will be relinquished before public launch. */ function setInvokerAddress(address invokerAddress) external; }