// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.30; import {ABDKMath64x64} from "../lib/abdk-libraries-solidity/ABDKMath64x64.sol"; abstract contract PartyPoolHelpers { using ABDKMath64x64 for int128; /// @notice Ceiling fee helper: computes ceil(x * feePpm / 1_000_000) /// @dev Internal helper; public-facing functions use this to ensure fees round up in favor of pool. function _ceilFee(uint256 x, uint256 feePpm) internal pure returns (uint256) { if (feePpm == 0) return 0; // ceil division: (num + denom - 1) / denom return (x * feePpm + 1_000_000 - 1) / 1_000_000; } /// @notice Compute fee and net amounts for a gross input (fee rounded up to favor the pool). /// @param gross total gross input /// @param feePpm fee in ppm to apply /// @return feeUint fee taken (uint) and netUint remaining for protocol use (uint) function _computeFee(uint256 gross, uint256 feePpm) internal pure returns (uint256 feeUint, uint256 netUint) { if (feePpm == 0) { return (0, gross); } feeUint = _ceilFee(gross, feePpm); netUint = gross - feeUint; } /// @notice Helper to compute size metric (sum of all asset quantities) from internal balances /// @dev Returns the sum of all provided qInternal entries as a Q64.64 value. function _computeSizeMetric(int128[] memory qInternal) internal pure returns (int128) { int128 total = int128(0); for (uint i = 0; i < qInternal.length; ) { total = total.add(qInternal[i]); unchecked { i++; } } return total; } }