From d83d3c1e96fa6a8e88ceee63ec441b7c857eef44 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 23 Aug 2026 11:44:00 +0200 Subject: [PATCH] feat(libraries): add fixed-point and low-level math primitives --- src/libraries/FixedPoint128.sol | 7 +++++++ src/libraries/FixedPoint96.sol | 8 ++++++++ src/libraries/SafeCast.sol | 22 ++++++++++++++++++++++ src/libraries/UnsafeMath.sol | 11 +++++++++++ 4 files changed, 48 insertions(+) create mode 100644 src/libraries/FixedPoint128.sol create mode 100644 src/libraries/FixedPoint96.sol create mode 100644 src/libraries/SafeCast.sol create mode 100644 src/libraries/UnsafeMath.sol diff --git a/src/libraries/FixedPoint128.sol b/src/libraries/FixedPoint128.sol new file mode 100644 index 0000000..4688b20 --- /dev/null +++ b/src/libraries/FixedPoint128.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +/// @title Q128.128 fixed point constant used by the fee-growth accounting. +library FixedPoint128 { + uint256 internal constant q128 = 0x100000000000000000000000000000000; +} diff --git a/src/libraries/FixedPoint96.sol b/src/libraries/FixedPoint96.sol new file mode 100644 index 0000000..1cd4975 --- /dev/null +++ b/src/libraries/FixedPoint96.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +/// @title Q64.96 fixed point constants used by the sqrt-price math. +library FixedPoint96 { + uint8 internal constant resolution = 96; + uint256 internal constant q96 = 0x1000000000000000000000000; +} diff --git a/src/libraries/SafeCast.sol b/src/libraries/SafeCast.sol new file mode 100644 index 0000000..30cde48 --- /dev/null +++ b/src/libraries/SafeCast.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +/// @title Checked narrowing casts between integer widths. +library SafeCast { + function toUint160(uint256 y) internal pure returns (uint160 z) { + require((z = uint160(y)) == y, "SafeCast: U160"); + } + + function toUint128(uint256 y) internal pure returns (uint128 z) { + require((z = uint128(y)) == y, "SafeCast: U128"); + } + + function toInt128(int256 y) internal pure returns (int128 z) { + require((z = int128(y)) == y, "SafeCast: I128"); + } + + function toInt256(uint256 y) internal pure returns (int256 z) { + require(y < 2 ** 255, "SafeCast: I256"); + z = int256(y); + } +} diff --git a/src/libraries/UnsafeMath.sol b/src/libraries/UnsafeMath.sol new file mode 100644 index 0000000..37bf8a0 --- /dev/null +++ b/src/libraries/UnsafeMath.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.36; + +/// @title Rounding-up integer division that trusts its non-zero denominator. +library UnsafeMath { + function divRoundingUp(uint256 x, uint256 y) internal pure returns (uint256 z) { + assembly { + z := add(div(x, y), gt(mod(x, y), 0)) + } + } +}