add doc strings to UniversalERC20, delete remove values there, fixes from MR comments

This commit is contained in:
andyk 2020-06-03 14:02:18 +03:00
parent 268e749a6d
commit e31d5b9bee
4 changed files with 62 additions and 20 deletions

View File

@ -38,9 +38,10 @@ contract OneSplitAdapter is IExchangeAdapter {
/// @param _tokens the list of token addresses to approve /// @param _tokens the list of token addresses to approve
function approveExchange(IERC20[] calldata _tokens) external override { function approveExchange(IERC20[] calldata _tokens) external override {
for (uint256 i = 0; i < _tokens.length; i++) { for (uint256 i = 0; i < _tokens.length; i++) {
if (!_tokens[i].isETH()) { _tokens[i].universalApprove(
_tokens[i].universalApprove(0x1814222fa8c8c1C1bf380e3BBFBd9De8657Da476, UintConstants.maxUintMinus1()); 0x1814222fa8c8c1C1bf380e3BBFBd9De8657Da476,
} UintConstants.maxUintMinus1()
);
} }
} }

View File

@ -21,17 +21,9 @@ abstract contract FlashLoanReceiverBase is IFlashLoanReceiver {
receive() external payable {} receive() external payable {}
function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal { function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal {
IERC20(_reserve).universalTransfer(
address payable core = addressesProvider.getLendingPoolCore(); addressesProvider.getLendingPoolCore(), // lending-pool core address
_amount
transferInternal(core, _reserve, _amount); );
}
function transferInternal(address payable _destination, address _reserve, uint256 _amount) internal {
IERC20(_reserve).universalTransfer(_destination, _amount);
}
function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) {
return IERC20(_reserve).universalBalanceOf(_target);
} }
} }

View File

@ -4,6 +4,12 @@ import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
/**
* @title UniversalERC20 library
* @author Aave inspired by @k06a (Anton Bukov)
* @note original version: https://github.com/CryptoManiacsZone/1inchProtocol/blob/master/contracts/UniversalERC20.sol
* @dev Provides unified interface for ERC20 and native ETH operations
**/
library UniversalERC20 { library UniversalERC20 {
using SafeMath for uint256; using SafeMath for uint256;
using SafeERC20 for IERC20; using SafeERC20 for IERC20;
@ -11,17 +17,24 @@ library UniversalERC20 {
IERC20 private constant ZERO_ADDRESS = IERC20( IERC20 private constant ZERO_ADDRESS = IERC20(
0x0000000000000000000000000000000000000000 0x0000000000000000000000000000000000000000
); );
// @notice mock address of ETH
IERC20 private constant ETH_ADDRESS = IERC20( IERC20 private constant ETH_ADDRESS = IERC20(
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
); );
/**
* @dev Moves amount of asset from caller to recipient
* @param token underlying asset address
* @param to asset recipient
* @param amount to move
**/
function universalTransfer( function universalTransfer(
IERC20 token, IERC20 token,
address to, address to,
uint256 amount uint256 amount
) internal returns (bool) { ) internal {
if (amount == 0) { if (amount == 0) {
return true; return;
} }
if (isETH(token)) { if (isETH(token)) {
@ -30,9 +43,16 @@ library UniversalERC20 {
} else { } else {
token.safeTransfer(to, amount); token.safeTransfer(to, amount);
} }
return true;
} }
/**
* @dev Moves amount of asset from sender to recipient
* @param token underlying asset address
* @param from asset sender
* @param to asset recipient
* @param amount to move
* @param returnExcess if true returns exceeded amount to sender
**/
function universalTransferFrom( function universalTransferFrom(
IERC20 token, IERC20 token,
address from, address from,
@ -67,6 +87,11 @@ library UniversalERC20 {
} }
} }
/**
* @dev Moves amount of asset from caller to this contract
* @param token underlying asset address
* @param amount to move
**/
function universalTransferFromSenderToThis(IERC20 token, uint256 amount) function universalTransferFromSenderToThis(IERC20 token, uint256 amount)
internal internal
{ {
@ -88,6 +113,12 @@ library UniversalERC20 {
} }
} }
/**
* @dev Sets the allowance over the caller's tokens to recipient address.
* @param token underlying asset address
* @param to allowance recipient
* @param amount of the allowance
**/
function universalApprove( function universalApprove(
IERC20 token, IERC20 token,
address to, address to,
@ -100,7 +131,12 @@ library UniversalERC20 {
token.safeApprove(to, amount); token.safeApprove(to, amount);
} }
} }
/**
* @dev Returns the amount of underlying asset owned by address
* @param token underlying asset address
* @param who address to check
* @returns balance of the who address
**/
function universalBalanceOf(IERC20 token, address who) function universalBalanceOf(IERC20 token, address who)
internal internal
view view
@ -113,6 +149,11 @@ library UniversalERC20 {
} }
} }
/**
* @dev Returns decimals of underlying asset
* @param token underlying asset address
* @returns decimals
**/
function universalDecimals(IERC20 token) internal view returns (uint256) { function universalDecimals(IERC20 token) internal view returns (uint256) {
if (isETH(token)) { if (isETH(token)) {
return 18; return 18;
@ -130,6 +171,11 @@ library UniversalERC20 {
return (success && data.length > 0) ? abi.decode(data, (uint256)) : 18; return (success && data.length > 0) ? abi.decode(data, (uint256)) : 18;
} }
/**
* @dev Checks is underlying asset ETH or not
* @param token underlying asset address
* @returns boolean
**/
function isETH(IERC20 token) internal pure returns (bool) { function isETH(IERC20 token) internal pure returns (bool) {
return (address(token) == address(ZERO_ADDRESS) || return (address(token) == address(ZERO_ADDRESS) ||
address(token) == address(ETH_ADDRESS)); address(token) == address(ETH_ADDRESS));

View File

@ -36,7 +36,10 @@ contract MockFlashLoanReceiver is FlashLoanReceiverBase {
//check the contract has the specified balance //check the contract has the specified balance
require(_amount <= getBalanceInternal(address(this), _reserve), "Invalid balance for the contract"); require(
_amount <= IERC20(_reserve).universalBalanceOf(address(this)),
"Invalid balance for the contract"
);
if(failExecution) { if(failExecution) {
emit ExecutedWithFail(_reserve, _amount, _fee); emit ExecutedWithFail(_reserve, _amount, _fee);