@0x/contracts-exchange-libs: Remove unecessary checks for zero

denominator.
`@0x/contracts-exchange-libs`: `LibMath` tests from `@0x/contracts-exchange` into this package.
`@0x/contracts-exchange-libs`: Adjust logic in reference functions to be
closer to solidity implementation.
This commit is contained in:
Lawrence Forman
2019-08-01 15:13:40 -04:00
parent 4600a656d1
commit f791cd3a37
5 changed files with 161 additions and 32 deletions

View File

@@ -21,8 +21,11 @@ export function isRoundingErrorFloor(
if (numerator.eq(0) || target.eq(0)) {
return false;
}
const remainder = numerator.multipliedBy(target).mod(denominator);
return safeMul(new BigNumber(1000), remainder).gte(safeMul(numerator, target));
const remainder = numerator.times(target).mod(denominator);
// Need to do this separately because solidity evaluates RHS of the comparison expression first.
const rhs = safeMul(numerator, target);
const lhs = safeMul(new BigNumber(1000), remainder);
return lhs.gte(rhs);
}
export function isRoundingErrorCeil(
@@ -36,9 +39,12 @@ export function isRoundingErrorCeil(
if (numerator.eq(0) || target.eq(0)) {
return false;
}
let remainder = numerator.multipliedBy(target).mod(denominator);
let remainder = numerator.times(target).mod(denominator);
remainder = safeSub(denominator, remainder).mod(denominator);
return safeMul(new BigNumber(1000), remainder).gte(safeMul(numerator, target));
// Need to do this separately because solidity evaluates RHS of the comparison expression first.
const rhs = safeMul(numerator, target);
const lhs = safeMul(new BigNumber(1000), remainder);
return lhs.gte(rhs);
}
export function safeGetPartialAmountFloor(
@@ -46,9 +52,6 @@ export function safeGetPartialAmountFloor(
denominator: BigNumber,
target: BigNumber,
): BigNumber {
if (denominator.eq(0)) {
throw new LibMathRevertErrors.DivisionByZeroError();
}
if (isRoundingErrorFloor(numerator, denominator, target)) {
throw new LibMathRevertErrors.RoundingError(numerator, denominator, target);
}
@@ -63,9 +66,6 @@ export function safeGetPartialAmountCeil(
denominator: BigNumber,
target: BigNumber,
): BigNumber {
if (denominator.eq(0)) {
throw new LibMathRevertErrors.DivisionByZeroError();
}
if (isRoundingErrorCeil(numerator, denominator, target)) {
throw new LibMathRevertErrors.RoundingError(numerator, denominator, target);
}
@@ -83,9 +83,6 @@ export function getPartialAmountFloor(
denominator: BigNumber,
target: BigNumber,
): BigNumber {
if (denominator.eq(0)) {
throw new LibMathRevertErrors.DivisionByZeroError();
}
return safeDiv(
safeMul(numerator, target),
denominator,
@@ -97,9 +94,6 @@ export function getPartialAmountCeil(
denominator: BigNumber,
target: BigNumber,
): BigNumber {
if (denominator.eq(0)) {
throw new LibMathRevertErrors.DivisionByZeroError();
}
return safeDiv(
safeAdd(
safeMul(numerator, target),