@paraswap/dex-lib 2.42.27 → 2.42.29-wombat.2

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 (153) hide show
  1. package/build/abi/solidly-v3/SolidlyV3Pool.abi.json +738 -0
  2. package/build/abi/solidly-v3/SolidlyV3StateMulticall.abi.json +375 -0
  3. package/build/abi/trader-joe-v2_1/FactoryABI.json +0 -0
  4. package/build/abi/trader-joe-v2_1/PairABI.json +1493 -0
  5. package/build/abi/trader-joe-v2_1/RouterABI.json +1489 -0
  6. package/build/abi/wombat/pool-v2.json +1289 -0
  7. package/build/abi/wombat/pool-v3.json +2013 -0
  8. package/build/config.js +2 -2
  9. package/build/dex/index.js +4 -1
  10. package/build/dex/index.js.map +1 -1
  11. package/build/dex/solidly-v3/config.d.ts +9 -0
  12. package/build/dex/solidly-v3/config.js +58 -0
  13. package/build/dex/solidly-v3/config.js.map +1 -0
  14. package/build/dex/solidly-v3/constants.d.ts +27 -0
  15. package/build/dex/solidly-v3/constants.js +34 -0
  16. package/build/dex/solidly-v3/constants.js.map +1 -0
  17. package/build/dex/solidly-v3/contract-math/BitMath.d.ts +4 -0
  18. package/build/dex/solidly-v3/contract-math/BitMath.js +93 -0
  19. package/build/dex/solidly-v3/contract-math/BitMath.js.map +1 -0
  20. package/build/dex/solidly-v3/contract-math/FixedPoint128.d.ts +3 -0
  21. package/build/dex/solidly-v3/contract-math/FixedPoint128.js +8 -0
  22. package/build/dex/solidly-v3/contract-math/FixedPoint128.js.map +1 -0
  23. package/build/dex/solidly-v3/contract-math/FixedPoint96.d.ts +4 -0
  24. package/build/dex/solidly-v3/contract-math/FixedPoint96.js +9 -0
  25. package/build/dex/solidly-v3/contract-math/FixedPoint96.js.map +1 -0
  26. package/build/dex/solidly-v3/contract-math/FullMath.d.ts +4 -0
  27. package/build/dex/solidly-v3/contract-math/FullMath.js +19 -0
  28. package/build/dex/solidly-v3/contract-math/FullMath.js.map +1 -0
  29. package/build/dex/solidly-v3/contract-math/LiquidityMath.d.ts +3 -0
  30. package/build/dex/solidly-v3/contract-math/LiquidityMath.js +22 -0
  31. package/build/dex/solidly-v3/contract-math/LiquidityMath.js.map +1 -0
  32. package/build/dex/solidly-v3/contract-math/SqrtPriceMath.d.ts +10 -0
  33. package/build/dex/solidly-v3/contract-math/SqrtPriceMath.js +91 -0
  34. package/build/dex/solidly-v3/contract-math/SqrtPriceMath.js.map +1 -0
  35. package/build/dex/solidly-v3/contract-math/SwapMath.d.ts +8 -0
  36. package/build/dex/solidly-v3/contract-math/SwapMath.js +70 -0
  37. package/build/dex/solidly-v3/contract-math/SwapMath.js.map +1 -0
  38. package/build/dex/solidly-v3/contract-math/Tick.d.ts +7 -0
  39. package/build/dex/solidly-v3/contract-math/Tick.js +36 -0
  40. package/build/dex/solidly-v3/contract-math/Tick.js.map +1 -0
  41. package/build/dex/solidly-v3/contract-math/TickBitMap.d.ts +7 -0
  42. package/build/dex/solidly-v3/contract-math/TickBitMap.js +84 -0
  43. package/build/dex/solidly-v3/contract-math/TickBitMap.js.map +1 -0
  44. package/build/dex/solidly-v3/contract-math/TickMath.d.ts +8 -0
  45. package/build/dex/solidly-v3/contract-math/TickMath.js +162 -0
  46. package/build/dex/solidly-v3/contract-math/TickMath.js.map +1 -0
  47. package/build/dex/solidly-v3/contract-math/UnsafeMath.d.ts +3 -0
  48. package/build/dex/solidly-v3/contract-math/UnsafeMath.js +10 -0
  49. package/build/dex/solidly-v3/contract-math/UnsafeMath.js.map +1 -0
  50. package/build/dex/solidly-v3/contract-math/uniswap-v3-math.d.ts +31 -0
  51. package/build/dex/solidly-v3/contract-math/uniswap-v3-math.js +363 -0
  52. package/build/dex/solidly-v3/contract-math/uniswap-v3-math.js.map +1 -0
  53. package/build/dex/solidly-v3/contract-math/utils.d.ts +7 -0
  54. package/build/dex/solidly-v3/contract-math/utils.js +39 -0
  55. package/build/dex/solidly-v3/contract-math/utils.js.map +1 -0
  56. package/build/dex/solidly-v3/solidly-v3-factory.d.ts +26 -0
  57. package/build/dex/solidly-v3/solidly-v3-factory.js +44 -0
  58. package/build/dex/solidly-v3/solidly-v3-factory.js.map +1 -0
  59. package/build/dex/solidly-v3/solidly-v3-pool.d.ts +44 -0
  60. package/build/dex/solidly-v3/solidly-v3-pool.js +298 -0
  61. package/build/dex/solidly-v3/solidly-v3-pool.js.map +1 -0
  62. package/build/dex/solidly-v3/solidly-v3.d.ts +67 -0
  63. package/build/dex/solidly-v3/solidly-v3.js +590 -0
  64. package/build/dex/solidly-v3/solidly-v3.js.map +1 -0
  65. package/build/dex/solidly-v3/types.d.ts +132 -0
  66. package/build/dex/solidly-v3/types.js +9 -0
  67. package/build/dex/solidly-v3/types.js.map +1 -0
  68. package/build/dex/solidly-v3/utils.d.ts +6 -0
  69. package/build/dex/solidly-v3/utils.js +53 -0
  70. package/build/dex/solidly-v3/utils.js.map +1 -0
  71. package/build/dex/trader-joe-v2-1-2/config.d.ts +4 -0
  72. package/build/dex/trader-joe-v2-1-2/config.js +43 -0
  73. package/build/dex/trader-joe-v2-1-2/config.js.map +1 -0
  74. package/build/dex/trader-joe-v2-1-2/constants.d.ts +17 -0
  75. package/build/dex/trader-joe-v2-1-2/constants.js +19 -0
  76. package/build/dex/trader-joe-v2-1-2/constants.js.map +1 -0
  77. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.d.ts +60 -0
  78. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js +199 -0
  79. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2-pool.js.map +1 -0
  80. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.d.ts +49 -0
  81. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js +269 -0
  82. package/build/dex/trader-joe-v2-1-2/trader-joe-v2-1-2.js.map +1 -0
  83. package/build/dex/trader-joe-v2-1-2/types.d.ts +81 -0
  84. package/build/dex/trader-joe-v2-1-2/types.js +9 -0
  85. package/build/dex/trader-joe-v2-1-2/types.js.map +1 -0
  86. package/build/dex/trader-joe-v2_1/config.d.ts +4 -0
  87. package/build/dex/trader-joe-v2_1/config.js +43 -0
  88. package/build/dex/trader-joe-v2_1/config.js.map +1 -0
  89. package/build/dex/trader-joe-v2_1/constants.d.ts +16 -0
  90. package/build/dex/trader-joe-v2_1/constants.js +18 -0
  91. package/build/dex/trader-joe-v2_1/constants.js.map +1 -0
  92. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.d.ts +0 -0
  93. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js +384 -0
  94. package/build/dex/trader-joe-v2_1/trader-joe-v2.1.js.map +1 -0
  95. package/build/dex/trader-joe-v2_1/types.d.ts +39 -0
  96. package/build/dex/trader-joe-v2_1/types.js +3 -0
  97. package/build/dex/trader-joe-v2_1/types.js.map +1 -0
  98. package/build/dex/wombat/types.d.ts +2 -0
  99. package/build/dex/wombat/utils.d.ts +1 -0
  100. package/build/dex/wombat/utils.js +14 -1
  101. package/build/dex/wombat/utils.js.map +1 -1
  102. package/build/dex/wombat/wombat-bmw.d.ts +2 -2
  103. package/build/dex/wombat/wombat-bmw.js +8 -25
  104. package/build/dex/wombat/wombat-bmw.js.map +1 -1
  105. package/build/dex/wombat/wombat-pool-poller.d.ts +22 -0
  106. package/build/dex/wombat/wombat-pool-poller.js +164 -0
  107. package/build/dex/wombat/wombat-pool-poller.js.map +1 -0
  108. package/build/dex/wombat/wombat-pool.d.ts +51 -17
  109. package/build/dex/wombat/wombat-pool.js +393 -112
  110. package/build/dex/wombat/wombat-pool.js.map +1 -1
  111. package/build/dex/wombat/wombat.d.ts +1 -1
  112. package/build/dex/wombat/wombat.js +12 -18
  113. package/build/dex/wombat/wombat.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/abi/solidly-v3/SolidlyV3Pool.abi.json +738 -0
  116. package/src/abi/solidly-v3/SolidlyV3StateMulticall.abi.json +375 -0
  117. package/src/abi/wombat/pool-v3.json +2013 -0
  118. package/src/config.ts +2 -2
  119. package/src/dex/index.ts +4 -1
  120. package/src/dex/solidly-v3/config.ts +64 -0
  121. package/src/dex/solidly-v3/constants.ts +42 -0
  122. package/src/dex/solidly-v3/contract-math/BitMath.ts +90 -0
  123. package/src/dex/solidly-v3/contract-math/FixedPoint128.ts +3 -0
  124. package/src/dex/solidly-v3/contract-math/FixedPoint96.ts +4 -0
  125. package/src/dex/solidly-v3/contract-math/FullMath.ts +30 -0
  126. package/src/dex/solidly-v3/contract-math/LiquidityMath.ts +17 -0
  127. package/src/dex/solidly-v3/contract-math/SqrtPriceMath.ts +226 -0
  128. package/src/dex/solidly-v3/contract-math/SwapMath.ts +139 -0
  129. package/src/dex/solidly-v3/contract-math/Tick.ts +66 -0
  130. package/src/dex/solidly-v3/contract-math/TickBitMap.ts +123 -0
  131. package/src/dex/solidly-v3/contract-math/TickMath.ts +211 -0
  132. package/src/dex/solidly-v3/contract-math/UnsafeMath.ts +5 -0
  133. package/src/dex/solidly-v3/contract-math/uniswap-v3-math.ts +570 -0
  134. package/src/dex/solidly-v3/contract-math/utils.ts +50 -0
  135. package/src/dex/solidly-v3/solidly-v3-e2e.test.ts +124 -0
  136. package/src/dex/solidly-v3/solidly-v3-events.test.ts +144 -0
  137. package/src/dex/solidly-v3/solidly-v3-factory.ts +73 -0
  138. package/src/dex/solidly-v3/solidly-v3-integration.test.ts +358 -0
  139. package/src/dex/solidly-v3/solidly-v3-pool.ts +494 -0
  140. package/src/dex/solidly-v3/solidly-v3.ts +988 -0
  141. package/src/dex/solidly-v3/types.ts +158 -0
  142. package/src/dex/solidly-v3/utils.ts +71 -0
  143. package/src/dex/uniswap-v3/uniswap-v3-events.test.ts +3 -0
  144. package/src/dex/wombat/types.ts +5 -0
  145. package/src/dex/wombat/utils.ts +20 -0
  146. package/src/dex/wombat/wombat-bmw.ts +8 -31
  147. package/src/dex/wombat/wombat-e2e.test.ts +13 -1
  148. package/src/dex/wombat/wombat-events.test.ts +147 -0
  149. package/src/dex/wombat/wombat-integration.test.ts +101 -111
  150. package/src/dex/wombat/wombat-pool.ts +620 -171
  151. package/src/dex/wombat/wombat.ts +13 -23
  152. package/tests/constants-e2e.ts +11 -1
  153. /package/src/abi/wombat/{pool.json → pool-v2.json} +0 -0
