@exponent-labs/market-three-math 0.9.0 → 0.9.1

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.
@@ -1,229 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSwapQuote = exports.simulateSwap = void 0;
4
- /**
5
- * CLMM Swap simulation
6
- * Ported from exponent_clmm/src/state/market_three/helpers/swap.rs
7
- */
8
- const types_1 = require("./types");
9
- const utils_1 = require("./utils");
10
- const BASE_POINTS = 10000;
11
- /**
12
- * Simulate a swap on the CLMM market
13
- * This is a pure function that does not mutate the market state
14
- * Returns the swap outcome including amounts and final state
15
- */
16
- function simulateSwap(marketState, args) {
17
- const { financials, configurationOptions, ticks } = marketState;
18
- const secondsRemaining = Math.max(0, Number(financials.expirationTs) - Date.now() / 1000);
19
- // Create effective price snapshot
20
- const snapshot = new utils_1.EffSnap((0, utils_1.normalizedTimeRemaining)(secondsRemaining), args.syExchangeRate);
21
- // Current state
22
- let currentPriceSpot = ticks.currentSpotPrice;
23
- let currentLeftBoundaryIndex = ticks.currentTick;
24
- // Use currentPrefixSum if available, otherwise fall back to calculating it
25
- let activeLiquidityU64 = ticks.currentPrefixSum ?? 0n;
26
- let activeLiquidityF64 = Number(activeLiquidityU64);
27
- // Fees
28
- const lpFeeRate = (0, utils_1.calculateFeeRate)(configurationOptions.lnFeeRateRoot, secondsRemaining);
29
- const protocolFeeBps = configurationOptions.treasuryFeeBps;
30
- // Check price limits
31
- if (args.priceSpotLimit !== undefined) {
32
- if (args.direction === types_1.SwapDirection.PtToSy) {
33
- if (args.priceSpotLimit < currentPriceSpot) {
34
- throw new Error("Price limit violated: limit must be >= current price for PtToSy");
35
- }
36
- }
37
- else {
38
- if (args.priceSpotLimit > currentPriceSpot) {
39
- throw new Error("Price limit violated: limit must be <= current price for SyToPt");
40
- }
41
- }
42
- }
43
- // Accumulators
44
- let amountOutNet = 0;
45
- let feeLpOut = 0;
46
- let feeProtocolOut = 0;
47
- let amountInLeft = args.amountIn;
48
- // Main loop across contiguous intervals
49
- let iterations = 0;
50
- const maxIterations = 1000;
51
- while (amountInLeft > 0 && iterations < maxIterations) {
52
- iterations++;
53
- // Get right boundary of current interval
54
- const rightBoundaryIndexOpt = (0, utils_1.getSuccessorTickKey)(ticks, currentLeftBoundaryIndex);
55
- if (rightBoundaryIndexOpt === null) {
56
- if (args.direction === types_1.SwapDirection.SyToPt) {
57
- // Cross to create a new interval
58
- const predecessor = (0, utils_1.getPredecessorTickKey)(ticks, currentLeftBoundaryIndex);
59
- if (predecessor === null)
60
- break;
61
- // When crossing downward (SyToPt), update state
62
- currentPriceSpot = (0, utils_1.getImpliedRate)(currentLeftBoundaryIndex); // Boundary we're crossing
63
- currentLeftBoundaryIndex = predecessor; // New left boundary
64
- // Update active liquidity by subtracting liquidity_net at boundary
65
- const boundaryTick = (0, utils_1.findTickByKey)(ticks, predecessor);
66
- if (boundaryTick) {
67
- activeLiquidityU64 = (0, utils_1.bigIntMax)(0n, activeLiquidityU64 - boundaryTick.tick.liquidityNet);
68
- activeLiquidityF64 = Number(activeLiquidityU64);
69
- }
70
- continue;
71
- }
72
- else {
73
- // No more liquidity available
74
- break;
75
- }
76
- }
77
- const rightBoundaryIndex = rightBoundaryIndexOpt;
78
- // Get anchor prices for interval boundaries
79
- const anchorULeft = (0, utils_1.getImpliedRate)(currentLeftBoundaryIndex);
80
- const anchorURight = (0, utils_1.getImpliedRate)(rightBoundaryIndex);
81
- // Effective price at current spot
82
- const cEffOld = snapshot.getEffectivePrice(currentPriceSpot);
83
- // Get principal ledgers for the interval
84
- const currentTickData = (0, utils_1.findTickByKey)(ticks, currentLeftBoundaryIndex);
85
- const principalPt = currentTickData?.tick.principalPt ?? 0n;
86
- const principalSy = currentTickData?.tick.principalSy ?? 0n;
87
- const eps = configurationOptions.epsilonClamp;
88
- // Calculate kappa (scaling factor based on available principal)
89
- // Y_max = (L/τ) * (C(u_old) - C(u_right))
90
- const cEffAtBoundary = snapshot.getEffectivePrice(anchorURight);
91
- const yMaxToBoundaryF = (Number(activeLiquidityF64) / snapshot.timeFactor) * (cEffOld - cEffAtBoundary);
92
- const kappaSy = yMaxToBoundaryF > 0 ? Number(principalSy) / Number(yMaxToBoundaryF) : 0;
93
- const duToLeft = currentPriceSpot - anchorULeft;
94
- const ptMaxToLeftF = Number(activeLiquidityF64) * duToLeft;
95
- const kappaPt = ptMaxToLeftF > 0 ? Number(principalPt) / ptMaxToLeftF : 0;
96
- const kappa = Math.min(kappaPt, kappaSy, 1.0);
97
- const lTradeF64 = Number(activeLiquidityF64) * kappa;
98
- if (args.direction === types_1.SwapDirection.PtToSy) {
99
- // PT -> SY swap (buying SY with PT)
100
- const duByInput = lTradeF64 > 0 ? amountInLeft / lTradeF64 : 0;
101
- const duToBoundary = anchorURight - currentPriceSpot;
102
- const duActual = Math.min(duByInput, duToBoundary);
103
- if (duToBoundary <= eps) {
104
- // Cross boundary
105
- const boundaryTick = (0, utils_1.findTickByKey)(ticks, rightBoundaryIndex);
106
- if (boundaryTick) {
107
- activeLiquidityU64 += boundaryTick.tick.liquidityNet;
108
- activeLiquidityF64 = Number(activeLiquidityU64);
109
- }
110
- currentLeftBoundaryIndex = rightBoundaryIndex;
111
- currentPriceSpot = anchorURight;
112
- continue;
113
- }
114
- // Token flows for this segment
115
- const ptInSegment = Math.floor(lTradeF64 * duActual);
116
- const anchorUNew = currentPriceSpot + duActual;
117
- const cEffNew = snapshot.getEffectivePrice(anchorUNew);
118
- const syOutGross = Math.floor((lTradeF64 / snapshot.timeFactor) * (cEffOld - cEffNew));
119
- const syOutGrossClamped = Math.min(syOutGross, Number(principalSy));
120
- if (syOutGrossClamped > 0) {
121
- const totalFeeOut = (0, utils_1.getFeeFromAmount)(syOutGrossClamped, lpFeeRate);
122
- const protocolFeeOut = Math.floor((totalFeeOut * protocolFeeBps) / BASE_POINTS);
123
- const lpFeeOut = totalFeeOut - protocolFeeOut;
124
- const syOutNet = syOutGrossClamped - totalFeeOut;
125
- amountOutNet += syOutNet;
126
- feeLpOut += lpFeeOut;
127
- feeProtocolOut += protocolFeeOut;
128
- }
129
- amountInLeft -= ptInSegment;
130
- currentPriceSpot = anchorUNew;
131
- }
132
- else {
133
- // SY -> PT swap (buying PT with SY)
134
- const cEffLeft = snapshot.getEffectivePrice(anchorULeft);
135
- const deltaCByInput = lTradeF64 > 0 ? (snapshot.timeFactor / lTradeF64) * amountInLeft : 0;
136
- const deltaCToLeftBoundary = Math.max(0, cEffLeft - cEffOld);
137
- const deltaCActual = Math.min(deltaCByInput, deltaCToLeftBoundary);
138
- if (deltaCToLeftBoundary <= eps) {
139
- // Cross boundary to the left
140
- const predecessor = (0, utils_1.getPredecessorTickKey)(ticks, currentLeftBoundaryIndex);
141
- if (predecessor === null)
142
- break;
143
- // Update active liquidity
144
- const boundaryTick = (0, utils_1.findTickByKey)(ticks, currentLeftBoundaryIndex);
145
- if (boundaryTick) {
146
- activeLiquidityU64 = (0, utils_1.bigIntMax)(0n, activeLiquidityU64 - boundaryTick.tick.liquidityNet);
147
- activeLiquidityF64 = Number(activeLiquidityU64);
148
- }
149
- currentPriceSpot = (0, utils_1.getImpliedRate)(currentLeftBoundaryIndex);
150
- currentLeftBoundaryIndex = predecessor;
151
- continue;
152
- }
153
- // New effective price and spot price after consuming ΔC
154
- const cEffNew = cEffOld + deltaCActual;
155
- const spotPriceNew = snapshot.spotPriceFromEffectivePrice(cEffNew);
156
- // Token flows
157
- const syInSegmentF = (lTradeF64 / snapshot.timeFactor) * (cEffNew - cEffOld);
158
- const duAbs = currentPriceSpot - spotPriceNew;
159
- const ptOutGrossF = lTradeF64 * duAbs;
160
- // Clamp gross PT by available principal
161
- const ptOutGrossU64 = (0, utils_1.bigIntMin)(BigInt(Math.floor(ptOutGrossF)), principalPt);
162
- const syInSegmentU64 = BigInt(Math.floor(syInSegmentF));
163
- if (ptOutGrossU64 === 0n) {
164
- // Nothing to pay out; try to cross
165
- const predecessor = (0, utils_1.getPredecessorTickKey)(ticks, currentLeftBoundaryIndex);
166
- if (predecessor === null)
167
- break;
168
- // Update active liquidity
169
- const boundaryTick = (0, utils_1.findTickByKey)(ticks, currentLeftBoundaryIndex);
170
- if (boundaryTick) {
171
- activeLiquidityU64 = (0, utils_1.bigIntMax)(0n, activeLiquidityU64 - boundaryTick.tick.liquidityNet);
172
- activeLiquidityF64 = Number(activeLiquidityU64);
173
- }
174
- currentPriceSpot = (0, utils_1.getImpliedRate)(currentLeftBoundaryIndex);
175
- currentLeftBoundaryIndex = predecessor;
176
- continue;
177
- }
178
- // Fees in token_out (PT)
179
- const totalFeeOut = (0, utils_1.getFeeFromAmount)(Number(ptOutGrossU64), lpFeeRate);
180
- const protocolFeeOut = Math.floor((totalFeeOut * protocolFeeBps) / BASE_POINTS);
181
- const lpFeeOut = totalFeeOut - protocolFeeOut;
182
- const ptOutNet = Number(ptOutGrossU64) - totalFeeOut;
183
- // Accumulate to user
184
- amountOutNet += ptOutNet;
185
- feeLpOut += lpFeeOut;
186
- feeProtocolOut += protocolFeeOut;
187
- // Consume input and advance state
188
- amountInLeft -= Number(syInSegmentU64);
189
- currentPriceSpot = spotPriceNew;
190
- // If we hit boundary, cross
191
- if (Math.abs(currentPriceSpot - anchorULeft) <= eps && amountInLeft > 0) {
192
- const predecessor = (0, utils_1.getPredecessorTickKey)(ticks, currentLeftBoundaryIndex);
193
- if (predecessor === null)
194
- break;
195
- // Update active liquidity
196
- const boundaryTick = (0, utils_1.findTickByKey)(ticks, currentLeftBoundaryIndex);
197
- if (boundaryTick) {
198
- activeLiquidityU64 = (0, utils_1.bigIntMax)(0n, activeLiquidityU64 - boundaryTick.tick.liquidityNet);
199
- activeLiquidityF64 = Number(activeLiquidityU64);
200
- }
201
- currentPriceSpot = (0, utils_1.getImpliedRate)(currentLeftBoundaryIndex);
202
- currentLeftBoundaryIndex = predecessor;
203
- }
204
- }
205
- }
206
- return {
207
- amountInConsumed: args.amountIn - amountInLeft,
208
- amountOut: amountOutNet,
209
- lpFeeChargedOutToken: feeLpOut,
210
- protocolFeeChargedOutToken: feeProtocolOut,
211
- finalSpotPrice: currentPriceSpot,
212
- finalTickIndex: currentLeftBoundaryIndex,
213
- };
214
- }
215
- exports.simulateSwap = simulateSwap;
216
- /**
217
- * Calculate the expected output for a given input amount
218
- * This is a convenience wrapper around simulateSwap
219
- */
220
- function getSwapQuote(marketState, amountIn, direction) {
221
- return simulateSwap(marketState, {
222
- direction,
223
- amountIn,
224
- syExchangeRate: marketState.currentSyExchangeRate,
225
- isCurrentFlashSwap: false,
226
- });
227
- }
228
- exports.getSwapQuote = getSwapQuote;
229
- //# sourceMappingURL=swapLegacy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swapLegacy.js","sourceRoot":"","sources":["../src/swapLegacy.ts"],"names":[],"mappings":"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"}