diff --git a/src/libraries/FullMath.sol b/src/libraries/FullMath.sol index 42f7747..2e78f62 100644 --- a/src/libraries/FullMath.sol +++ b/src/libraries/FullMath.sol @@ -3,10 +3,12 @@ pragma solidity ^0.8.20; library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { - uint256 mm = mulmod(x, y, type(uint256).max); - l = x * y; - h = mm - l; - if (mm < l) h -= 1; + unchecked { + uint256 mm = mulmod(x, y, type(uint256).max); + l = x * y; + h = mm - l; + if (mm < l) h -= 1; + } } function fullDiv( @@ -14,20 +16,22 @@ library FullMath { uint256 h, uint256 d ) private pure returns (uint256) { - uint256 pow2 = d & (~d + 1); - d /= pow2; - l /= pow2; - l += h * ((~pow2 + 1) / pow2 + 1); - uint256 r = 1; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - r *= 2 - d * r; - return l * r; + unchecked { + uint256 pow2 = d & (~d + 1); + d /= pow2; + l /= pow2; + l += h * ((~pow2 + 1) / pow2 + 1); + uint256 r = 1; + r *= 2 - d * r; + r *= 2 - d * r; + r *= 2 - d * r; + r *= 2 - d * r; + r *= 2 - d * r; + r *= 2 - d * r; + r *= 2 - d * r; + r *= 2 - d * r; + return l * r; + } } function mulDiv( @@ -35,15 +39,19 @@ library FullMath { uint256 y, uint256 d ) internal pure returns (uint256) { - (uint256 l, uint256 h) = fullMul(x, y); + if (d == 0) revert("FullMath: DIVISION_BY_ZERO"); - uint256 mm = mulmod(x, y, d); - if (mm > l) h -= 1; - l -= mm; + unchecked { + (uint256 l, uint256 h) = fullMul(x, y); + uint256 mm = mulmod(x, y, d); - if (h == 0) return l / d; + if (mm > l) h -= 1; + l -= mm; - require(h < d, "FullMath: FULLDIV_OVERFLOW"); - return fullDiv(l, h, d); + if (h == 0) return l / d; + + require(h < d, "FullMath: FULLDIV_OVERFLOW"); + return fullDiv(l, h, d); + } } }