@@ -0,0 +1,66 @@
1
+ import { PoolState, TickInfo } from '../types';
2
+ import { LiquidityMath } from './LiquidityMath';
3
+ import { _require } from '../../../utils';
4
+ import { NumberAsString } from '@paraswap/core';
5
+ import { ZERO_TICK_INFO } from '../constants';
6
+
7
+ export class Tick {
8
+ static update(
9
+ state: Pick<PoolState, 'ticks'>,
10
+ tick: bigint,
11
+ liquidityDelta: bigint,
12
+ upper: boolean,
13
+ maxLiquidity: bigint,
14
+ ): boolean {
15
+ let info = state.ticks[Number(tick)];
16
+
17
+ if (info === undefined) {
18
+ info = { ...ZERO_TICK_INFO };
19
+ state.ticks[Number(tick)] = info;
20
+ }
21
+
22
+ const liquidityGrossBefore = info.liquidityGross;
23
+ const liquidityGrossAfter = LiquidityMath.addDelta(
24
+ liquidityGrossBefore,
25
+ liquidityDelta,
26
+ );
27
+
28
+ _require(
29
+ liquidityGrossAfter <= maxLiquidity,
30
+ 'LO',
31
+ { liquidityGrossAfter, maxLiquidity },
32
+ 'liquidityGrossAfter <= maxLiquidity',
33
+ );
34
+
35
+ const flipped = (liquidityGrossAfter == 0n) != (liquidityGrossBefore == 0n);
36
+
37
+ if (liquidityGrossBefore == 0n) {
38
+ info.initialized = true;
39
+ }
40
+
41
+ info.liquidityGross = liquidityGrossAfter;
42
+
43
+ info.liquidityNet = upper
44
+ ? BigInt.asIntN(
45
+ 128,
46
+ BigInt.asIntN(256, info.liquidityNet) - liquidityDelta,
47
+ )
48
+ : BigInt.asIntN(
49
+ 128,
50
+ BigInt.asIntN(256, info.liquidityNet) + liquidityDelta,
51
+ );
52
+ return flipped;
53
+ }
54
+
55
+ static clear(state: Pick<PoolState, 'ticks'>, tick: bigint) {
56
+ delete state.ticks[Number(tick)];
57
+ }
58
+
59
+ static cross(
60
+ ticks: Record<NumberAsString, TickInfo>,
61
+ tick: bigint,
62
+ ): bigint {
63
+ const info = ticks[Number(tick)];
64
+ return info.liquidityNet;
65
+ }
66
+ }
@@ -0,0 +1,123 @@
1
+ import { BI_MAX_UINT8 } from '../../../bigint-constants';
2
+ import { PoolState } from '../types';
3
+ import { BitMath } from './BitMath';
4
+ import { _require } from '../../../utils';
5
+ import { DeepReadonly } from 'ts-essentials';
6
+ import {
7
+ OUT_OF_RANGE_ERROR_POSTFIX,
8
+ TICK_BITMAP_BUFFER,
9
+ TICK_BITMAP_TO_USE,
10
+ } from '../constants';
11
+
12
+ function isWordPosOut(
13
+ wordPos: bigint,
14
+ startTickBitmap: bigint,
15
+ // For pricing we use wider range to check price impact. If function called from event
16
+ // it must always be within buffer
17
+ isPriceQuery: boolean,
18
+ ) {
19
+ let lowerTickBitmapLimit;
20
+ let upperTickBitmapLimit;
21
+
22
+ if (isPriceQuery) {
23
+ lowerTickBitmapLimit =
24
+ startTickBitmap - (TICK_BITMAP_BUFFER + TICK_BITMAP_TO_USE);
25
+ upperTickBitmapLimit =
26
+ startTickBitmap + (TICK_BITMAP_BUFFER + TICK_BITMAP_TO_USE);
27
+ } else {
28
+ lowerTickBitmapLimit = startTickBitmap - TICK_BITMAP_BUFFER;
29
+ upperTickBitmapLimit = startTickBitmap + TICK_BITMAP_BUFFER;
30
+ }
31
+
32
+ _require(
33
+ wordPos >= lowerTickBitmapLimit && wordPos <= upperTickBitmapLimit,
34
+ `wordPos is out of safe state tickBitmap request range: ${OUT_OF_RANGE_ERROR_POSTFIX}`,
35
+ { wordPos },
36
+ `wordPos >= LOWER_TICK_REQUEST_LIMIT && wordPos <= UPPER_TICK_REQUEST_LIMIT`,
37
+ );
38
+ }
39
+
40
+ export class TickBitMap {
41
+ static position(tick: bigint): [bigint, bigint] {
42
+ return [BigInt.asIntN(16, tick >> 8n), BigInt.asUintN(8, tick % 256n)];
43
+ }
44
+
45
+ static flipTick(
46
+ state: Pick<PoolState, 'startTickBitmap' | 'tickBitmap'>,
47
+ tick: bigint,
48
+ tickSpacing: bigint,
49
+ ) {
50
+ _require(
51
+ tick % tickSpacing === 0n,
52
+ '',
53
+ { tick, tickSpacing },
54
+ 'tick % tickSpacing == 0n,',
55
+ );
56
+ const [wordPos, bitPos] = TickBitMap.position(tick / tickSpacing);
57
+ const mask = 1n << bitPos;
58
+
59
+ // flipTick is used only in _updatePosition which is always state changing event
60
+ // Therefore it is never used in price query
61
+ isWordPosOut(wordPos, state.startTickBitmap, false);
62
+
63
+ const stringWordPos = wordPos.toString();
64
+ if (state.tickBitmap[stringWordPos] === undefined) {
65
+ state.tickBitmap[stringWordPos] = 0n;
66
+ }
67
+
68
+ state.tickBitmap[stringWordPos] ^= mask;
69
+ }
70
+
71
+ static nextInitializedTickWithinOneWord(
72
+ state: DeepReadonly<Pick<PoolState, 'startTickBitmap' | 'tickBitmap'>>,
73
+ tick: bigint,
74
+ tickSpacing: bigint,
75
+ lte: boolean,
76
+ isPriceQuery: boolean,
77
+ ): [bigint, boolean] {
78
+ let compressed = tick / tickSpacing;
79
+ if (tick < 0n && tick % tickSpacing != 0n) compressed--;
80
+
81
+ let next = 0n;
82
+ let initialized = false;
83
+
84
+ if (lte) {
85
+ const [wordPos, bitPos] = TickBitMap.position(compressed);
86
+ const mask = (1n << bitPos) - 1n + (1n << bitPos);
87
+
88
+ isWordPosOut(wordPos, state.startTickBitmap, isPriceQuery);
89
+ let tickBitmapValue = state.tickBitmap[wordPos.toString()];
90
+ tickBitmapValue = tickBitmapValue === undefined ? 0n : tickBitmapValue;
91
+
92
+ const masked = tickBitmapValue & mask;
93
+
94
+ initialized = masked != 0n;
95
+ next = initialized
96
+ ? (compressed -
97
+ BigInt.asIntN(24, bitPos - BitMath.mostSignificantBit(masked))) *
98
+ tickSpacing
99
+ : (compressed - BigInt.asIntN(24, bitPos)) * tickSpacing;
100
+ } else {
101
+ // start from the word of the next tick, since the current tick state doesn't matter
102
+ const [wordPos, bitPos] = TickBitMap.position(compressed + 1n);
103
+ const mask = ~((1n << bitPos) - 1n);
104
+
105
+ isWordPosOut(wordPos, state.startTickBitmap, isPriceQuery);
106
+ let tickBitmapValue = state.tickBitmap[wordPos.toString()];
107
+ tickBitmapValue = tickBitmapValue === undefined ? 0n : tickBitmapValue;
108
+
109
+ const masked = tickBitmapValue & mask;
110
+
111
+ initialized = masked != 0n;
112
+ next = initialized
113
+ ? (compressed +
114
+ 1n +
115
+ BigInt.asIntN(24, BitMath.leastSignificantBit(masked) - bitPos)) *
116
+ tickSpacing
117
+ : (compressed + 1n + BigInt.asIntN(24, BI_MAX_UINT8 - bitPos)) *
118
+ tickSpacing;
119
+ }
120
+
121
+ return [next, initialized];
122
+ }
123
+ }
@@ -0,0 +1,211 @@
1
+ import { gt } from 'lodash';
2
+ import { BI_MAX_UINT256 } from '../../../bigint-constants';
3
+ import { _gt } from './utils';
4
+ import { _require } from '../../../utils';
5
+
6
+ export class TickMath {
7
+ static readonly MIN_TICK = -887272n;
8
+ static readonly MAX_TICK = -TickMath.MIN_TICK;
9
+ static readonly MIN_SQRT_RATIO = 4295128739n;
10
+ static readonly MAX_SQRT_RATIO =
11
+ 1461446703485210103287273052203988822378723970342n;
12
+
13
+ static getSqrtRatioAtTick(tick: bigint): bigint {
14
+ const absTick =
15
+ tick < 0n
16
+ ? BigInt.asUintN(256, -BigInt.asIntN(256, tick))
17
+ : BigInt.asUintN(256, BigInt.asIntN(256, tick));
18
+ _require(
19
+ absTick <= BigInt.asUintN(256, TickMath.MAX_TICK),
20
+ 'T',
21
+ { absTick },
22
+ 'absTick <= BigInt.asUintN(256, TickMath.MAX_TICK)',
23
+ );
24
+
25
+ let ratio =
26
+ (absTick & 0x1n) !== 0n
27
+ ? 0xfffcb933bd6fad37aa2d162d1a594001n
28
+ : 0x100000000000000000000000000000000n;
29
+ if ((absTick & 0x2n) !== 0n)
30
+ ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;
31
+ if ((absTick & 0x4n) !== 0n)
32
+ ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;
33
+ if ((absTick & 0x8n) !== 0n)
34
+ ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;
35
+ if ((absTick & 0x10n) !== 0n)
36
+ ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;
37
+ if ((absTick & 0x20n) !== 0n)
38
+ ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;
39
+ if ((absTick & 0x40n) !== 0n)
40
+ ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;
41
+ if ((absTick & 0x80n) !== 0n)
42
+ ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;
43
+ if ((absTick & 0x100n) !== 0n)
44
+ ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;
45
+ if ((absTick & 0x200n) !== 0n)
46
+ ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;
47
+ if ((absTick & 0x400n) !== 0n)
48
+ ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;
49
+ if ((absTick & 0x800n) !== 0n)
50
+ ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;
51
+ if ((absTick & 0x1000n) !== 0n)
52
+ ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;
53
+ if ((absTick & 0x2000n) !== 0n)
54
+ ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;
55
+ if ((absTick & 0x4000n) !== 0n)
56
+ ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;
57
+ if ((absTick & 0x8000n) !== 0n)
58
+ ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;
59
+ if ((absTick & 0x10000n) !== 0n)
60
+ ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;
61
+ if ((absTick & 0x20000n) !== 0n)
62
+ ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;
63
+ if ((absTick & 0x40000n) !== 0n)
64
+ ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;
65
+ if ((absTick & 0x80000n) !== 0n)
66
+ ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;
67
+
68
+ if (tick > 0) ratio = BI_MAX_UINT256 / ratio;
69
+ return BigInt.asUintN(
70
+ 160,
71
+ (ratio >> 32n) + (ratio % (1n << 32n) == 0n ? 0n : 1n),
72
+ );
73
+ }
74
+
75
+ static getTickAtSqrtRatio(sqrtPriceX96: bigint): bigint {
76
+ _require(
77
+ sqrtPriceX96 >= TickMath.MIN_SQRT_RATIO &&
78
+ sqrtPriceX96 < TickMath.MAX_SQRT_RATIO,
79
+ 'R',
80
+ { sqrtPriceX96 },
81
+ 'sqrtPriceX96 >= TickMath.MIN_SQRT_RATIO && sqrtPriceX96 < TickMath.MAX_SQRT_RATIO',
82
+ );
83
+
84
+ let ratio = BigInt.asUintN(256, sqrtPriceX96) << 32n;
85
+
86
+ let r = ratio;
87
+ let msb = 0n;
88
+
89
+ let f = _gt(r, 0xffffffffffffffffffffffffffffffffn) << 7n;
90
+ msb = msb | f;
91
+ r = r >> f;
92
+
93
+ f = _gt(r, 0xffffffffffffffffn) << 6n;
94
+ msb = msb | f;
95
+ r = r >> f;
96
+
97
+ f = _gt(r, 0xffffffffn) << 5n;
98
+ msb = msb | f;
99
+ r = r >> f;
100
+
101
+ f = _gt(r, 0xffffn) << 4n;
102
+ msb = msb | f;
103
+ r = r >> f;
104
+
105
+ f = _gt(r, 0xffn) << 3n;
106
+ msb = msb | f;
107
+ r = r >> f;
108
+
109
+ f = _gt(r, 0xfn) << 2n;
110
+ msb = msb | f;
111
+ r = r >> f;
112
+
113
+ f = _gt(r, 0x3n) << 1n;
114
+ msb = msb | f;
115
+ r = r >> f;
116
+
117
+ f = _gt(r, 0x1n);
118
+ msb = msb | f;
119
+
120
+ if (msb >= 128n) r = ratio >> (msb - 127n);
121
+ else r = ratio << (127n - msb);
122
+
123
+ let log_2 = (BigInt.asIntN(256, msb) - 128n) << 64n;
124
+
125
+ r = (r * r) >> 127n;
126
+ f = r >> 128n;
127
+ log_2 = log_2 | (f << 63n);
128
+ r = r >> f;
129
+
130
+ r = (r * r) >> 127n;
131
+ f = r >> 128n;
132
+ log_2 = log_2 | (f << 62n);
133
+ r = r >> f;
134
+
135
+ r = (r * r) >> 127n;
136
+ f = r >> 128n;
137
+ log_2 = log_2 | (f << 61n);
138
+ r = r >> f;
139
+
140
+ r = (r * r) >> 127n;
141
+ f = r >> 128n;
142
+ log_2 = log_2 | (f << 60n);
143
+ r = r >> f;
144
+
145
+ r = (r * r) >> 127n;
146
+ f = r >> 128n;
147
+ log_2 = log_2 | (f << 59n);
148
+ r = r >> f;
149
+
150
+ r = (r * r) >> 127n;
151
+ f = r >> 128n;
152
+ log_2 = log_2 | (f << 58n);
153
+ r = r >> f;
154
+
155
+ r = (r * r) >> 127n;
156
+ f = r >> 128n;
157
+ log_2 = log_2 | (f << 57n);
158
+ r = r >> f;
159
+
160
+ r = (r * r) >> 127n;
161
+ f = r >> 128n;
162
+ log_2 = log_2 | (f << 56n);
163
+ r = r >> f;
164
+
165
+ r = (r * r) >> 127n;
166
+ f = r >> 128n;
167
+ log_2 = log_2 | (f << 55n);
168
+ r = r >> f;
169
+
170
+ r = (r * r) >> 127n;
171
+ f = r >> 128n;
172
+ log_2 = log_2 | (f << 54n);
173
+ r = r >> f;
174
+
175
+ r = (r * r) >> 127n;
176
+ f = r >> 128n;
177
+ log_2 = log_2 | (f << 53n);
178
+ r = r >> f;
179
+
180
+ r = (r * r) >> 127n;
181
+ f = r >> 128n;
182
+ log_2 = log_2 | (f << 52n);
183
+ r = r >> f;
184
+
185
+ r = (r * r) >> 127n;
186
+ f = r >> 128n;
187
+ log_2 = log_2 | (f << 51n);
188
+ r = r >> f;
189
+
190
+ r = (r * r) >> 127n;
191
+ f = r >> 128n;
192
+ log_2 = log_2 | (f << 50n);
193
+
194
+ const log_sqrt10001 = log_2 * 255738958999603826347141n; // 128.128 number
195
+
196
+ const tickLow = BigInt.asIntN(
197
+ 24,
198
+ (log_sqrt10001 - 3402992956809132418596140100660247210n) >> 128n,
199
+ );
200
+ const tickHi = BigInt.asIntN(
201
+ 24,
202
+ (log_sqrt10001 + 291339464771989622907027621153398088495n) >> 128n,
203
+ );
204
+
205
+ return tickLow === tickHi
206
+ ? tickLow
207
+ : TickMath.getSqrtRatioAtTick(tickHi) <= sqrtPriceX96
208
+ ? tickHi
209
+ : tickLow;
210
+ }
211
+ }
@@ -0,0 +1,5 @@
1
+ export class UnsafeMath {
2
+ static divRoundingUp(x: bigint, y: bigint) {
3
+ return (x + y - 1n) / y;
4
+ }
5
+ }