removed state.nAssets
This commit is contained in:
@@ -12,7 +12,6 @@ library LMSRStabilized {
|
||||
using ABDKMath64x64 for int128;
|
||||
|
||||
struct State {
|
||||
uint256 nAssets;
|
||||
int128 kappa; // liquidity parameter κ (64.64 fixed point)
|
||||
int128[] qInternal; // cached internal balances in 64.64 fixed-point format
|
||||
}
|
||||
@@ -28,8 +27,6 @@ library LMSRStabilized {
|
||||
int128[] memory initialQInternal,
|
||||
int128 kappa
|
||||
) internal {
|
||||
s.nAssets = initialQInternal.length;
|
||||
|
||||
// Initialize qInternal cache
|
||||
if (s.qInternal.length != initialQInternal.length) {
|
||||
s.qInternal = new int128[](initialQInternal.length);
|
||||
@@ -98,7 +95,7 @@ library LMSRStabilized {
|
||||
int128 a,
|
||||
int128 limitPrice
|
||||
) internal view returns (int128 amountIn, int128 amountOut) {
|
||||
return swapAmountsForExactInput(s.nAssets, s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||
return swapAmountsForExactInput(s.kappa, s.qInternal, i, j, a, limitPrice);
|
||||
}
|
||||
|
||||
/// @notice Pure version: Closed-form asset-i -> asset-j amountOut in 64.64 fixed-point format (fee-free kernel)
|
||||
@@ -113,7 +110,6 @@ library LMSRStabilized {
|
||||
///
|
||||
/// NOTE: Kernel is fee-free; fees should be handled by the wrapper/token layer.
|
||||
///
|
||||
/// @param nAssets Number of assets in the pool
|
||||
/// @param kappa Liquidity parameter κ (64.64 fixed point)
|
||||
/// @param qInternal Cached internal balances in 64.64 fixed-point format
|
||||
/// @param i Index of input asset
|
||||
@@ -123,7 +119,6 @@ library LMSRStabilized {
|
||||
/// @return amountIn Actual amount of input asset used (may be less than `a` if limited by price)
|
||||
/// @return amountOut Amount of output asset j in 64.64 fixed-point format
|
||||
function swapAmountsForExactInput(
|
||||
uint256 nAssets,
|
||||
int128 kappa,
|
||||
int128[] memory qInternal,
|
||||
uint256 i,
|
||||
@@ -217,7 +212,7 @@ library LMSRStabilized {
|
||||
uint256 j,
|
||||
int128 limitPrice
|
||||
) internal view returns (int128 amountIn, int128 amountOut) {
|
||||
return swapAmountsForPriceLimit(s.nAssets, s.kappa, s.qInternal, i, j, limitPrice);
|
||||
return swapAmountsForPriceLimit(s.kappa, s.qInternal, i, j, limitPrice);
|
||||
}
|
||||
|
||||
/// @notice Pure version: Maximum input/output pair possible when swapping from asset i to asset j
|
||||
@@ -226,7 +221,6 @@ library LMSRStabilized {
|
||||
/// and the corresponding output amount (amountOut). If the output would exceed the
|
||||
/// j-balance, amountOut is capped and amountIn is solved for the capped output.
|
||||
///
|
||||
/// @param nAssets Number of assets in the pool
|
||||
/// @param kappa Liquidity parameter κ (64.64 fixed point)
|
||||
/// @param qInternal Cached internal balances in 64.64 fixed-point format
|
||||
/// @param i Index of input asset
|
||||
@@ -235,7 +229,6 @@ library LMSRStabilized {
|
||||
/// @return amountIn Maximum input amount in 64.64 fixed-point format that reaches the price limit
|
||||
/// @return amountOut Corresponding maximum output amount in 64.64 fixed-point format
|
||||
function swapAmountsForPriceLimit(
|
||||
uint256 nAssets,
|
||||
int128 kappa,
|
||||
int128[] memory qInternal,
|
||||
uint256 i,
|
||||
@@ -318,7 +311,7 @@ library LMSRStabilized {
|
||||
uint256 i,
|
||||
int128 a
|
||||
) internal view returns (int128 amountIn, int128 amountOut) {
|
||||
return swapAmountsForMint(s.nAssets, s.kappa, s.qInternal, i, a);
|
||||
return swapAmountsForMint(s.kappa, s.qInternal, i, a);
|
||||
}
|
||||
|
||||
/// @notice Pure version: Compute LP-size increase when minting from a single-token input using bisection only.
|
||||
@@ -327,7 +320,6 @@ library LMSRStabilized {
|
||||
/// where x_j(α) is the input to swap i->j that yields y_j = α*q_j and
|
||||
/// x_j = b * ln( r0_j / (r0_j + 1 - exp(y_j / b)) ), r0_j = exp((q_i - q_j)/b).
|
||||
/// Bisection is used (no Newton) to keep implementation compact and gas-friendly.
|
||||
/// @param nAssets Number of assets in the pool
|
||||
/// @param kappa Liquidity parameter κ (64.64 fixed point)
|
||||
/// @param qInternal Cached internal balances in 64.64 fixed-point format
|
||||
/// @param i Index of input asset
|
||||
@@ -335,13 +327,13 @@ library LMSRStabilized {
|
||||
/// @return amountIn Actual amount of input consumed
|
||||
/// @return amountOut LP size-metric increase (alpha * S)
|
||||
function swapAmountsForMint(
|
||||
uint256 nAssets,
|
||||
int128 kappa,
|
||||
int128[] memory qInternal,
|
||||
uint256 i,
|
||||
int128 a
|
||||
) internal pure returns (int128 amountIn, int128 amountOut) {
|
||||
require(i < nAssets, "LMSR: idx");
|
||||
uint256 n = qInternal.length;
|
||||
require(i < n, "LMSR: idx");
|
||||
require(a > int128(0), "LMSR: amount <= 0");
|
||||
|
||||
int128 sizeMetric = _computeSizeMetric(qInternal);
|
||||
@@ -351,8 +343,6 @@ library LMSRStabilized {
|
||||
int128 invB = ABDKMath64x64.div(ONE, b);
|
||||
int128 S = sizeMetric;
|
||||
|
||||
uint256 n = nAssets;
|
||||
|
||||
// Precompute r0_j = exp((q_i - q_j) / b) for all j to avoid recomputing during search.
|
||||
int128[] memory r0 = new int128[](n);
|
||||
for (uint256 j = 0; j < n; ) {
|
||||
@@ -530,7 +520,7 @@ library LMSRStabilized {
|
||||
uint256 i,
|
||||
int128 alpha
|
||||
) internal view returns (int128 amountOut, int128 amountIn) {
|
||||
return swapAmountsForBurn(s.nAssets, s.kappa, s.qInternal, i, alpha);
|
||||
return swapAmountsForBurn(s.kappa, s.qInternal, i, alpha);
|
||||
}
|
||||
|
||||
/// @notice Pure version: Compute single-asset payout when burning a proportional share alpha of the pool.
|
||||
@@ -542,7 +532,6 @@ library LMSRStabilized {
|
||||
/// - cap output to q_local[i] when necessary (solve inverse for input used)
|
||||
/// Treat any per-asset rhs<=0 as "this asset contributes zero" (do not revert).
|
||||
/// Revert only if the final single-asset payout is zero.
|
||||
/// @param nAssets Number of assets in the pool
|
||||
/// @param kappa Liquidity parameter κ (64.64 fixed point)
|
||||
/// @param qInternal Cached internal balances in 64.64 fixed-point format
|
||||
/// @param i Index of output asset
|
||||
@@ -550,13 +539,11 @@ library LMSRStabilized {
|
||||
/// @return amountOut Amount of asset i received (in 64.64 fixed-point)
|
||||
/// @return amountIn LP size-metric redeemed (alpha * S)
|
||||
function swapAmountsForBurn(
|
||||
uint256 nAssets,
|
||||
int128 kappa,
|
||||
int128[] memory qInternal,
|
||||
uint256 i,
|
||||
int128 alpha
|
||||
) internal pure returns (int128 amountOut, int128 amountIn) {
|
||||
require(i < nAssets, "LMSR: idx");
|
||||
require(alpha > int128(0) && alpha <= ONE, "LMSR: alpha");
|
||||
|
||||
int128 sizeMetric = _computeSizeMetric(qInternal);
|
||||
@@ -565,7 +552,7 @@ library LMSRStabilized {
|
||||
require(b > int128(0), "LMSR: b<=0");
|
||||
int128 invB = ABDKMath64x64.div(ONE, b);
|
||||
|
||||
uint256 n = nAssets;
|
||||
uint256 n = qInternal.length;
|
||||
|
||||
// Size metric and burned size (amountIn returned)
|
||||
int128 S = sizeMetric;
|
||||
@@ -675,7 +662,6 @@ library LMSRStabilized {
|
||||
int128 amountIn,
|
||||
int128 amountOut
|
||||
) internal {
|
||||
require(i < s.nAssets && j < s.nAssets, "LMSR: idx");
|
||||
require(amountIn > int128(0), "LMSR: amountIn <= 0");
|
||||
require(amountOut > int128(0), "LMSR: amountOut <= 0");
|
||||
|
||||
@@ -690,15 +676,14 @@ library LMSRStabilized {
|
||||
/// Updates the internal qInternal cache with the new balances
|
||||
/// @param newQInternal New asset quantities after mint/redeem (64.64 format)
|
||||
function updateForProportionalChange(State storage s, int128[] memory newQInternal) internal {
|
||||
require(newQInternal.length == s.nAssets, "LMSR: length mismatch");
|
||||
|
||||
// Compute new total for validation
|
||||
int128 newTotal = _computeSizeMetric(newQInternal);
|
||||
|
||||
require(newTotal > int128(0), "LMSR: new total zero");
|
||||
|
||||
// Update the cached qInternal with new values
|
||||
for (uint i = 0; i < s.nAssets; ) {
|
||||
uint256 n = newQInternal.length;
|
||||
for (uint i = 0; i < n; ) {
|
||||
s.qInternal[i] = newQInternal[i];
|
||||
unchecked { i++; }
|
||||
}
|
||||
@@ -775,19 +760,17 @@ library LMSRStabilized {
|
||||
/// @notice Marginal price of `base` in terms of `quote` (p_quote / p_base) as Q64.64
|
||||
/// @dev Returns exp((q_quote - q_base) / b). Indices must be valid and b > 0.
|
||||
function price(State storage s, uint256 baseTokenIndex, uint256 quoteTokenIndex) internal view returns (int128) {
|
||||
return price(s.nAssets, s.kappa, s.qInternal, baseTokenIndex, quoteTokenIndex);
|
||||
return price(s.kappa, s.qInternal, baseTokenIndex, quoteTokenIndex);
|
||||
}
|
||||
|
||||
/// @notice Pure version: Marginal price of `base` in terms of `quote` (p_quote / p_base) as Q64.64
|
||||
/// @dev Returns exp((q_quote - q_base) / b). Indices must be valid and b > 0.
|
||||
/// @param nAssets Number of assets in the pool
|
||||
/// @param kappa Liquidity parameter κ (64.64 fixed point)
|
||||
/// @param qInternal Cached internal balances in 64.64 fixed-point format
|
||||
/// @param baseTokenIndex Index of base token
|
||||
/// @param quoteTokenIndex Index of quote token
|
||||
/// @return Price in 64.64 fixed-point format
|
||||
function price(uint256 nAssets, int128 kappa, int128[] memory qInternal, uint256 baseTokenIndex, uint256 quoteTokenIndex) internal pure returns (int128) {
|
||||
require(baseTokenIndex < nAssets && quoteTokenIndex < nAssets, "LMSR: idx");
|
||||
function price(int128 kappa, int128[] memory qInternal, uint256 baseTokenIndex, uint256 quoteTokenIndex) internal pure returns (int128) {
|
||||
int128 sizeMetric = _computeSizeMetric(qInternal);
|
||||
require(sizeMetric > int128(0), "LMSR: size metric zero");
|
||||
int128 b = kappa.mul(sizeMetric);
|
||||
@@ -803,18 +786,16 @@ library LMSRStabilized {
|
||||
/// @notice Price of one unit of the LP size-metric (S = sum q_i) denominated in `quote` asset (Q64.64)
|
||||
/// @dev Computes: poolPrice_quote = (1 / S) * sum_j q_j * exp((q_j - q_quote) / b)
|
||||
function poolPrice(State storage s, uint256 quoteTokenIndex) internal view returns (int128) {
|
||||
return poolPrice(s.nAssets, s.kappa, s.qInternal, quoteTokenIndex);
|
||||
return poolPrice(s.kappa, s.qInternal, quoteTokenIndex);
|
||||
}
|
||||
|
||||
/// @notice Pure version: Price of one unit of the LP size-metric (S = sum q_i) denominated in `quote` asset (Q64.64)
|
||||
/// @dev Computes: poolPrice_quote = (1 / S) * sum_j q_j * exp((q_j - q_quote) / b)
|
||||
/// @param nAssets Number of assets in the pool
|
||||
/// @param kappa Liquidity parameter κ (64.64 fixed point)
|
||||
/// @param qInternal Cached internal balances in 64.64 fixed-point format
|
||||
/// @param quoteTokenIndex Index of quote token
|
||||
/// @return Pool price in 64.64 fixed-point format
|
||||
function poolPrice(uint256 nAssets, int128 kappa, int128[] memory qInternal, uint256 quoteTokenIndex) internal pure returns (int128) {
|
||||
require(quoteTokenIndex < nAssets, "LMSR: idx");
|
||||
function poolPrice(int128 kappa, int128[] memory qInternal, uint256 quoteTokenIndex) internal pure returns (int128) {
|
||||
// Compute b and ensure positivity
|
||||
int128 sizeMetric = _computeSizeMetric(qInternal);
|
||||
require(sizeMetric > int128(0), "LMSR: size metric zero");
|
||||
@@ -830,7 +811,7 @@ library LMSRStabilized {
|
||||
|
||||
// Accumulate weighted exponentials: sum_j q_j * exp((q_j - q_quote) / b)
|
||||
int128 acc = int128(0);
|
||||
uint256 n = nAssets;
|
||||
uint256 n = qInternal.length;
|
||||
for (uint256 j = 0; j < n; ) {
|
||||
// factor = exp((q_j - q_quote) / b)
|
||||
int128 factor = _exp(qInternal[j].sub(qInternal[quoteTokenIndex]).mul(invB));
|
||||
@@ -917,7 +898,6 @@ library LMSRStabilized {
|
||||
/// This resets the state so the pool can be re-initialized by init(...) on next mint.
|
||||
function deinit(State storage s) internal {
|
||||
// Reset core state
|
||||
s.nAssets = 0;
|
||||
s.kappa = int128(0);
|
||||
|
||||
// Clear qInternal array
|
||||
|
||||
Reference in New Issue
Block a user