diff --git a/src/libraries/SqrtPriceMath.sol b/src/libraries/SqrtPriceMath.sol index e8caf5adc..2b463be08 100644 --- a/src/libraries/SqrtPriceMath.sol +++ b/src/libraries/SqrtPriceMath.sol @@ -169,11 +169,15 @@ library SqrtPriceMath { } } - /// @notice Equivalent to: `a > b ? a - b : b - a` + /// @notice Equivalent to: `a >= b ? a - b : b - a` function absDiff(uint160 a, uint160 b) internal pure returns (uint256 res) { assembly { let diff := sub(a, b) + // mask = 0 if a >= b else -1 (all 1s) let mask := sar(255, diff) + // if a >= b, res = a - b = 0 ^ (a - b) + // if a < b, res = b - a = ~~(b - a) = ~(-(b - a) - 1) = ~(a - b - 1) = (-1) ^ (a - b - 1) + // either way, res = mask ^ (a - b + mask) res := xor(mask, add(mask, diff)) } } diff --git a/src/libraries/TickMath.sol b/src/libraries/TickMath.sol index a0c0f2180..3b0c73e74 100644 --- a/src/libraries/TickMath.sol +++ b/src/libraries/TickMath.sol @@ -51,11 +51,11 @@ library TickMath { unchecked { uint256 absTick; assembly { - // mask = 0 if tick >= 0 else -1 + // mask = 0 if tick >= 0 else -1 (all 1s) let mask := sar(255, tick) - // If tick >= 0, |tick| = tick = 0 ^ tick - // If tick < 0, |tick| = ~~|tick| = ~(-|tick| - 1) = ~(tick - 1) = (-1) ^ (tick - 1) - // Either case, |tick| = mask ^ (tick + mask) + // if tick >= 0, |tick| = tick = 0 ^ tick + // if tick < 0, |tick| = ~~|tick| = ~(-|tick| - 1) = ~(tick - 1) = (-1) ^ (tick - 1) + // either way, |tick| = mask ^ (tick + mask) absTick := xor(mask, add(mask, tick)) } // Equivalent: if (absTick > MAX_TICK) revert InvalidTick();