@paraswap/dex-lib 2.23.4 → 2.24.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.
Files changed (62) hide show
  1. package/build/abi/algebra/AlgebraPool.abi.json +727 -0
  2. package/build/abi/algebra/AlgebraQuoter.abi.json +138 -0
  3. package/build/abi/algebra/AlgebraStateMulticall.abi.json +801 -0
  4. package/build/config.js +2 -2
  5. package/build/dex/algebra/algebra-pool.d.ts +41 -0
  6. package/build/dex/algebra/algebra-pool.js +272 -0
  7. package/build/dex/algebra/algebra-pool.js.map +1 -0
  8. package/build/dex/algebra/algebra.d.ts +53 -0
  9. package/build/dex/algebra/algebra.js +460 -0
  10. package/build/dex/algebra/algebra.js.map +1 -0
  11. package/build/dex/algebra/config.d.ts +4 -0
  12. package/build/dex/algebra/config.js +41 -0
  13. package/build/dex/algebra/config.js.map +1 -0
  14. package/build/dex/algebra/lib/AlgebraMath.d.ts +13 -0
  15. package/build/dex/algebra/lib/AlgebraMath.js +440 -0
  16. package/build/dex/algebra/lib/AlgebraMath.js.map +1 -0
  17. package/build/dex/algebra/lib/AlgebraXUniV3.d.ts +5 -0
  18. package/build/dex/algebra/lib/AlgebraXUniV3.js +45 -0
  19. package/build/dex/algebra/lib/AlgebraXUniV3.js.map +1 -0
  20. package/build/dex/algebra/lib/Constants.d.ts +5 -0
  21. package/build/dex/algebra/lib/Constants.js +10 -0
  22. package/build/dex/algebra/lib/Constants.js.map +1 -0
  23. package/build/dex/algebra/lib/DataStorage.d.ts +19 -0
  24. package/build/dex/algebra/lib/DataStorage.js +466 -0
  25. package/build/dex/algebra/lib/DataStorage.js.map +1 -0
  26. package/build/dex/algebra/lib/DataStorageOperator.d.ts +10 -0
  27. package/build/dex/algebra/lib/DataStorageOperator.js +93 -0
  28. package/build/dex/algebra/lib/DataStorageOperator.js.map +1 -0
  29. package/build/dex/algebra/lib/Sqrt.d.ts +3 -0
  30. package/build/dex/algebra/lib/Sqrt.js +60 -0
  31. package/build/dex/algebra/lib/Sqrt.js.map +1 -0
  32. package/build/dex/algebra/lib/TickManager.d.ts +10 -0
  33. package/build/dex/algebra/lib/TickManager.js +3 -0
  34. package/build/dex/algebra/lib/TickManager.js.map +1 -0
  35. package/build/dex/algebra/types.d.ts +75 -0
  36. package/build/dex/{pancakeswap-v3 → algebra}/types.js.map +1 -1
  37. package/build/dex/algebra/utils.d.ts +4 -0
  38. package/build/dex/algebra/utils.js +60 -0
  39. package/build/dex/algebra/utils.js.map +1 -0
  40. package/build/dex/uniswap-v3/config.js +15 -0
  41. package/build/dex/uniswap-v3/config.js.map +1 -1
  42. package/package.json +1 -1
  43. package/src/config.ts +2 -2
  44. package/src/dex/uniswap-v3/config.ts +16 -0
  45. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +86 -0
  46. package/.idea/aws.xml +0 -17
  47. package/.idea/codeStyles/Project.xml +0 -19
  48. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  49. package/.idea/misc.xml +0 -6
  50. package/.idea/modules.xml +0 -8
  51. package/.idea/paraswap-dex-lib.iml +0 -9
  52. package/.idea/vcs.xml +0 -6
  53. package/build/dex/aave-v3/tokens/arbitrum.json +0 -50
  54. package/build/dex/aave-v3/tokens/avalanche.json +0 -74
  55. package/build/dex/aave-v3/tokens/fantom.json +0 -62
  56. package/build/dex/aave-v3/tokens/optimism.json +0 -50
  57. package/build/dex/aave-v3/tokens/polygon.json +0 -116
  58. package/build/dex/pancakeswap-v3/types.d.ts +0 -14
  59. package/build/dex/solidly/forks-override/ramses.d.ts +0 -8
  60. package/build/dex/solidly/forks-override/ramses.js +0 -15
  61. package/build/dex/solidly/forks-override/ramses.js.map +0 -1
  62. /package/build/dex/{pancakeswap-v3 → algebra}/types.js +0 -0
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AlgebraMath = void 0;
7
+ const core_1 = require("@paraswap/core");
8
+ const Tick_1 = require("../../uniswap-v3/contract-math/Tick");
9
+ const TickBitMap_1 = require("../../uniswap-v3/contract-math/TickBitMap");
10
+ const SqrtPriceMath_1 = require("../../uniswap-v3/contract-math/SqrtPriceMath");
11
+ const TickMath_1 = require("../../uniswap-v3/contract-math/TickMath");
12
+ const LiquidityMath_1 = require("../../uniswap-v3/contract-math/LiquidityMath");
13
+ const utils_1 = require("../../../utils");
14
+ const SwapMath_1 = require("../../uniswap-v3/contract-math/SwapMath");
15
+ const Constants_1 = require("./Constants");
16
+ const bigint_constants_1 = require("../../../bigint-constants");
17
+ const lodash_1 = __importDefault(require("lodash"));
18
+ const uniswap_v3_math_1 = require("../../uniswap-v3/contract-math/uniswap-v3-math");
19
+ const constants_1 = require("../../uniswap-v3/constants");
20
+ // % START OF COPY PASTA FROM UNISWAPV3 %
21
+ function _priceComputationCycles(poolState, ticksCopy, state, cache, sqrtPriceLimitX96, zeroForOne, exactInput) {
22
+ const latestFullCycleState = { ...state };
23
+ if (cache.tickCount == 0) {
24
+ cache.tickCount = 1;
25
+ }
26
+ const latestFullCycleCache = { ...cache };
27
+ // We save tick before any change. Later we use this to restore
28
+ // state before last step
29
+ let lastTicksCopy;
30
+ let i = 0;
31
+ for (; state.amountSpecifiedRemaining !== 0n &&
32
+ state.sqrtPriceX96 !== sqrtPriceLimitX96; ++i) {
33
+ if (latestFullCycleCache.tickCount + i >
34
+ constants_1.MAX_PRICING_COMPUTATION_STEPS_ALLOWED) {
35
+ state.amountSpecifiedRemaining = 0n;
36
+ state.amountCalculated = 0n;
37
+ break;
38
+ }
39
+ const step = {
40
+ sqrtPriceStartX96: 0n,
41
+ tickNext: 0n,
42
+ initialized: false,
43
+ sqrtPriceNextX96: 0n,
44
+ amountIn: 0n,
45
+ amountOut: 0n,
46
+ feeAmount: 0n,
47
+ };
48
+ step.sqrtPriceStartX96 = state.sqrtPriceX96;
49
+ try {
50
+ [step.tickNext, step.initialized] =
51
+ TickBitMap_1.TickBitMap.nextInitializedTickWithinOneWord(poolState, state.tick, poolState.tickSpacing, zeroForOne, true);
52
+ }
53
+ catch (e) {
54
+ if (e instanceof Error &&
55
+ e.message.endsWith(constants_1.OUT_OF_RANGE_ERROR_POSTFIX)) {
56
+ state.amountSpecifiedRemaining = 0n;
57
+ state.amountCalculated = 0n;
58
+ break;
59
+ }
60
+ throw e;
61
+ }
62
+ if (step.tickNext < TickMath_1.TickMath.MIN_TICK) {
63
+ step.tickNext = TickMath_1.TickMath.MIN_TICK;
64
+ }
65
+ else if (step.tickNext > TickMath_1.TickMath.MAX_TICK) {
66
+ step.tickNext = TickMath_1.TickMath.MAX_TICK;
67
+ }
68
+ step.sqrtPriceNextX96 = TickMath_1.TickMath.getSqrtRatioAtTick(step.tickNext);
69
+ const swapStepResult = SwapMath_1.SwapMath.computeSwapStep(state.sqrtPriceX96, (zeroForOne
70
+ ? step.sqrtPriceNextX96 < sqrtPriceLimitX96
71
+ : step.sqrtPriceNextX96 > sqrtPriceLimitX96)
72
+ ? sqrtPriceLimitX96
73
+ : step.sqrtPriceNextX96, state.liquidity, state.amountSpecifiedRemaining, poolState.globalState.fee);
74
+ state.sqrtPriceX96 = swapStepResult.sqrtRatioNextX96;
75
+ step.amountIn = swapStepResult.amountIn;
76
+ step.amountOut = swapStepResult.amountOut;
77
+ step.feeAmount = swapStepResult.feeAmount;
78
+ if (exactInput) {
79
+ state.amountSpecifiedRemaining -= step.amountIn + step.feeAmount;
80
+ state.amountCalculated = state.amountCalculated - step.amountOut;
81
+ }
82
+ else {
83
+ state.amountSpecifiedRemaining += step.amountOut;
84
+ state.amountCalculated =
85
+ state.amountCalculated + step.amountIn + step.feeAmount;
86
+ }
87
+ if (cache.feeProtocol > 0n) {
88
+ const delta = step.feeAmount / cache.feeProtocol;
89
+ step.feeAmount -= delta;
90
+ state.protocolFee += delta;
91
+ }
92
+ if (state.sqrtPriceX96 === step.sqrtPriceNextX96) {
93
+ if (step.initialized) {
94
+ // skip oracle related logic
95
+ if (state.amountSpecifiedRemaining === 0n) {
96
+ const castTickNext = Number(step.tickNext);
97
+ lastTicksCopy = {
98
+ index: castTickNext,
99
+ tick: { ...ticksCopy[castTickNext] },
100
+ };
101
+ }
102
+ let liquidityNet = Tick_1.Tick.cross(ticksCopy, step.tickNext, cache.secondsPerLiquidityCumulativeX128, cache.tickCumulative, cache.blockTimestamp);
103
+ if (zeroForOne)
104
+ liquidityNet = -liquidityNet;
105
+ state.liquidity = LiquidityMath_1.LiquidityMath.addDelta(state.liquidity, liquidityNet);
106
+ }
107
+ state.tick = zeroForOne ? step.tickNext - 1n : step.tickNext;
108
+ }
109
+ else if (state.sqrtPriceX96 != step.sqrtPriceStartX96) {
110
+ state.tick = TickMath_1.TickMath.getTickAtSqrtRatio(state.sqrtPriceX96);
111
+ }
112
+ if (state.amountSpecifiedRemaining !== 0n) {
113
+ (0, uniswap_v3_math_1._updatePriceComputationObjects)(latestFullCycleState, state);
114
+ (0, uniswap_v3_math_1._updatePriceComputationObjects)(latestFullCycleCache, cache);
115
+ // If it last cycle, check if ticks were changed and then restore previous state
116
+ // for next calculations
117
+ }
118
+ else if (lastTicksCopy !== undefined) {
119
+ ticksCopy[lastTicksCopy.index] = lastTicksCopy.tick;
120
+ }
121
+ }
122
+ if (i > 1) {
123
+ latestFullCycleCache.tickCount += i - 1;
124
+ }
125
+ if (state.amountSpecifiedRemaining !== 0n) {
126
+ state.amountSpecifiedRemaining = 0n;
127
+ state.amountCalculated = 0n;
128
+ }
129
+ return [state, { latestFullCycleState, latestFullCycleCache }];
130
+ }
131
+ class AlgebraMathClass {
132
+ queryOutputs(poolState, amounts, zeroForOne, side) {
133
+ const slot0Start = poolState.globalState;
134
+ const isSell = side === core_1.SwapSide.SELL;
135
+ // While calculating, ticks are changing, so to not change the actual state,
136
+ // we use copy
137
+ const ticksCopy = lodash_1.default.cloneDeep(poolState.ticks);
138
+ const sqrtPriceLimitX96 = zeroForOne
139
+ ? TickMath_1.TickMath.MIN_SQRT_RATIO + 1n
140
+ : TickMath_1.TickMath.MAX_SQRT_RATIO - 1n;
141
+ const cache = {
142
+ liquidityStart: poolState.liquidity,
143
+ blockTimestamp: this._blockTimestamp(poolState),
144
+ feeProtocol: zeroForOne
145
+ ? slot0Start.communityFeeToken0 % 16n
146
+ : slot0Start.communityFeeToken1 >> 4n,
147
+ secondsPerLiquidityCumulativeX128: 0n,
148
+ tickCumulative: 0n,
149
+ computedLatestObservation: false,
150
+ tickCount: 0,
151
+ };
152
+ const state = {
153
+ // Will be overwritten later
154
+ amountSpecifiedRemaining: 0n,
155
+ amountCalculated: 0n,
156
+ sqrtPriceX96: slot0Start.price,
157
+ tick: slot0Start.tick,
158
+ protocolFee: 0n,
159
+ liquidity: cache.liquidityStart,
160
+ isFirstCycleState: true,
161
+ };
162
+ let isOutOfRange = false;
163
+ let previousAmount = 0n;
164
+ const outputs = new Array(amounts.length);
165
+ const tickCounts = new Array(amounts.length);
166
+ for (const [i, amount] of amounts.entries()) {
167
+ if (amount === 0n) {
168
+ outputs[i] = 0n;
169
+ tickCounts[i] = 0;
170
+ continue;
171
+ }
172
+ const amountSpecified = isSell
173
+ ? BigInt.asIntN(256, amount)
174
+ : -BigInt.asIntN(256, amount);
175
+ if (state.isFirstCycleState) {
176
+ // Set first non zero amount
177
+ state.amountSpecifiedRemaining = amountSpecified;
178
+ state.isFirstCycleState = false;
179
+ }
180
+ else {
181
+ state.amountSpecifiedRemaining =
182
+ amountSpecified - (previousAmount - state.amountSpecifiedRemaining);
183
+ }
184
+ const exactInput = amountSpecified > 0n;
185
+ (0, utils_1._require)(zeroForOne
186
+ ? sqrtPriceLimitX96 < slot0Start.price &&
187
+ sqrtPriceLimitX96 > TickMath_1.TickMath.MIN_SQRT_RATIO
188
+ : sqrtPriceLimitX96 > slot0Start.price &&
189
+ sqrtPriceLimitX96 < TickMath_1.TickMath.MAX_SQRT_RATIO, 'SPL', { zeroForOne, sqrtPriceLimitX96, slot0Start }, 'zeroForOne ? sqrtPriceLimitX96 < slot0Start.sqrtPriceX96 && sqrtPriceLimitX96 > TickMath.MIN_SQRT_RATIO : sqrtPriceLimitX96 > slot0Start.sqrtPriceX96 && sqrtPriceLimitX96 < TickMath.MAX_SQRT_RATIO');
190
+ if (!isOutOfRange) {
191
+ const [finalState, { latestFullCycleState, latestFullCycleCache }] = _priceComputationCycles(poolState, ticksCopy, state, cache, sqrtPriceLimitX96, zeroForOne, exactInput);
192
+ if (finalState.amountSpecifiedRemaining === 0n &&
193
+ finalState.amountCalculated === 0n) {
194
+ isOutOfRange = true;
195
+ outputs[i] = 0n;
196
+ tickCounts[i] = 0;
197
+ continue;
198
+ }
199
+ // We use it on next step to correct state.amountSpecifiedRemaining
200
+ previousAmount = amountSpecified;
201
+ // First extract calculated values
202
+ const [amount0, amount1] = zeroForOne === exactInput
203
+ ? [
204
+ amountSpecified - finalState.amountSpecifiedRemaining,
205
+ finalState.amountCalculated,
206
+ ]
207
+ : [
208
+ finalState.amountCalculated,
209
+ amountSpecified - finalState.amountSpecifiedRemaining,
210
+ ];
211
+ // Update for next amount
212
+ (0, uniswap_v3_math_1._updatePriceComputationObjects)(state, latestFullCycleState);
213
+ (0, uniswap_v3_math_1._updatePriceComputationObjects)(cache, latestFullCycleCache);
214
+ if (isSell) {
215
+ outputs[i] = BigInt.asUintN(256, -(zeroForOne ? amount1 : amount0));
216
+ tickCounts[i] = latestFullCycleCache.tickCount;
217
+ continue;
218
+ }
219
+ else {
220
+ outputs[i] = zeroForOne
221
+ ? BigInt.asUintN(256, amount0)
222
+ : BigInt.asUintN(256, amount1);
223
+ tickCounts[i] = latestFullCycleCache.tickCount;
224
+ continue;
225
+ }
226
+ }
227
+ else {
228
+ outputs[i] = 0n;
229
+ tickCounts[i] = 0;
230
+ }
231
+ }
232
+ return {
233
+ outputs,
234
+ tickCounts,
235
+ };
236
+ }
237
+ // % END OF COPY PASTA FROM UNISWAPV3 %
238
+ // same as uniswapV3Pool: line 328 -> 369
239
+ _getAmountsForLiquidity(bottomTick, topTick, liquidityDelta, currentTick, currentPrice) {
240
+ let amount0;
241
+ let amount1;
242
+ let globalLiquidityDelta;
243
+ // If current tick is less than the provided bottom one then only the token0 has to be provided
244
+ if (currentTick < bottomTick) {
245
+ amount0 = SqrtPriceMath_1.SqrtPriceMath._getAmount0DeltaO(TickMath_1.TickMath.getSqrtRatioAtTick(bottomTick), TickMath_1.TickMath.getSqrtRatioAtTick(topTick), liquidityDelta);
246
+ }
247
+ else if (currentTick < topTick) {
248
+ amount0 = SqrtPriceMath_1.SqrtPriceMath._getAmount0DeltaO(currentPrice, TickMath_1.TickMath.getSqrtRatioAtTick(topTick), liquidityDelta);
249
+ amount1 = SqrtPriceMath_1.SqrtPriceMath._getAmount1DeltaO(TickMath_1.TickMath.getSqrtRatioAtTick(bottomTick), currentPrice, liquidityDelta);
250
+ globalLiquidityDelta = liquidityDelta;
251
+ }
252
+ // If current tick is greater than the provided top one then only the token1 has to be provided
253
+ else {
254
+ amount1 = SqrtPriceMath_1.SqrtPriceMath._getAmount1DeltaO(TickMath_1.TickMath.getSqrtRatioAtTick(bottomTick), TickMath_1.TickMath.getSqrtRatioAtTick(topTick), liquidityDelta);
255
+ }
256
+ return [amount0, amount1, globalLiquidityDelta];
257
+ }
258
+ _updatePositionTicksAndFees(state, bottomTick, topTick, liquidityDelta) {
259
+ const { globalState, liquidity } = state;
260
+ let toggledBottom = false;
261
+ let toggledTop = false;
262
+ const cache = {
263
+ price: globalState.price,
264
+ tick: globalState.tick,
265
+ };
266
+ // skip position logic
267
+ // skip fee logic
268
+ if (liquidityDelta !== 0n) {
269
+ const time = this._blockTimestamp(state);
270
+ if (Tick_1.Tick.update(state, bottomTick, cache.tick, liquidityDelta, 0n, // secondsPerLiquidityCumulative, play no role in pricing
271
+ 0n, // tickCumulative, play no role in pricing
272
+ time, false, // isTopTick,
273
+ state.maxLiquidityPerTick)) {
274
+ toggledBottom = true;
275
+ TickBitMap_1.TickBitMap.flipTick(state, bottomTick, state.tickSpacing);
276
+ }
277
+ if (Tick_1.Tick.update(state, topTick, cache.tick, liquidityDelta, 0n, // secondsPerLiquidityCumulative, play no role in pricing
278
+ 0n, // tickCumulative, play no role in pricing
279
+ time, true, // isTopTick
280
+ state.maxLiquidityPerTick)) {
281
+ toggledTop = true;
282
+ TickBitMap_1.TickBitMap.flipTick(state, topTick, state.tickSpacing);
283
+ }
284
+ }
285
+ // skip fee && position related stuffs
286
+ // same as UniwapV3Pool.sol line 327 -> if (params.liquidityDelta != 0) {
287
+ if (liquidityDelta !== 0n) {
288
+ // if liquidityDelta is negative and the tick was toggled, it means that it should not be initialized anymore, so we delete it
289
+ if (liquidityDelta < 0) {
290
+ if (toggledBottom)
291
+ Tick_1.Tick.clear(state, bottomTick);
292
+ if (toggledTop)
293
+ Tick_1.Tick.clear(state, topTick);
294
+ }
295
+ // same as UniswapV3Pool.sol line 331 ? -> amount0 = SqrtPriceMath.getAmount0Delta(
296
+ // skip amount0 and amount1 as already read from event
297
+ const [, , globalLiquidityDelta] = this._getAmountsForLiquidity(bottomTick, topTick, liquidityDelta, cache.tick, cache.price);
298
+ if (globalLiquidityDelta != 0n) {
299
+ let liquidityBefore = liquidity;
300
+ // skip oracle logic
301
+ // same as UniswapV3Pool line 361 -> liquidity = LiquidityMath.addDelta(liquidityBefore, params.liquidityDelta);
302
+ state.liquidity = LiquidityMath_1.LiquidityMath.addDelta(liquidityBefore, liquidityDelta);
303
+ }
304
+ }
305
+ }
306
+ _calculateSwapAndLock(poolState, zeroToOne, newSqrtPriceX96, newTick, newLiquidity) {
307
+ const { globalState, liquidity } = poolState;
308
+ let cache = {
309
+ amountCalculated: 0n,
310
+ amountRequiredInitial: bigint_constants_1.BI_MAX_INT,
311
+ communityFee: 0n,
312
+ exactInput: false,
313
+ fee: 0n,
314
+ startTick: 0n,
315
+ isFirstCycleState: true,
316
+ };
317
+ let communityFeeAmount = 0n;
318
+ // load from one storage slot
319
+ let currentPrice = globalState.price;
320
+ let currentTick = globalState.tick;
321
+ cache.fee = globalState.fee;
322
+ let _communityFeeToken0 = globalState.communityFeeToken0;
323
+ let _communityFeeToken1 = globalState.communityFeeToken1;
324
+ let amountRequired = cache.amountRequiredInitial; // to revalidate
325
+ (0, utils_1._require)(amountRequired != 0n, 'AS');
326
+ [cache.amountRequiredInitial, cache.exactInput] = [
327
+ amountRequired,
328
+ amountRequired > 0,
329
+ ];
330
+ let currentLiquidity = liquidity;
331
+ if (zeroToOne) {
332
+ // require(limitSqrtPrice < currentPrice && limitSqrtPrice > TickMath.MIN_SQRT_RATIO, 'SPL');
333
+ // cache.totalFeeGrowth = totalFeeGrowth0Token;
334
+ cache.communityFee = _communityFeeToken0;
335
+ }
336
+ else {
337
+ // require(limitSqrtPrice > currentPrice && limitSqrtPrice < TickMath.MAX_SQRT_RATIO, 'SPL')
338
+ // cache.totalFeeGrowth = totalFeeGrowth1Token;
339
+ cache.communityFee = _communityFeeToken1;
340
+ }
341
+ cache.startTick = currentTick;
342
+ cache.fee = poolState.globalState.fee; // safe to take as updated just before// _getNewFee(blockTimestamp, currentTick, newTimepointIndex, currentLiquidity);
343
+ const step = {
344
+ feeAmount: 0n,
345
+ initialized: true,
346
+ input: 0n,
347
+ nextTick: 0n,
348
+ nextTickPrice: 0n,
349
+ output: 0n,
350
+ stepSqrtPrice: 0n,
351
+ tickCount: 0,
352
+ };
353
+ let i = 0;
354
+ // swap until there is remaining input or output tokens or we reach the price limit
355
+ while (true) {
356
+ step.stepSqrtPrice = currentPrice;
357
+ //equivalent of tickTable.nextTickInTheSameRow(currentTick, zeroToOne);
358
+ [step.nextTick, step.initialized] =
359
+ TickBitMap_1.TickBitMap.nextInitializedTickWithinOneWord(poolState, currentTick, poolState.tickSpacing, zeroToOne, false);
360
+ step.nextTickPrice = TickMath_1.TickMath.getSqrtRatioAtTick(step.nextTick);
361
+ // equivalent of PriceMovementMath.movePriceTowardsTarget
362
+ const result = SwapMath_1.SwapMath.computeSwapStep(poolState.globalState.price, zeroToOne == step.nextTickPrice < newSqrtPriceX96
363
+ ? newSqrtPriceX96
364
+ : step.nextTickPrice, currentLiquidity, amountRequired, cache.fee);
365
+ [currentPrice, step.input, step.output, step.feeAmount] = [
366
+ result.sqrtRatioNextX96,
367
+ result.amountIn,
368
+ result.amountOut,
369
+ result.feeAmount,
370
+ ];
371
+ if (cache.exactInput) {
372
+ amountRequired -= (0, utils_1.int256)(step.input + step.feeAmount); // decrease remaining input amount
373
+ cache.amountCalculated = cache.amountCalculated - (0, utils_1.int256)(step.output); // decrease calculated output amount
374
+ }
375
+ else {
376
+ amountRequired += (0, utils_1.int256)(step.output); // increase remaining output amount (since its negative)
377
+ cache.amountCalculated =
378
+ cache.amountCalculated + (0, utils_1.int256)(step.input + step.feeAmount); // increase calculated input amount
379
+ }
380
+ if (cache.communityFee > 0) {
381
+ let delta = (step.feeAmount * cache.communityFee) /
382
+ Constants_1.Constants.COMMUNITY_FEE_DENOMINATOR;
383
+ step.feeAmount -= delta;
384
+ communityFeeAmount += delta;
385
+ }
386
+ // skip totalFeeGrowth fee logic
387
+ if (currentPrice == step.nextTickPrice) {
388
+ // if the reached tick is initialized then we need to cross it
389
+ if (step.initialized) {
390
+ const info = poolState.ticks[Number(step.nextTick)];
391
+ const liquidityDelta = info.liquidityNet * (zeroToOne ? -1n : 1n);
392
+ currentLiquidity = LiquidityMath_1.LiquidityMath.addDelta(currentLiquidity, liquidityDelta);
393
+ }
394
+ currentTick = zeroToOne ? step.nextTick - 1n : step.nextTick;
395
+ }
396
+ else if (currentPrice != step.stepSqrtPrice) {
397
+ // if the price has changed but hasn't reached the target
398
+ currentTick = TickMath_1.TickMath.getTickAtSqrtRatio(currentPrice);
399
+ break; // since the price hasn't reached the target, amountRequired should be 0
400
+ }
401
+ // check stop condition
402
+ if (amountRequired == 0n ||
403
+ currentPrice == newSqrtPriceX96 ||
404
+ currentTick === newTick // deviation from contract
405
+ ) {
406
+ break;
407
+ }
408
+ }
409
+ let [amount0, amount1] = zeroToOne == cache.exactInput // the amount to provide could be less then initially specified (e.g. reached limit)
410
+ ? [cache.amountRequiredInitial - amountRequired, cache.amountCalculated] // the amount to get could be less then initially specified (e.g. reached limit)
411
+ : [
412
+ cache.amountCalculated,
413
+ cache.amountRequiredInitial - amountRequired,
414
+ ];
415
+ // validate that amount0 and amount 1 are same here
416
+ [globalState.price, globalState.tick, globalState.fee] = [
417
+ currentPrice,
418
+ currentTick,
419
+ cache.fee,
420
+ ];
421
+ poolState.liquidity = currentLiquidity;
422
+ // no need to update fees
423
+ if (poolState.liquidity !== newLiquidity)
424
+ // prefer assert ?
425
+ poolState.liquidity = newLiquidity;
426
+ return [
427
+ amount0,
428
+ amount1,
429
+ currentPrice,
430
+ currentTick,
431
+ currentLiquidity,
432
+ communityFeeAmount,
433
+ ];
434
+ }
435
+ _blockTimestamp(state) {
436
+ return (0, utils_1.uint32)(state.blockTimestamp);
437
+ }
438
+ }
439
+ exports.AlgebraMath = new AlgebraMathClass();
440
+ //# sourceMappingURL=AlgebraMath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlgebraMath.js","sourceRoot":"","sources":["../../../../src/dex/algebra/lib/AlgebraMath.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { PoolState } from '../types';
2
+ import { PoolState as UniV3PoolState } from '../../uniswap-v3/types';
3
+ declare type MinUniV3PoolState = Pick<UniV3PoolState, 'slot0' | 'liquidity' | 'blockTimestamp' | 'startTickBitmap' | 'tickBitmap' | 'tickSpacing' | 'fee' | 'observations' | 'ticks'>;
4
+ export declare const transformAlgebraToMinUniv3PoolState: (state: PoolState) => MinUniV3PoolState;
5
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformAlgebraToMinUniv3PoolState = void 0;
4
+ const Constants_1 = require("./Constants");
5
+ // @FIXME NOT OPTIMIZED
6
+ const transformAlgebraToMinUniv3PoolState = (state) => {
7
+ const { globalState, timepoints } = state;
8
+ const observations = Object.entries(timepoints).reduce((acc, [key, value]) => {
9
+ acc[parseInt(key)] = {
10
+ ...value,
11
+ secondsPerLiquidityCumulativeX128: value.secondsPerLiquidityCumulative,
12
+ };
13
+ return acc;
14
+ }, {});
15
+ const ticks = Object.entries(state.ticks).reduce((acc, [key, value]) => {
16
+ acc[parseInt(key)] = {
17
+ ...value,
18
+ secondsPerLiquidityOutsideX128: value.outerSecondsPerLiquidity,
19
+ tickCumulativeOutside: value.outerTickCumulative,
20
+ liquidityGross: value.liquidityTotal,
21
+ liquidityNet: value.liquidityDelta,
22
+ secondsOutside: value.outerSecondsSpent,
23
+ };
24
+ return acc;
25
+ }, {});
26
+ const slot0 = {
27
+ feeProtocol: globalState.communityFeeToken0 + (globalState.communityFeeToken1 << 4n),
28
+ observationCardinality: 0,
29
+ observationCardinalityNext: 0,
30
+ observationIndex: Number(state.globalState.timepointIndex),
31
+ sqrtPriceX96: state.globalState.price,
32
+ tick: globalState.tick,
33
+ };
34
+ return {
35
+ ...state,
36
+ fee: globalState.fee,
37
+ tickSpacing: Constants_1.TICK_SPACING,
38
+ slot0,
39
+ observations,
40
+ ticks,
41
+ tickBitmap: state.tickTable,
42
+ };
43
+ };
44
+ exports.transformAlgebraToMinUniv3PoolState = transformAlgebraToMinUniv3PoolState;
45
+ //# sourceMappingURL=AlgebraXUniV3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlgebraXUniV3.js","sourceRoot":"","sources":["../../../../src/dex/algebra/lib/AlgebraXUniV3.ts"],"names":[],"mappings":";;;AAIA,2CAA2C;AAe3C,uBAAuB;AAChB,MAAM,mCAAmC,GAAG,CACjD,KAAgB,EACG,EAAE;IACrB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE1C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAEpD,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACtB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG;YACnB,GAAG,KAAK;YACR,iCAAiC,EAAE,KAAK,CAAC,6BAA6B;SACvE,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG;YACnB,GAAG,KAAK;YACR,8BAA8B,EAAE,KAAK,CAAC,wBAAwB;YAC9D,qBAAqB,EAAE,KAAK,CAAC,mBAAmB;YAChD,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,KAAK,CAAC,cAAc;YAClC,cAAc,EAAE,KAAK,CAAC,iBAAiB;SACxC,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,KAAK,GAA4B;QACrC,WAAW,EACT,WAAW,CAAC,kBAAkB,GAAG,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE,CAAC;QACzE,sBAAsB,EAAE,CAAC;QACzB,0BAA0B,EAAE,CAAC;QAC7B,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC;QAC1D,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK;QACrC,IAAI,EAAE,WAAW,CAAC,IAAI;KACvB,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,WAAW,EAAE,wBAAY;QACzB,KAAK;QACL,YAAY;QACZ,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC,CAAC;AAjDW,QAAA,mCAAmC,uCAiD9C"}
@@ -0,0 +1,5 @@
1
+ export declare class Constants {
2
+ static TICK_SPACING: bigint;
3
+ static MAX_LIQUIDITY_PER_TICK: bigint;
4
+ static COMMUNITY_FEE_DENOMINATOR: bigint;
5
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Constants = void 0;
4
+ class Constants {
5
+ }
6
+ exports.Constants = Constants;
7
+ Constants.TICK_SPACING = 60n;
8
+ Constants.MAX_LIQUIDITY_PER_TICK = 11505743598341114571880798222544994n;
9
+ Constants.COMMUNITY_FEE_DENOMINATOR = 1000n;
10
+ //# sourceMappingURL=Constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../../../src/dex/algebra/lib/Constants.ts"],"names":[],"mappings":";;;AAAA,MAAa,SAAS;;AAAtB,8BAIC;AAHQ,sBAAY,GAAG,GAAG,CAAC;AACnB,gCAAsB,GAAG,oCAAoC,CAAC;AAC9D,mCAAyB,GAAG,KAAK,CAAC"}
@@ -0,0 +1,19 @@
1
+ interface Timepoint {
2
+ initialized: boolean;
3
+ blockTimestamp: bigint;
4
+ tickCumulative: bigint;
5
+ secondsPerLiquidityCumulative: bigint;
6
+ }
7
+ export declare const TIMEPOINT_ZERO: Timepoint;
8
+ export declare class DataStorage {
9
+ static WINDOW: bigint;
10
+ static UINT16_MODULO: bigint;
11
+ static _volatilityOnRange(dt: bigint, tick0: bigint, tick1: bigint, avgTick0: bigint, avgTick1: bigint): bigint;
12
+ static createNewTimepoint(last: Timepoint, blockTimestamp: bigint, tick: bigint, prevTick: bigint, liquidity: bigint): Timepoint;
13
+ static lteConsideringOverflow(a: bigint, b: bigint, currentTime: bigint): boolean;
14
+ static _getAverageTick(self: Record<number, Timepoint>, time: bigint, tick: bigint, index: bigint, oldestIndex: bigint, lastTimestamp: bigint, lastTickCumulative: bigint): bigint;
15
+ static binarySearch(self: Record<number, Timepoint>, time: bigint, target: bigint, lastIndex: bigint, oldestIndex: bigint): [Timepoint, Timepoint];
16
+ static getSingleTimepoint(self: Record<number, Timepoint>, time: bigint, secondsAgo: bigint, tick: bigint, index: bigint, oldestIndex: bigint, liquidity: bigint): Timepoint;
17
+ static write(self: Record<number, Timepoint>, index: bigint, blockTimestamp: bigint, tick: bigint, liquidity: bigint): bigint;
18
+ }
19
+ export {};