@sundaeswap/math 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/PoolMath/ConcentratedLiquidityPool.js +655 -160
- package/dist/cjs/PoolMath/ConcentratedLiquidityPool.js.map +1 -1
- package/dist/esm/PoolMath/ConcentratedLiquidityPool.js +605 -137
- package/dist/esm/PoolMath/ConcentratedLiquidityPool.js.map +1 -1
- package/dist/types/PoolMath/ConcentratedLiquidityPool.d.ts +231 -45
- package/dist/types/PoolMath/ConcentratedLiquidityPool.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/PoolMath/ConcentratedLiquidityPool.ts +712 -212
- package/src/PoolMath/__tests__/ConcentratedLiquidityPool.test.ts +189 -196
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConcentratedLiquidityPool.js","names":["_asset","require","_fraction","ConstantProductPool","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","a","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","length","l","Symbol","iterator","u","next","done","push","value","isArray","asFeeParts","fee","Fraction","asFraction","lt","ZERO","gte","ONE","Error","BigInt","numerator","denominator","rawSwapOutput","dx","aReserve","bReserve","totalLp","spaNum","spaDen","spbNum","spbDen","feeNum","feeDen","isAInput","dxEff","va0","vb0","dvaEff","denom","dvbEff","getSwapOutput","exports","inputMetadata","input","sqrtPriceA","sqrtPriceB","_sqrtPriceA","_sqrtPriceB","_asFeeParts","_asFeeParts2","inputReserve","outputReserve","output","inputLpFee","nextInputReserve","nextOutputReserve","priceImpact","idealPrice","actualPrice","subtract","divide","lpFee","AssetAmount","getSwapInput","_sqrtPriceA2","_sqrtPriceB2","_asFeeParts3","_asFeeParts4","feeDiff","ceilDiv","d","effMin","dvaEffMin","dvbEffMin","fwd","guard","calculateLiquidity","b"],"sources":["../../../src/PoolMath/ConcentratedLiquidityPool.ts"],"sourcesContent":["import { AssetAmount, IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport { Fraction, type TFractionLike } from \"@sundaeswap/fraction\";\n\nimport * as ConstantProductPool from \"./ConstantProductPool.js\";\n\n/**\n * Holds the calculated outcome of a concentrated-liquidity swap. Mirrors\n * {@link ConstantProductPool.TSwapOutcome} so it flows through the same generic\n * swap-outcome consumers.\n */\nexport type TSwapOutcome = {\n input: bigint;\n output: bigint;\n lpFee: AssetAmount<IAssetAmountMetadata>;\n nextInputReserve: bigint;\n nextOutputReserve: bigint;\n priceImpact: Fraction;\n};\n\n/** A sqrt-price bound from the CL config, as an exact rational `[num, den]`. */\nexport type TSqrtPrice = [bigint, bigint];\n\n/**\n * Concentrated liquidity is Sundae v4's single-range invariant. Unlike Uniswap\n * v3 there are no per-position ranges or ticks: the whole pool shares ONE\n * immutable price range `[sqrtPriceA, sqrtPriceB]` (a < b) set at creation, and\n * LP is a single fungible token. Swaps run on *virtual* reserves that fold the\n * pool's liquidity `L` (its total LP supply) into each side:\n *\n * VA = a·spbNum + L·spbDen\n * VB = b·spaDen + L·spaNum\n *\n * where `a`/`b` are the raw assetA/assetB reserves. This is a direct port of the\n * scooper's `cl_swap_result` (scooper-v2/src/sundaev4/swap_math.rs) and the\n * on-chain `cl_check_swap` (sundae-v4/lib/modules/cl_check.ak) — those are the\n * source of truth; keep this in lockstep with them.\n */\n\nconst asFeeParts = (fee: TFractionLike): [bigint, bigint] => {\n const f = Fraction.asFraction(fee);\n if (f.lt(Fraction.ZERO) || f.gte(Fraction.ONE))\n throw new Error(\"fee must be in [0, 1)\");\n return [BigInt(f.numerator), BigInt(f.denominator)];\n};\n\n/**\n * The raw forward swap: given a pre-fee input `dx`, return the output amount.\n * A→B and B→A use different virtual-reserve scalings (see `cl_check_swap`).\n * All quantities are non-negative so integer division floors, matching chain.\n */\nconst rawSwapOutput = (\n dx: bigint,\n aReserve: bigint,\n bReserve: bigint,\n totalLp: bigint,\n spaNum: bigint,\n spaDen: bigint,\n spbNum: bigint,\n spbDen: bigint,\n feeNum: bigint,\n feeDen: bigint,\n isAInput: boolean,\n): bigint => {\n const fee = (dx * feeNum) / feeDen;\n const dxEff = dx - fee;\n const va0 = aReserve * spbNum + totalLp * spbDen;\n const vb0 = bReserve * spaDen + totalLp * spaNum;\n if (isAInput) {\n const dvaEff = dxEff * spbNum;\n const denom = (va0 + dvaEff) * spaDen;\n if (denom <= 0n) return 0n;\n return (vb0 * dvaEff) / denom;\n }\n const dvbEff = dxEff * spaNum;\n const denom = (vb0 + dvbEff) * spbNum;\n if (denom <= 0n) return 0n;\n return (va0 * dvbEff) / denom;\n};\n\n/**\n * Calculate the swap outcome for a concentrated-liquidity pool.\n *\n * @param inputMetadata Metadata for the supplied (input) asset — used for the fee AssetAmount.\n * @param input The pre-fee amount of the input asset being swapped.\n * @param aReserve The pool's raw reserve of asset A.\n * @param bReserve The pool's raw reserve of asset B.\n * @param totalLp The pool's total LP supply (the virtual liquidity `L`).\n * @param sqrtPriceA The lower sqrt-price bound `[num, den]` from the CL config.\n * @param sqrtPriceB The upper sqrt-price bound `[num, den]` from the CL config.\n * @param fee The liquidity-provider fee (plus protocol fee) as a fraction.\n * @param isAInput True when asset A is the supplied asset (A→B swap).\n * @returns The swap details in the shared {@link TSwapOutcome} shape.\n */\nexport const getSwapOutput = (\n inputMetadata: IAssetAmountMetadata,\n input: bigint,\n aReserve: bigint,\n bReserve: bigint,\n totalLp: bigint,\n sqrtPriceA: TSqrtPrice,\n sqrtPriceB: TSqrtPrice,\n fee: TFractionLike,\n isAInput: boolean,\n): TSwapOutcome => {\n if (input <= 0n || aReserve <= 0n || bReserve <= 0n || totalLp <= 0n)\n throw new Error(\"Input, reserves and liquidity must be positive\");\n const [spaNum, spaDen] = sqrtPriceA;\n const [spbNum, spbDen] = sqrtPriceB;\n if (spaNum <= 0n || spaDen <= 0n || spbNum <= 0n || spbDen <= 0n)\n throw new Error(\"sqrt prices must be positive\");\n const [feeNum, feeDen] = asFeeParts(fee);\n\n const inputReserve = isAInput ? aReserve : bReserve;\n const outputReserve = isAInput ? bReserve : aReserve;\n\n let output = rawSwapOutput(\n input,\n aReserve,\n bReserve,\n totalLp,\n spaNum,\n spaDen,\n spbNum,\n spbDen,\n feeNum,\n feeDen,\n isAInput,\n );\n // Can't take more than the pool actually holds (virtual reserves can\n // otherwise let the formula exceed the real reserve near the boundary).\n if (output > outputReserve) output = outputReserve;\n\n const inputLpFee = (input * feeNum) / feeDen;\n const nextInputReserve = inputReserve + input;\n const nextOutputReserve = outputReserve - output;\n\n // Price impact vs the marginal (dx→0) rate. Marginal output-per-effective-\n // input is vb0·spbNum/(va0·spaDen) for A→B (symmetric for B→A), so the ideal\n // input-per-output is its reciprocal. Display-only.\n const va0 = aReserve * spbNum + totalLp * spbDen;\n const vb0 = bReserve * spaDen + totalLp * spaNum;\n let priceImpact = Fraction.ZERO;\n if (output > 0n) {\n const idealPrice = isAInput\n ? new Fraction(va0 * spaDen, vb0 * spbNum)\n : new Fraction(vb0 * spbNum, va0 * spaDen);\n const actualPrice = new Fraction(input - inputLpFee, output);\n priceImpact = Fraction.ONE.subtract(idealPrice.divide(actualPrice));\n }\n\n return {\n input,\n output,\n lpFee: new AssetAmount(inputLpFee, inputMetadata),\n nextInputReserve,\n nextOutputReserve,\n priceImpact,\n };\n};\n\n/**\n * Calculate the minimal input required to receive a given output — the inverse\n * of {@link getSwapOutput}. The forward swap is linear-fractional in the\n * effective input, so it inverts in closed form; a short correction loop\n * absorbs the fee floor and integer rounding so the result is the exact minimal\n * input whose forward swap yields at least `output`.\n */\nexport const getSwapInput = (\n inputMetadata: IAssetAmountMetadata,\n output: bigint,\n aReserve: bigint,\n bReserve: bigint,\n totalLp: bigint,\n sqrtPriceA: TSqrtPrice,\n sqrtPriceB: TSqrtPrice,\n fee: TFractionLike,\n isAInput: boolean,\n): TSwapOutcome => {\n if (output <= 0n || aReserve <= 0n || bReserve <= 0n || totalLp <= 0n)\n throw new Error(\"Output, reserves and liquidity must be positive\");\n const [spaNum, spaDen] = sqrtPriceA;\n const [spbNum, spbDen] = sqrtPriceB;\n if (spaNum <= 0n || spaDen <= 0n || spbNum <= 0n || spbDen <= 0n)\n throw new Error(\"sqrt prices must be positive\");\n const outputReserve = isAInput ? bReserve : aReserve;\n if (output > outputReserve)\n throw new Error(\"Output must not exceed the output reserve\");\n\n const [feeNum, feeDen] = asFeeParts(fee);\n const feeDiff = feeDen - feeNum;\n\n const va0 = aReserve * spbNum + totalLp * spbDen;\n const vb0 = bReserve * spaDen + totalLp * spaNum;\n\n const ceilDiv = (n: bigint, d: bigint) => (n + d - 1n) / d;\n\n // Closed-form minimal effective input, then gross up for the fee floor.\n let effMin: bigint;\n if (isAInput) {\n // dvaEff ≥ output·spaDen·va0 / (vb0 − output·spaDen)\n const denom = vb0 - output * spaDen;\n if (denom <= 0n)\n throw new Error(\"Output not reachable within the pool's range\");\n const dvaEffMin = ceilDiv(output * spaDen * va0, denom);\n effMin = ceilDiv(dvaEffMin, spbNum);\n } else {\n const denom = va0 - output * spbNum;\n if (denom <= 0n)\n throw new Error(\"Output not reachable within the pool's range\");\n const dvbEffMin = ceilDiv(output * spbNum * vb0, denom);\n effMin = ceilDiv(dvbEffMin, spaNum);\n }\n let input = feeDiff > 0n ? ceilDiv(effMin * feeDen, feeDiff) : effMin;\n\n // Correct for floor interactions: nudge up until the forward swap clears the\n // target, then trim any over-shoot. Bounded — a couple of iterations at most.\n const fwd = (dx: bigint) =>\n rawSwapOutput(\n dx,\n aReserve,\n bReserve,\n totalLp,\n spaNum,\n spaDen,\n spbNum,\n spbDen,\n feeNum,\n feeDen,\n isAInput,\n );\n let guard = 0;\n while (fwd(input) < output && guard++ < 64) input += 1n;\n while (input > 1n && fwd(input - 1n) >= output) input -= 1n;\n\n const inputLpFee = (input * feeNum) / feeDen;\n const inputReserve = isAInput ? aReserve : bReserve;\n const nextInputReserve = inputReserve + input;\n const nextOutputReserve = outputReserve - output;\n\n let priceImpact = Fraction.ZERO;\n if (output > 0n) {\n const idealPrice = isAInput\n ? new Fraction(va0 * spaDen, vb0 * spbNum)\n : new Fraction(vb0 * spbNum, va0 * spaDen);\n const actualPrice = new Fraction(input - inputLpFee, output);\n priceImpact = Fraction.ONE.subtract(idealPrice.divide(actualPrice));\n }\n\n return {\n input,\n output,\n lpFee: new AssetAmount(inputLpFee, inputMetadata),\n nextInputReserve,\n nextOutputReserve,\n priceImpact,\n };\n};\n\n/**\n * Deposit LP estimate for a concentrated-liquidity pool. CL deposits reuse the\n * constant-product *proportional* pinning: minting by the scarcest offered\n * asset and ceil-pinning the reserve deltas gives, per asset,\n * `a1·L0 ≥ a0·L1` and `b1·L0 ≥ b0·L1` — and those two bounds multiply to\n * exactly the on-chain CL non-swap invariant `va1·vb1·L0² ≥ va0·vb0·L1²`\n * (`cl_check.ak`). So the proportional deposit is always chain-valid; excess of\n * either asset is refunded via aChange/bChange. This mirrors the scooper's\n * `resolve_cl_deposit` (which likewise reuses the CP pinning).\n */\nexport const calculateLiquidity = (\n a: bigint,\n b: bigint,\n aReserve: bigint,\n bReserve: bigint,\n totalLp: bigint,\n) => ConstantProductPool.calculateLiquidity(a, b, aReserve, bReserve, totalLp);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ConcentratedLiquidityPool.js","names":["_asset","require","_fraction","_typeof","o","Symbol","iterator","constructor","prototype","_createForOfIteratorHelper","r","e","t","Array","isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","a","u","call","next","_arrayLikeToArray","toString","slice","name","from","test","ownKeys","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","configurable","writable","i","_toPrimitive","toPrimitive","String","Number","FIXED_ONE","exports","MIN_COUNTER_PER_WEIGHT","minCreateCounter","ladder","weightTotal","ceilDiv","d","upperEdge","l","bands","start","closing","delta","lo","hi","num","den","aSat","x","weight","bSat","liquidityOf","k","coeffA","coeffB","buildIndex","_","b","out","ca","cb","indexLadder","index","prefixes","fAt","L","gAt","A","B","_prefixes","ra","rb","curve","bandProof","_prefixes2","SCAN","CAP","findWitnessInBand","hint","ok","_prefixes3","search","span","m","undefined","w","findWitness","bandView","_prefixes4","band","feeBuy","feeSell","feeFor","v","isAInput","bandFee","dx","fee","bandOutput","dxEff","va0","vb0","dva","dvb","pn","pd","bandCapacity","maxDxInBand","cap","fits","guard","nextBand","swapSteps","remaining","steps","known","prefer","hintX","before","view","capDx","stepDx","dy","kNext","na","nb","crossing","after","input","output","getSwapOutput","inputMetadata","aReserve","bReserve","Error","lpFee","_iterator","_step","err","inputReserve","outputReserve","w0","v0","priceImpact","Fraction","ZERO","ideal","actual","ONE","subtract","divide","AssetAmount","nextInputReserve","nextOutputReserve","bandStates","restA","restB","liquidity","quantities","active","bandOf","reservesAt","K","frac","reduceFrac","gcd","g","uniformLadder","curves","commonDen","BigInt","_curves$i","bandWeights","_opts$peak","_opts$tail","_opts$centre","shape","opts","peak","tail","centre","sigma","Math","max","bell","c","exp","pow","profile","round","shapedLadder","_opts$shape","_opts$csBands","base","weights","cs","Set","csBands","map","feeAt","has","reduce"],"sources":["../../../src/PoolMath/ConcentratedLiquidityPool.ts"],"sourcesContent":["import { AssetAmount, IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport { Fraction } from \"@sundaeswap/fraction\";\n\n/**\n * Holds the calculated outcome of a concentrated-liquidity swap. It has the\n * same shape as `ConstantProductPool.TSwapOutcome`, so the generic\n * swap-outcome consumers accept it.\n */\nexport type TSwapOutcome = {\n input: bigint;\n output: bigint;\n lpFee: AssetAmount<IAssetAmountMetadata>;\n nextInputReserve: bigint;\n nextOutputReserve: bigint;\n priceImpact: Fraction;\n};\n\n/**\n * Concentrated liquidity: Sundae v4's ladder invariant.\n *\n * A pool is a ladder of bands in ascending sqrt-price order. Each band is a\n * concentrated-liquidity arc (`curve` 0) or a constant-sum bin (`curve` 1)\n * with its own share of the pool's liquidity (`weight / weightTotal`) and\n * its own two fees. LP is one fungible token for the whole ladder; a\n * deposit or withdrawal scales every band.\n *\n * The chain never stores the price. It stores reserves, and the state is a\n * WITNESS `(X, k)`: the ladder counter `X` (the pool's `total_lp`, spec V12)\n * and the active band `k`, which the reserves must prove. Everything here\n * mirrors `lib/modules/cl_check.ak` and the scooper's ladder\n * math, rounding included; where they disagree the chain wins\n * and the transaction fails. The rounding is not negotiable:\n *\n * - `L_k` floors; saturation ceils, in ONE division;\n * - the band fee ceils, per step, on the step's real input;\n * - the prefix sums come from the LADDER INDEX (cumulative coefficients\n * in fixed point at 2^64, spec §2.3), multiplied by the counter and\n * ceiled ONCE. A per-band sum of ceilings is a different number and the\n * chain rejects it.\n */\n\n/** An exact rational `num / den`. */\nexport type TFrac = { num: bigint; den: bigint };\n\n/** One band of the ladder. */\nexport type TBand = {\n /** The band's LOWER sqrt-price edge. The next band's `start` is its upper edge. */\n start: TFrac;\n /** The band's share of the ladder's liquidity counter. */\n weight: bigint;\n /** 0 = concentrated-liquidity arc, 1 = constant-sum bin. */\n curve: 0 | 1;\n /** Fee on swaps that buy the pool's first asset (B in). */\n feeBuy: TFrac;\n /** Fee on swaps that sell the pool's first asset (A in). */\n feeSell: TFrac;\n};\n\n/** A ladder: bands, the top edge, and the sum of the weights. */\nexport type TLadder = {\n bands: TBand[];\n /** The last band's UPPER sqrt-price edge. */\n closing: TFrac;\n weightTotal: bigint;\n};\n\n/** The witness the chain checks: the ladder counter and the active band. */\nexport type TWitness = { x: bigint; k: number };\n\n/** 2^64, the fixed-point scale of the ladder index. */\nexport const FIXED_ONE = 1n << 64n;\n\n/**\n * The least counter per unit of weight a ladder may be created with.\n * Mirrors `cl_check.min_counter_per_weight` (sundae-v4 #229, SV4-007):\n * Create requires `total_lp >= MIN_COUNTER_PER_WEIGHT * weightTotal`.\n */\nexport const MIN_COUNTER_PER_WEIGHT = 1000n;\n\n/** The least counter (initial `total_lp`) the chain accepts at Create for `ladder`. */\nexport const minCreateCounter = (ladder: TLadder): bigint =>\n MIN_COUNTER_PER_WEIGHT * ladder.weightTotal;\n\nconst ceilDiv = (n: bigint, d: bigint): bigint => (n + d - 1n) / d;\n\n/** Band i's upper sqrt-price edge. */\nexport const upperEdge = (l: TLadder, i: number): TFrac =>\n i + 1 < l.bands.length ? l.bands[i + 1]!.start : l.closing;\n\n/** `D_i = hi.num·lo.den − lo.num·hi.den`: positive exactly when the edges increase. */\nexport const delta = (lo: TFrac, hi: TFrac): bigint =>\n hi.num * lo.den - lo.num * hi.den;\n\n/** `a_sat_i = ceil(w_i·X·D_i / (W·lo.num·hi.num))`: the A a band above the price holds. */\nexport const aSat = (l: TLadder, x: bigint, i: number): bigint => {\n const lo = l.bands[i]!.start;\n const hi = upperEdge(l, i);\n return ceilDiv(\n l.bands[i]!.weight * x * delta(lo, hi),\n l.weightTotal * lo.num * hi.num,\n );\n};\n\n/** `b_sat_i = ceil(w_i·X·D_i / (W·lo.den·hi.den))`: the B a band below the price holds. */\nexport const bSat = (l: TLadder, x: bigint, i: number): bigint => {\n const lo = l.bands[i]!.start;\n const hi = upperEdge(l, i);\n return ceilDiv(\n l.bands[i]!.weight * x * delta(lo, hi),\n l.weightTotal * lo.den * hi.den,\n );\n};\n\n/** `L_k = floor(w_k·X / W)`. */\nexport const liquidityOf = (l: TLadder, x: bigint, k: number): bigint =>\n (l.bands[k]!.weight * x) / l.weightTotal;\n\n/** Band i's A-side saturation coefficient: the part of `a_sat_i` independent of X, rounded up. */\nexport const coeffA = (l: TLadder, i: number): bigint => {\n const lo = l.bands[i]!.start;\n const hi = upperEdge(l, i);\n return ceilDiv(\n l.bands[i]!.weight * delta(lo, hi) * FIXED_ONE,\n l.weightTotal * lo.num * hi.num,\n );\n};\n\n/** The same on the B side. */\nexport const coeffB = (l: TLadder, i: number): bigint => {\n const lo = l.bands[i]!.start;\n const hi = upperEdge(l, i);\n return ceilDiv(\n l.bands[i]!.weight * delta(lo, hi) * FIXED_ONE,\n l.weightTotal * lo.den * hi.den,\n );\n};\n\n/** One index entry: the cumulative coefficients above and below band k. */\nexport type TIndexEntry = { ca: bigint; cb: bigint };\n\n/**\n * The ladder index `Create` pins and every spend reads: entry k is the pair\n * of cumulative coefficients for the bands strictly above and strictly\n * below band k. `cl_check.build_index`, to the digit.\n */\nexport const buildIndex = (l: TLadder): TIndexEntry[] => {\n const n = l.bands.length;\n const a = Array.from({ length: n }, (_, i) => coeffA(l, i));\n const b = Array.from({ length: n }, (_, i) => coeffB(l, i));\n const out: TIndexEntry[] = [];\n for (let k = 0; k < n; k++) {\n let ca = 0n;\n let cb = 0n;\n for (let i = 0; i < n; i++) {\n if (i > k) ca += a[i]!;\n if (i < k) cb += b[i]!;\n }\n out.push({ ca, cb });\n }\n return out;\n};\n\n/**\n * A ladder with its index built once. Every probe of the witness search\n * reads the index for every band, and rebuilding it per probe is most of\n * the cost of a quote.\n */\nexport type TIndexedLadder = TLadder & { index: TIndexEntry[] };\n\nexport const indexLadder = (l: TLadder): TIndexedLadder =>\n \"index\" in l && Array.isArray((l as TIndexedLadder).index)\n ? (l as TIndexedLadder)\n : { ...l, index: buildIndex(l) };\n\n/** `C_A`, `C_B` at (X, k) from the index: one ceiling after the multiply by X. */\nexport const prefixes = (\n l: TIndexedLadder,\n x: bigint,\n k: number,\n): { ca: bigint; cb: bigint } => {\n const e = l.index[k]!;\n return { ca: ceilDiv(e.ca * x, FIXED_ONE), cb: ceilDiv(e.cb * x, FIXED_ONE) };\n};\n\n/** `cl_check.f_at_raw`: the CL arc, cross-multiplied. */\nconst fAt = (a: bigint, b: bigint, L: bigint, lo: TFrac, hi: TFrac): bigint =>\n (a * hi.num + L * hi.den) * (b * lo.den + L * lo.num) -\n L * L * hi.num * lo.den;\n\n/** G at a witness, on whichever curve the active band carries. */\nconst gAt = (\n l: TIndexedLadder,\n A: bigint,\n B: bigint,\n x: bigint,\n k: number,\n): bigint => {\n const { ca, cb } = prefixes(l, x, k);\n const lo = l.bands[k]!.start;\n const hi = upperEdge(l, k);\n const ra = A - ca;\n const rb = B - cb;\n const L = liquidityOf(l, x, k);\n return l.bands[k]!.curve === 0\n ? fAt(ra, rb, L, lo, hi)\n : ra * (lo.num * hi.num) + rb * (lo.den * hi.den) - L * delta(lo, hi);\n};\n\n/** The band proof, P1 through P7. The chain runs exactly this. */\nexport const bandProof = (\n l: TIndexedLadder,\n A: bigint,\n B: bigint,\n x: bigint,\n k: number,\n): boolean => {\n if (x < l.weightTotal) return false; // P1\n const { ca, cb } = prefixes(l, x, k);\n const ra = A - ca;\n const rb = B - cb;\n if (ra < 0n || rb < 0n) return false; // P2, P3\n if (ra > aSat(l, x, k) || rb > bSat(l, x, k)) return false; // P4, P5\n if (gAt(l, A, B, x, k) < 0n) return false; // P6\n return gAt(l, A, B, x + 1n, k) < 0n; // P7\n};\n\nconst SCAN = 400n;\nconst CAP = 1n << 80n;\n\n/**\n * The witness in band k, seeded at `hint` when given: the counter only\n * grows along a swap, so the doubling search starts from the previous\n * witness. `lo` is the largest x with non-negative residuals and G ≥ 0,\n * and a witness is such an x whose successor fails G, so the scan walks\n * DOWN from `lo` first. Mirrors the scooper's `find_witness_in_band_from`.\n */\nexport const findWitnessInBand = (\n l: TIndexedLadder,\n A: bigint,\n B: bigint,\n k: number,\n hint?: bigint,\n): TWitness | null => {\n const ok = (x: bigint): boolean => {\n const { ca, cb } = prefixes(l, x, k);\n return A - ca >= 0n && B - cb >= 0n && gAt(l, A, B, x, k) >= 0n;\n };\n const search = (start: bigint): TWitness | null => {\n let lo = start;\n let span = 1n;\n let hi = lo + span;\n while (ok(hi) && hi < CAP) {\n lo = hi;\n span *= 2n;\n hi = lo + span;\n }\n while (lo + 1n < hi) {\n const m = (lo + hi) / 2n;\n if (ok(m)) lo = m;\n else hi = m;\n }\n const from = lo > SCAN ? lo - SCAN : 1n;\n for (let x = lo; x >= from; x--) {\n if (bandProof(l, A, B, x, k)) return { x, k };\n }\n for (let x = lo + 1n; x <= lo + SCAN; x++) {\n if (bandProof(l, A, B, x, k)) return { x, k };\n }\n return null;\n };\n if (hint !== undefined && hint > 0n && ok(hint)) {\n const w = search(hint);\n if (w) return w;\n }\n if (!ok(1n)) return null;\n return search(1n);\n};\n\n/**\n * The witness `(X, k)` for a pool's reserves. A hint (the indexed\n * `bandCounter` / `activeBand`) is checked first and seeds the search in\n * its band; a stale hint falls back to every band. Null when the reserves\n * sit on no point of the ladder — the chain would reject them too.\n */\nexport const findWitness = (\n ladder: TLadder,\n A: bigint,\n B: bigint,\n hint?: TWitness,\n): TWitness | null => {\n const l = indexLadder(ladder);\n if (hint && hint.k >= 0 && hint.k < l.bands.length) {\n if (bandProof(l, A, B, hint.x, hint.k)) return hint;\n const w = findWitnessInBand(l, A, B, hint.k, hint.x);\n if (w) return w;\n }\n for (let k = 0; k < l.bands.length; k++) {\n const w = findWitnessInBand(l, A, B, k);\n if (w) return w;\n }\n return null;\n};\n\n/** The active band's view at a witness: its residual reserves and liquidity. */\nexport type TBandView = {\n ra: bigint;\n rb: bigint;\n l: bigint;\n lo: TFrac;\n hi: TFrac;\n curve: 0 | 1;\n feeBuy: TFrac;\n feeSell: TFrac;\n};\n\nexport const bandView = (\n l: TIndexedLadder,\n A: bigint,\n B: bigint,\n w: TWitness,\n): TBandView => {\n const { ca, cb } = prefixes(l, w.x, w.k);\n const band = l.bands[w.k]!;\n return {\n ra: A - ca,\n rb: B - cb,\n l: liquidityOf(l, w.x, w.k),\n lo: band.start,\n hi: upperEdge(l, w.k),\n curve: band.curve,\n feeBuy: band.feeBuy,\n feeSell: band.feeSell,\n };\n};\n\n/** The band's fee for a direction: `feeSell` when A is sold, `feeBuy` when A is bought. */\nexport const feeFor = (v: TBandView, isAInput: boolean): TFrac =>\n isAInput ? v.feeSell : v.feeBuy;\n\n/**\n * The band fee on a step's real input `dx`: `ceil(dx * num / den)`.\n * Mirrors `cl_check.band_fee` (sundae-v4 #228, SV4-006). The chain charges\n * it per transcript step and rounds it UP, so a step below `den / num`\n * units still pays one unit. A zero rate charges nothing.\n */\nexport const bandFee = (dx: bigint, fee: TFrac): bigint =>\n (dx * fee.num + fee.den - 1n) / fee.den;\n\n/** The output one band pays for `dx` within itself. Mirrors the scooper's `band_output`. */\nexport const bandOutput = (\n v: TBandView,\n isAInput: boolean,\n dx: bigint,\n): bigint => {\n const fee = feeFor(v, isAInput);\n if (fee.den <= 0n) return 0n;\n const dxEff = dx - bandFee(dx, fee);\n if (dxEff <= 0n) return 0n;\n if (v.curve === 0) {\n const va0 = v.ra * v.hi.num + v.l * v.hi.den;\n const vb0 = v.rb * v.lo.den + v.l * v.lo.num;\n if (isAInput) {\n const dva = dxEff * v.hi.num;\n const den = (va0 + dva) * v.lo.den;\n return den === 0n ? 0n : (vb0 * dva) / den;\n }\n const dvb = dxEff * v.lo.den;\n const den = (vb0 + dvb) * v.hi.num;\n return den === 0n ? 0n : (va0 * dvb) / den;\n }\n const pn = v.lo.num * v.hi.num;\n const pd = v.lo.den * v.hi.den;\n return isAInput ? (dxEff * pn) / pd : (dxEff * pd) / pn;\n};\n\n/** What the band can pay out in a direction: its residual of the output asset. */\nexport const bandCapacity = (v: TBandView, isAInput: boolean): bigint =>\n isAInput ? v.rb : v.ra;\n\n/** The largest input whose output stays within the band. */\nexport const maxDxInBand = (v: TBandView, isAInput: boolean): bigint => {\n const cap = bandCapacity(v, isAInput);\n if (cap <= 0n) return 0n;\n const fits = (dx: bigint) => bandOutput(v, isAInput, dx) <= cap;\n let hi = 1n;\n for (let guard = 0; fits(hi); guard++) {\n hi *= 2n;\n if (guard > 200) return hi;\n }\n let lo = 0n;\n while (lo + 1n < hi) {\n const m = (lo + hi) / 2n;\n if (fits(m)) lo = m;\n else hi = m;\n }\n return lo;\n};\n\n/** The next band a fill enters: selling A walks down the ladder, buying A walks up. */\nexport const nextBand = (\n k: number,\n isAInput: boolean,\n n: number,\n): number | null =>\n isAInput ? (k === 0 ? null : k - 1) : k + 1 >= n ? null : k + 1;\n\n/** One band of a fill: what it paid, and the state it left. */\nexport type TFillStep = {\n band: number;\n input: bigint;\n output: bigint;\n after: TWitness;\n};\n\n/**\n * Price `dx` across as many bands as it takes, as the scooper's\n * `swap_steps` does: fill the active band, cross to the next, repeat.\n * Returns the steps, or null when the ladder cannot absorb `dx` (the\n * direction is exhausted, or the remainder pays nothing).\n */\nexport const swapSteps = (\n ladder: TLadder,\n A: bigint,\n B: bigint,\n isAInput: boolean,\n dx: bigint,\n hint?: TWitness,\n): TFillStep[] | null => {\n const l = indexLadder(ladder);\n const n = l.bands.length;\n let ca = A;\n let cb = B;\n let remaining = dx;\n const steps: TFillStep[] = [];\n let known: TWitness | null = findWitness(l, A, B, hint);\n if (!known) return null;\n let prefer: number | null = null;\n let hintX: bigint | undefined;\n for (let guard = 0; remaining > 0n; guard++) {\n if (guard > 2 * n + 2) return null;\n let before: TWitness | null = known;\n known = null;\n if (!before) {\n if (prefer !== null) before = findWitnessInBand(l, ca, cb, prefer, hintX);\n if (!before) before = findWitness(l, ca, cb);\n if (!before) return null;\n }\n const view = bandView(l, ca, cb, before);\n const capDx = maxDxInBand(view, isAInput);\n const stepDx = capDx < remaining ? capDx : remaining;\n const dy = stepDx > 0n ? bandOutput(view, isAInput, stepDx) : 0n;\n if (dy <= 0n) {\n const kNext = nextBand(before.k, isAInput, n);\n if (kNext === null || prefer === kNext) return null;\n prefer = kNext;\n continue;\n }\n const na = isAInput ? ca + stepDx : ca - dy;\n const nb = isAInput ? cb - dy : cb + stepDx;\n const crossing = stepDx < remaining;\n let after: TWitness | null = null;\n if (crossing) {\n const kNext = nextBand(before.k, isAInput, n);\n if (kNext !== null) after = findWitnessInBand(l, na, nb, kNext, before.x);\n } else {\n after = findWitnessInBand(l, na, nb, before.k, before.x);\n }\n if (!after) after = findWitness(l, na, nb);\n if (!after || after.x < before.x) return null;\n steps.push({ band: before.k, input: stepDx, output: dy, after });\n remaining -= stepDx;\n ca = na;\n cb = nb;\n prefer = after.k;\n hintX = after.x;\n known = after;\n }\n return steps;\n};\n\n/**\n * The swap output of a concentrated-liquidity pool for `input` of one asset, crossing\n * bands as needed. `aReserve`/`bReserve` are the pool's reserves in\n * canonical order; `hint` is the indexed `bandCounter` / `activeBand`,\n * which seeds the witness search and may be stale.\n *\n * The `lpFee` is the fee the bands kept of the input, summed across the\n * steps. `priceImpact` is against the active band's opening marginal\n * price. Throws when the ladder cannot absorb the input.\n */\nexport const getSwapOutput = (\n inputMetadata: IAssetAmountMetadata,\n input: bigint,\n aReserve: bigint,\n bReserve: bigint,\n ladder: TLadder,\n isAInput: boolean,\n hint?: TWitness,\n): TSwapOutcome & { steps: TFillStep[] } => {\n if (input <= 0n || aReserve < 0n || bReserve < 0n)\n throw new Error(\"Input must be positive and reserves non-negative\");\n if (ladder.bands.length === 0 || ladder.weightTotal <= 0n)\n throw new Error(\"The ladder has no bands\");\n const l = indexLadder(ladder);\n const steps = swapSteps(l, aReserve, bReserve, isAInput, input, hint);\n if (!steps || steps.length === 0)\n throw new Error(\"The ladder cannot absorb this input in this direction\");\n let output = 0n;\n let lpFee = 0n;\n for (const s of steps) {\n output += s.output;\n const band = l.bands[s.band]!;\n const fee = isAInput ? band.feeSell : band.feeBuy;\n lpFee += bandFee(s.input, fee);\n }\n const inputReserve = isAInput ? aReserve : bReserve;\n const outputReserve = isAInput ? bReserve : aReserve;\n if (output > outputReserve) output = outputReserve;\n // Price impact against the opening marginal of the first band traded.\n const w0 = findWitness(l, aReserve, bReserve, hint)!;\n const v0 = bandView(l, aReserve, bReserve, w0);\n let priceImpact = Fraction.ZERO;\n if (output > 0n) {\n let ideal: Fraction;\n if (v0.curve === 1) {\n const pn = v0.lo.num * v0.hi.num;\n const pd = v0.lo.den * v0.hi.den;\n ideal = isAInput ? new Fraction(pd, pn) : new Fraction(pn, pd);\n } else {\n const va0 = v0.ra * v0.hi.num + v0.l * v0.hi.den;\n const vb0 = v0.rb * v0.lo.den + v0.l * v0.lo.num;\n ideal = isAInput\n ? new Fraction(va0 * v0.lo.den, vb0 * v0.hi.num)\n : new Fraction(vb0 * v0.hi.num, va0 * v0.lo.den);\n }\n const actual = new Fraction(input - lpFee, output);\n priceImpact = Fraction.ONE.subtract(ideal.divide(actual));\n }\n return {\n input,\n output,\n lpFee: new AssetAmount(lpFee, inputMetadata),\n nextInputReserve: inputReserve + input,\n nextOutputReserve: outputReserve - output,\n priceImpact,\n steps,\n };\n};\n\n/** What each band holds at the pool's reserves. */\nexport type TBandState = {\n /** The band's reserves in canonical order. The bands sum to the pool's reserves. */\n quantities: [bigint, bigint];\n liquidity: bigint;\n active: boolean;\n};\n\n/**\n * Every band's state at the pool's reserves: a band below the price holds\n * only B, a band above it only A, the active band some of both. Null when\n * the reserves sit on no point of the ladder.\n */\nexport const bandStates = (\n ladder: TLadder,\n aReserve: bigint,\n bReserve: bigint,\n hint?: TWitness,\n): TBandState[] | null => {\n const l = indexLadder(ladder);\n const w = findWitness(l, aReserve, bReserve, hint);\n if (!w) return null;\n const out: TBandState[] = [];\n let restA = 0n;\n let restB = 0n;\n for (let i = 0; i < l.bands.length; i++) {\n const liquidity = liquidityOf(l, w.x, i);\n if (i < w.k) {\n const b = bSat(l, w.x, i);\n restB += b;\n out.push({ quantities: [0n, b], liquidity, active: false });\n } else if (i > w.k) {\n const a = aSat(l, w.x, i);\n restA += a;\n out.push({ quantities: [a, 0n], liquidity, active: false });\n } else {\n out.push({ quantities: [0n, 0n], liquidity, active: true });\n }\n }\n const ra = aReserve - restA;\n const rb = bReserve - restB;\n out[w.k]!.quantities = [ra < 0n ? 0n : ra, rb < 0n ? 0n : rb];\n return out;\n};\n\n/** Which band holds a sqrt-price. */\nexport const bandOf = (l: TLadder, s: TFrac): number => {\n for (let i = 0; i < l.bands.length; i++) {\n const hi = upperEdge(l, i);\n if (s.num * hi.den < hi.num * s.den) return i;\n }\n return l.bands.length - 1;\n};\n\n/**\n * The exact reserves a ladder holds at counter `x` with the price at\n * sqrt-price `s`, which must lie in band `k`: what a pool creator deposits\n * for a chosen shape, scale and launch price. The result is floored, so\n * `findWitness` must still be run on it to learn the counter the chain\n * derives — usually `x`, but rounding can move it.\n */\nexport const reservesAt = (\n l: TLadder,\n x: bigint,\n k: number,\n s: TFrac,\n): { A: bigint; B: bigint } => {\n let A = 0n;\n let B = 0n;\n for (let i = 0; i < l.bands.length; i++) {\n if (i > k) {\n A += aSat(l, x, i);\n continue;\n }\n if (i < k) {\n B += bSat(l, x, i);\n continue;\n }\n const lo = l.bands[i]!.start;\n const hi = upperEdge(l, i);\n const L = liquidityOf(l, x, i);\n if (l.bands[i]!.curve === 1) {\n // A constant-sum bin prices at the geometric mean; `s` only says how\n // far through the bin the conversion has gone.\n const K = L * delta(lo, hi);\n const frac = (s.num * lo.den - lo.num * s.den) * hi.den;\n const span = (hi.num * lo.den - lo.num * hi.den) * s.den;\n const rb = (K * frac) / (span * (lo.den * hi.den));\n A += (K - rb * (lo.den * hi.den)) / (lo.num * hi.num);\n B += rb;\n } else {\n // a = L·(1/s − 1/hi), b = L·(s − lo), in exact rationals.\n A += (L * (s.den * hi.num - s.num * hi.den)) / (s.num * hi.num);\n B += (L * (s.num * lo.den - lo.num * s.den)) / (s.den * lo.den);\n }\n }\n return { A, B };\n};\n\n/** A fraction in lowest terms. */\nconst reduceFrac = (f: TFrac): TFrac => {\n const gcd = (a: bigint, b: bigint): bigint => (b === 0n ? a : gcd(b, a % b));\n const g = gcd(f.num < 0n ? -f.num : f.num, f.den);\n return g > 1n ? { num: f.num / g, den: f.den / g } : f;\n};\n\n/**\n * An equal-weight ladder of `n` bands from `lo` to `hi`, every band a CL\n * arc at `fee` unless named in `curves`. The edges are built over a common\n * denominator and reduced: every rational component of a concentrated-liquidity config\n * must stay below 2^64 (spec V9).\n */\nexport const uniformLadder = (\n n: number,\n lo: TFrac,\n hi: TFrac,\n fee: TFrac,\n curves: (0 | 1)[] = [],\n): TLadder => {\n if (n < 1) throw new Error(\"A ladder needs at least one band\");\n if (lo.num * hi.den >= hi.num * lo.den)\n throw new Error(\"The lower edge must be strictly below the upper edge\");\n const span = hi.num * lo.den - lo.num * hi.den;\n const commonDen = lo.den * hi.den * BigInt(n);\n const bands: TBand[] = [];\n for (let i = 0; i < n; i++) {\n bands.push({\n start: reduceFrac({\n num: lo.num * hi.den * BigInt(n) + span * BigInt(i),\n den: commonDen,\n }),\n weight: 1n,\n curve: curves[i] ?? 0,\n feeBuy: fee,\n feeSell: fee,\n });\n }\n return {\n bands,\n closing: reduceFrac({\n num: lo.num * hi.den * BigInt(n) + span * BigInt(n),\n den: commonDen,\n }),\n weightTotal: BigInt(n),\n };\n};\n\n/** Band weight profiles. Every weight is at least 1, as `Create` demands. */\nexport type TWeightShape =\n | \"flat\"\n | \"concentrated\"\n | \"skewed-low\"\n | \"skewed-high\"\n | \"bimodal\";\n\nexport const bandWeights = (\n n: number,\n shape: TWeightShape = \"concentrated\",\n opts: { centre?: number; peak?: bigint; tail?: bigint } = {},\n): bigint[] => {\n if (shape === \"flat\") return Array.from({ length: n }, () => 1n);\n const peak = Number(opts.peak ?? 64n);\n const tail = Number(opts.tail ?? 1n);\n const centre = opts.centre ?? (n - 1) / 2;\n const sigma = Math.max(n / 5, 0.75);\n const bell = (i: number, c: number) => Math.exp(-(((i - c) / sigma) ** 2));\n const profile = (i: number): number => {\n switch (shape) {\n case \"concentrated\":\n return bell(i, centre);\n case \"skewed-low\":\n return Math.exp(-i / Math.max(n / 3, 1));\n case \"skewed-high\":\n return Math.exp(-(n - 1 - i) / Math.max(n / 3, 1));\n case \"bimodal\":\n return Math.max(bell(i, (n - 1) / 4), bell(i, (3 * (n - 1)) / 4));\n default:\n return 1;\n }\n };\n return Array.from({ length: n }, (_, i) => {\n const w = Math.round(tail + (peak - tail) * profile(i));\n return BigInt(Math.max(1, w));\n });\n};\n\n/**\n * A ladder of `n` bands from `lo` to `hi` with a weight shape, optional\n * constant-sum bins and an optional per-band fee. The edges are\n * `uniformLadder`'s exactly; only the weights, curves and fees differ.\n */\nexport const shapedLadder = (\n n: number,\n lo: TFrac,\n hi: TFrac,\n fee: TFrac,\n opts: {\n shape?: TWeightShape;\n centre?: number;\n peak?: bigint;\n tail?: bigint;\n /** Zero-based band indices to price as constant-sum bins. */\n csBands?: number[];\n /** Overrides `fee` per band. */\n feeAt?: (i: number) => TFrac;\n } = {},\n): TLadder => {\n const base = uniformLadder(n, lo, hi, fee);\n const weights = bandWeights(n, opts.shape ?? \"concentrated\", opts);\n const cs = new Set(opts.csBands ?? []);\n const bands: TBand[] = base.bands.map((b, i) => {\n const f = opts.feeAt ? opts.feeAt(i) : fee;\n return {\n ...b,\n weight: weights[i]!,\n curve: cs.has(i) ? 1 : 0,\n feeBuy: f,\n feeSell: f,\n };\n });\n return {\n bands,\n closing: base.closing,\n weightTotal: weights.reduce((s, w) => s + w, 0n),\n };\n};\n"],"mappings":"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","ignoreList":[]}
|