aboutsummaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol29
1 files changed, 29 insertions, 0 deletions
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol
index 3e70d1b60..c4aa2abb5 100644
--- a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol
@@ -107,6 +107,7 @@ contract LibMath is
if (target == 0 || numerator == 0) {
return false;
}
+
// Otherwise, we want the relative rounding error to be strictly
// less than 0.1%.
// The relative error is `remainder / numerator * target`.
@@ -120,4 +121,32 @@ contract LibMath is
isError = safeMul(1000, remainder) >= safeMul(numerator, target);
return isError;
}
+
+ /// @dev Checks if rounding error > 0.1%.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to multiply with numerator/denominator.
+ /// @return Rounding error is present.
+ function isRoundingErrorCeil(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ internal
+ pure
+ returns (bool isError)
+ {
+ require(denominator > 0, "DIVISION_BY_ZERO");
+
+ if (target == 0 || numerator == 0) {
+ return false;
+ }
+ uint256 remainder = mulmod(target, numerator, denominator);
+ if (remainder == 0) {
+ return false;
+ }
+ remainder = safeSub(denominator, remainder);
+ isError = safeMul(1000, remainder) >= safeMul(numerator, target);
+ return isError;
+ }
}