aboutsummaryrefslogtreecommitdiffstats
path: root/packages/contracts/src
diff options
context:
space:
mode:
authorRemco Bloemen <remco@wicked.ventures>2018-08-24 03:54:39 +0800
committerRemco Bloemen <remco@wicked.ventures>2018-08-25 04:45:10 +0800
commite68942ee78eb19c27a96fb0b6b8b05c83b647bcc (patch)
tree892e693e89c466497419e5b2971dac6a54c3c915 /packages/contracts/src
parent4159e45aff14c04f2d799ec8a7b6e7f1a4894064 (diff)
downloaddexon-sol-tools-e68942ee78eb19c27a96fb0b6b8b05c83b647bcc.tar.gz
dexon-sol-tools-e68942ee78eb19c27a96fb0b6b8b05c83b647bcc.tar.zst
dexon-sol-tools-e68942ee78eb19c27a96fb0b6b8b05c83b647bcc.zip
Handle zero case
Diffstat (limited to 'packages/contracts/src')
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol18
1 files changed, 15 insertions, 3 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 146bb9943..758b7ec90 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
@@ -60,14 +60,26 @@ contract LibMath is
pure
returns (bool isError)
{
+ require(denominator > 0, "DIVISION_BY_ZERO");
+
// The absolute rounding error is the difference between the rounded
// value and the ideal value. The relative rounding error is the
// absolute rounding error divided by the absolute value of the
- // ideal value. We want the relative rounding error to be strictly less
- // than 0.1%.
- // Let's call `numerator * target % denominator` the remainder.
+ // ideal value. This is undefined when the ideal value is zero.
+ //
// The ideal value is `numerator * target / denominator`.
+ // Let's call `numerator * target % denominator` the remainder.
// The absolute error is `remainder / denominator`.
+ //
+ // When the ideal value is zero, we require the absolute error to
+ // be zero. Fortunately, this is always the case. The ideal value is
+ // zero iff `numerator == 0` and/or `target == 0`. In this case the
+ // remainder and absolute error are also zero.
+ 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`.
// We want the relative error less than 1 / 1000:
// remainder / numerator * denominator < 1 / 1000