Refactored code to use PercentageMath, fixed PercentageMath bug

This commit is contained in:
The3D 2020-07-27 13:47:48 +02:00
parent 4baf17d9e6
commit 11e06e2e92
5 changed files with 21 additions and 19 deletions

View File

@ -9,6 +9,7 @@ import '@openzeppelin/contracts/utils/ReentrancyGuard.sol';
import '../libraries/openzeppelin-upgradeability/VersionedInitializable.sol'; import '../libraries/openzeppelin-upgradeability/VersionedInitializable.sol';
import '../interfaces/IExchangeAdapter.sol'; import '../interfaces/IExchangeAdapter.sol';
import '../libraries/UniversalERC20.sol'; import '../libraries/UniversalERC20.sol';
import {PercentageMath} from '../libraries/PercentageMath.sol';
/// @title TokenDistributor /// @title TokenDistributor
/// @author Aave /// @author Aave
@ -22,6 +23,7 @@ import '../libraries/UniversalERC20.sol';
/// and burn it (sending to address(0) the tokenToBurn) /// and burn it (sending to address(0) the tokenToBurn)
contract TokenDistributor is ReentrancyGuard, VersionedInitializable { contract TokenDistributor is ReentrancyGuard, VersionedInitializable {
using SafeMath for uint256; using SafeMath for uint256;
using PercentageMath for uint256;
using UniversalERC20 for IERC20; using UniversalERC20 for IERC20;
struct Distribution { struct Distribution {
@ -126,10 +128,9 @@ contract TokenDistributor is ReentrancyGuard, VersionedInitializable {
public public
{ {
for (uint256 i = 0; i < _tokens.length; i++) { for (uint256 i = 0; i < _tokens.length; i++) {
uint256 _amountToDistribute = _tokens[i] uint256 _amountToDistribute = _tokens[i].universalBalanceOf(address(this)).percentMul(
.universalBalanceOf(address(this)) _percentages[i]
.mul(_percentages[i]) );
.div(100);
if (_amountToDistribute <= 0) { if (_amountToDistribute <= 0) {
continue; continue;

View File

@ -20,6 +20,7 @@ import '../libraries/UserLogic.sol';
import '../libraries/ReserveLogic.sol'; import '../libraries/ReserveLogic.sol';
import '../libraries/UniversalERC20.sol'; import '../libraries/UniversalERC20.sol';
import '../libraries/ReserveConfiguration.sol'; import '../libraries/ReserveConfiguration.sol';
import {PercentageMath} from '../libraries/PercentageMath.sol';
/** /**
* @title LendingPoolLiquidationManager contract * @title LendingPoolLiquidationManager contract
@ -30,6 +31,7 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
using UniversalERC20 for IERC20; using UniversalERC20 for IERC20;
using SafeMath for uint256; using SafeMath for uint256;
using WadRayMath for uint256; using WadRayMath for uint256;
using PercentageMath for uint256;
using Address for address; using Address for address;
using ReserveLogic for ReserveLogic.ReserveData; using ReserveLogic for ReserveLogic.ReserveData;
using UserLogic for UserLogic.UserReserveData; using UserLogic for UserLogic.UserReserveData;
@ -177,11 +179,9 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
} }
//all clear - calculate the max principal amount that can be liquidated //all clear - calculate the max principal amount that can be liquidated
vars.maxPrincipalAmountToLiquidate = vars vars.maxPrincipalAmountToLiquidate = vars.userStableDebt.add(vars.userVariableDebt).percentMul(
.userStableDebt LIQUIDATION_CLOSE_FACTOR_PERCENT
.add(vars.userVariableDebt) );
.mul(LIQUIDATION_CLOSE_FACTOR_PERCENT)
.div(100);
vars.actualAmountToLiquidate = _purchaseAmount > vars.maxPrincipalAmountToLiquidate vars.actualAmountToLiquidate = _purchaseAmount > vars.maxPrincipalAmountToLiquidate
? vars.maxPrincipalAmountToLiquidate ? vars.maxPrincipalAmountToLiquidate
@ -331,8 +331,7 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
.mul(_purchaseAmount) .mul(_purchaseAmount)
.mul(10**vars.collateralDecimals) .mul(10**vars.collateralDecimals)
.div(vars.collateralPrice.mul(10**vars.principalDecimals)) .div(vars.collateralPrice.mul(10**vars.principalDecimals))
.mul(vars.liquidationBonus) .percentMul(vars.liquidationBonus);
.div(100);
if (vars.maxAmountCollateralToLiquidate > _userCollateralBalance) { if (vars.maxAmountCollateralToLiquidate > _userCollateralBalance) {
collateralAmount = _userCollateralBalance; collateralAmount = _userCollateralBalance;
@ -341,8 +340,7 @@ contract LendingPoolLiquidationManager is ReentrancyGuard, VersionedInitializabl
.mul(collateralAmount) .mul(collateralAmount)
.mul(10**vars.principalDecimals) .mul(10**vars.principalDecimals)
.div(vars.principalCurrencyPrice.mul(10**vars.collateralDecimals)) .div(vars.principalCurrencyPrice.mul(10**vars.collateralDecimals))
.mul(100) .percentDiv(vars.liquidationBonus);
.div(vars.liquidationBonus);
} else { } else {
collateralAmount = vars.maxAmountCollateralToLiquidate; collateralAmount = vars.maxAmountCollateralToLiquidate;
principalAmountNeeded = _purchaseAmount; principalAmountNeeded = _purchaseAmount;

View File

@ -8,7 +8,7 @@ import {ReserveLogic} from './ReserveLogic.sol';
import {ReserveConfiguration} from './ReserveConfiguration.sol'; import {ReserveConfiguration} from './ReserveConfiguration.sol';
import {UserLogic} from './UserLogic.sol'; import {UserLogic} from './UserLogic.sol';
import {WadRayMath} from './WadRayMath.sol'; import {WadRayMath} from './WadRayMath.sol';
import {PercentageMath} from './PercentageMath.sol';
import '../interfaces/IPriceOracleGetter.sol'; import '../interfaces/IPriceOracleGetter.sol';
import {IFeeProvider} from '../interfaces/IFeeProvider.sol'; import {IFeeProvider} from '../interfaces/IFeeProvider.sol';
import '@nomiclabs/buidler/console.sol'; import '@nomiclabs/buidler/console.sol';
@ -23,6 +23,7 @@ library GenericLogic {
using UserLogic for UserLogic.UserReserveData; using UserLogic for UserLogic.UserReserveData;
using SafeMath for uint256; using SafeMath for uint256;
using WadRayMath for uint256; using WadRayMath for uint256;
using PercentageMath for uint256;
using ReserveConfiguration for ReserveConfiguration.Map; using ReserveConfiguration for ReserveConfiguration.Map;
uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18; uint256 public constant HEALTH_FACTOR_LIQUIDATION_THRESHOLD = 1e18;
@ -237,7 +238,7 @@ library GenericLogic {
) internal view returns (uint256) { ) internal view returns (uint256) {
if (borrowBalanceETH == 0) return uint256(-1); if (borrowBalanceETH == 0) return uint256(-1);
return (collateralBalanceETH.mul(liquidationThreshold).div(100)).wadDiv(borrowBalanceETH); return (collateralBalanceETH.percentMul(liquidationThreshold)).wadDiv(borrowBalanceETH);
} }
/** /**
@ -254,7 +255,7 @@ library GenericLogic {
uint256 borrowBalanceETH, uint256 borrowBalanceETH,
uint256 ltv uint256 ltv
) external view returns (uint256) { ) external view returns (uint256) {
uint256 availableBorrowsETH = collateralBalanceETH.mul(ltv).div(100); //ltv is in percentage uint256 availableBorrowsETH = collateralBalanceETH.percentMul(ltv); //ltv is in percentage
if (availableBorrowsETH < borrowBalanceETH) { if (availableBorrowsETH < borrowBalanceETH) {
return 0; return 0;

View File

@ -23,6 +23,6 @@ library PercentageMath {
function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256) { function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256) {
uint256 halfPercentage = percentage / 2; uint256 halfPercentage = percentage / 2;
return halfPercentage.add(value.mul(PERCENTAGE_FACTOR)).div(halfPercentage); return halfPercentage.add(value.mul(PERCENTAGE_FACTOR)).div(percentage);
} }
} }

View File

@ -8,6 +8,7 @@ import {ReserveLogic} from './ReserveLogic.sol';
import {UserLogic} from './UserLogic.sol'; import {UserLogic} from './UserLogic.sol';
import {GenericLogic} from './GenericLogic.sol'; import {GenericLogic} from './GenericLogic.sol';
import {WadRayMath} from './WadRayMath.sol'; import {WadRayMath} from './WadRayMath.sol';
import {PercentageMath} from './PercentageMath.sol';
import {UniversalERC20} from './UniversalERC20.sol'; import {UniversalERC20} from './UniversalERC20.sol';
import {ReserveConfiguration} from './ReserveConfiguration.sol'; import {ReserveConfiguration} from './ReserveConfiguration.sol';
import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol'; import {IPriceOracleGetter} from '../interfaces/IPriceOracleGetter.sol';
@ -24,6 +25,7 @@ library ValidationLogic {
using UserLogic for UserLogic.UserReserveData; using UserLogic for UserLogic.UserReserveData;
using SafeMath for uint256; using SafeMath for uint256;
using WadRayMath for uint256; using WadRayMath for uint256;
using PercentageMath for uint256;
using UniversalERC20 for IERC20; using UniversalERC20 for IERC20;
using ReserveConfiguration for ReserveConfiguration.Map; using ReserveConfiguration for ReserveConfiguration.Map;
@ -161,7 +163,7 @@ library ValidationLogic {
require(vars.healthFactor > GenericLogic.HEALTH_FACTOR_LIQUIDATION_THRESHOLD, '8'); require(vars.healthFactor > GenericLogic.HEALTH_FACTOR_LIQUIDATION_THRESHOLD, '8');
//add the current already borrowed amount to the amount requested to calculate the total collateral needed. //add the current already borrowed amount to the amount requested to calculate the total collateral needed.
vars.amountOfCollateralNeededETH = vars.userBorrowBalanceETH.add(_amountInETH).mul(100).div( vars.amountOfCollateralNeededETH = vars.userBorrowBalanceETH.add(_amountInETH).percentDiv(
vars.currentLtv vars.currentLtv
); //LTV is calculated in percentage ); //LTV is calculated in percentage
@ -193,7 +195,7 @@ library ValidationLogic {
//calculate the max available loan size in stable rate mode as a percentage of the //calculate the max available loan size in stable rate mode as a percentage of the
//available liquidity //available liquidity
uint256 maxLoanSizeStable = vars.availableLiquidity.mul(_maxStableLoanPercent).div(100); uint256 maxLoanSizeStable = vars.availableLiquidity.percentMul(_maxStableLoanPercent);
require(_amount <= maxLoanSizeStable, '13'); require(_amount <= maxLoanSizeStable, '13');
} }