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