@paraswap/dex-lib 3.6.2 → 3.6.3

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 (109) hide show
  1. package/build/dex/aave-v1/aave-v1.d.ts +1 -2
  2. package/build/dex/aave-v1/aave-v1.js +0 -23
  3. package/build/dex/aave-v1/aave-v1.js.map +1 -1
  4. package/build/dex/compound.js +1 -1
  5. package/build/dex/compound.js.map +1 -1
  6. package/build/dex/etherfi/etherfi.d.ts +26 -0
  7. package/build/dex/etherfi/etherfi.js +96 -0
  8. package/build/dex/etherfi/etherfi.js.map +1 -0
  9. package/build/dex/index.js +2 -0
  10. package/build/dex/index.js.map +1 -1
  11. package/build/dex/maverick-v2/config.d.ts +2 -2
  12. package/build/dex/maverick-v2/config.js +16 -9
  13. package/build/dex/maverick-v2/config.js.map +1 -1
  14. package/build/dex/maverick-v2/maverick-math/maverick-basic-math.js +3 -3
  15. package/build/dex/maverick-v2/maverick-math/maverick-basic-math.js.map +1 -1
  16. package/build/dex/maverick-v2/maverick-math/maverick-bin-math.js +4 -4
  17. package/build/dex/maverick-v2/maverick-math/maverick-bin-math.js.map +1 -1
  18. package/build/dex/maverick-v2/maverick-math/maverick-math.js +3 -3
  19. package/build/dex/maverick-v2/maverick-math/maverick-math.js.map +1 -1
  20. package/build/dex/maverick-v2/maverick-math/maverick-pool-math.js +13 -13
  21. package/build/dex/maverick-v2/maverick-math/maverick-pool-math.js.map +1 -1
  22. package/build/dex/maverick-v2/maverick-math/maverick-swap-math.js +1 -1
  23. package/build/dex/maverick-v2/maverick-math/maverick-swap-math.js.map +1 -1
  24. package/build/dex/maverick-v2/maverick-math/maverick-tick-math.js +4 -4
  25. package/build/dex/maverick-v2/maverick-math/maverick-tick-math.js.map +1 -1
  26. package/build/dex/maverick-v2/maverick-math/maverick-twa-math.js +3 -3
  27. package/build/dex/maverick-v2/maverick-math/maverick-twa-math.js.map +1 -1
  28. package/build/dex/maverick-v2/maverick-v2-pool.d.ts +12 -9
  29. package/build/dex/maverick-v2/maverick-v2-pool.js +71 -16
  30. package/build/dex/maverick-v2/maverick-v2-pool.js.map +1 -1
  31. package/build/dex/maverick-v2/maverick-v2.d.ts +4 -8
  32. package/build/dex/maverick-v2/maverick-v2.js +62 -90
  33. package/build/dex/maverick-v2/maverick-v2.js.map +1 -1
  34. package/build/dex/maverick-v2/types.d.ts +1 -2
  35. package/build/dex/platypus/platypus.d.ts +1 -2
  36. package/build/dex/platypus/platypus.js +0 -45
  37. package/build/dex/platypus/platypus.js.map +1 -1
  38. package/build/dex/sdai/config.d.ts +11 -0
  39. package/build/dex/sdai/config.js +21 -0
  40. package/build/dex/sdai/config.js.map +1 -0
  41. package/build/dex/sdai/constants.d.ts +2 -0
  42. package/build/dex/sdai/constants.js +6 -0
  43. package/build/dex/sdai/constants.js.map +1 -0
  44. package/build/dex/sdai/scripts/validate-state.js +102 -0
  45. package/build/dex/sdai/scripts/validate-state.js.map +1 -0
  46. package/build/dex/sdai/sdai-pool.d.ts +16 -0
  47. package/build/dex/sdai/sdai-pool.js +85 -0
  48. package/build/dex/sdai/sdai-pool.js.map +1 -0
  49. package/build/dex/sdai/sdai.d.ts +51 -0
  50. package/build/dex/sdai/sdai.js +172 -0
  51. package/build/dex/sdai/sdai.js.map +1 -0
  52. package/build/dex/sdai/types.d.ts +21 -0
  53. package/build/dex/sdai/types.js +11 -0
  54. package/build/dex/sdai/types.js.map +1 -0
  55. package/build/dex/sdai/utils.d.ts +4 -0
  56. package/build/dex/sdai/utils.js +39 -0
  57. package/build/dex/sdai/utils.js.map +1 -0
  58. package/build/dex/stable-pool.js +8 -1
  59. package/build/dex/stable-pool.js.map +1 -1
  60. package/build/dex/swaap-v1/swaap-v1.d.ts +1 -2
  61. package/build/dex/swaap-v1/swaap-v1.js +0 -14
  62. package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
  63. package/package.json +1 -1
  64. package/src/abi/maverick-v2/MaverickV2Pool.json +1234 -0
  65. package/src/abi/maverick-v2/MaverickV2PoolLens.json +1232 -0
  66. package/src/abi/maverick-v2/MaverickV2Quoter.json +278 -0
  67. package/src/dex/index.ts +2 -0
  68. package/src/dex/maverick-v2/config.ts +28 -0
  69. package/src/dex/maverick-v2/maverick-math/maverick-basic-math.ts +152 -0
  70. package/src/dex/maverick-v2/maverick-math/maverick-bin-math.ts +288 -0
  71. package/src/dex/maverick-v2/maverick-math/maverick-delta-math.ts +32 -0
  72. package/src/dex/maverick-v2/maverick-math/maverick-math.ts +30 -0
  73. package/src/dex/maverick-v2/maverick-math/maverick-pool-lib.ts +42 -0
  74. package/src/dex/maverick-v2/maverick-math/maverick-pool-math.ts +709 -0
  75. package/src/dex/maverick-v2/maverick-math/maverick-swap-math.ts +199 -0
  76. package/src/dex/maverick-v2/maverick-math/maverick-tick-math.ts +171 -0
  77. package/src/dex/maverick-v2/maverick-math/maverick-twa-math.ts +54 -0
  78. package/src/dex/maverick-v2/maverick-v2-e2e.test.ts +193 -0
  79. package/src/dex/maverick-v2/maverick-v2-events.test.ts +112 -0
  80. package/src/dex/maverick-v2/maverick-v2-integration.test.ts +283 -0
  81. package/src/dex/maverick-v2/maverick-v2-pool.ts +346 -0
  82. package/src/dex/maverick-v2/maverick-v2.ts +380 -0
  83. package/src/dex/maverick-v2/types.ts +151 -0
  84. package/tests/constants-e2e.ts +2 -2
  85. package/.vscode/launch.json +0 -53
  86. package/.vscode/settings.json +0 -2
  87. package/.vscode/tasks.json +0 -15
  88. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
  89. package/build/abi/wombat/pool.json +0 -1289
  90. package/build/dex/aave-v2/tokens-avalanche.json +0 -44
  91. package/build/dex/aave-v2/tokens-mainnet.json +0 -188
  92. package/build/dex/aave-v2/tokens-polygon.json +0 -44
  93. package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
  94. package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
  95. package/build/dex/maker-psm/scripts/validate-state.js +0 -185
  96. package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
  97. package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
  98. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
  99. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
  100. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
  101. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
  102. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
  103. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
  104. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
  105. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
  106. package/src/dex/maker-psm/scripts/gem.abi.json +0 -136
  107. package/src/dex/maker-psm/scripts/validate-state.ts +0 -221
  108. package/src/dex/maker-psm/scripts/vat.abi.json +0 -243
  109. /package/build/dex/{solidly-v3/scripts/check-event-pool-event.d.ts → sdai/scripts/validate-state.d.ts} +0 -0
@@ -0,0 +1,199 @@
1
+ import { BI_POWS } from '../../../bigint-constants';
2
+ import { _require } from '../../../utils';
3
+ import { TickData } from '../types';
4
+ import { Delta } from './maverick-delta-math';
5
+ import { MaverickBasicMath } from './maverick-basic-math';
6
+
7
+ export class MaverickSwapMath {
8
+ static amountToBinNetOfProtocolFee(
9
+ deltaInErc: bigint,
10
+ feeBasis: bigint,
11
+ protocolFeeD3: bigint,
12
+ ): bigint {
13
+ return protocolFeeD3 != 0n
14
+ ? MaverickBasicMath.clip(
15
+ deltaInErc,
16
+ MaverickBasicMath.mulDivUp(feeBasis, protocolFeeD3, BI_POWS[3]),
17
+ )
18
+ : deltaInErc;
19
+ }
20
+
21
+ static remainingBinInputSpaceGivenOutput(
22
+ binLiquidity: bigint,
23
+ output: bigint,
24
+ sqrtPrice: bigint,
25
+ tokenAIn: boolean,
26
+ ): bigint {
27
+ let outOverL =
28
+ binLiquidity === 0n ? 0n : MaverickBasicMath.divUp(output, binLiquidity);
29
+
30
+ if (tokenAIn) {
31
+ return MaverickBasicMath.mulDivUp(
32
+ output,
33
+ sqrtPrice,
34
+ MaverickBasicMath.invFloor(sqrtPrice) - outOverL,
35
+ );
36
+ } else {
37
+ return MaverickBasicMath.divUp(
38
+ output,
39
+ MaverickBasicMath.mulDown(sqrtPrice, sqrtPrice - outOverL),
40
+ );
41
+ }
42
+ }
43
+
44
+ static computeSwapExactIn(
45
+ sqrtPrice: bigint,
46
+ tickData: TickData,
47
+ amountIn: bigint,
48
+ tokenAIn: boolean,
49
+ fee: bigint,
50
+ protocolFeeD3: bigint,
51
+ ): Delta {
52
+ let delta: Delta = {
53
+ deltaInBinInternal: 0n,
54
+ deltaInErc: 0n,
55
+ deltaOutErc: 0n,
56
+ excess: 0n,
57
+ tokenAIn: tokenAIn,
58
+ exactOutput: false,
59
+ swappedToMaxPrice: false,
60
+ skipCombine: false,
61
+ tickLimit: 0n,
62
+ sqrtLowerTickPrice: 0n,
63
+ sqrtUpperTickPrice: 0n,
64
+ sqrtPrice: 0n,
65
+ fractionalPart: 0n,
66
+ };
67
+
68
+ delta.deltaOutErc = tokenAIn
69
+ ? tickData.currentReserveB
70
+ : tickData.currentReserveA;
71
+
72
+ let binAmountIn = this.remainingBinInputSpaceGivenOutput(
73
+ tickData.currentLiquidity,
74
+ delta.deltaOutErc,
75
+ sqrtPrice,
76
+ tokenAIn,
77
+ );
78
+
79
+ let feeBasis;
80
+ let userBinAmountIn = MaverickBasicMath.mulDown(
81
+ amountIn,
82
+ BI_POWS[18] - fee,
83
+ );
84
+
85
+ if (userBinAmountIn < binAmountIn) {
86
+ binAmountIn = userBinAmountIn;
87
+ delta.deltaInErc = amountIn;
88
+ feeBasis = delta.deltaInErc - userBinAmountIn;
89
+ } else {
90
+ feeBasis = MaverickBasicMath.mulDivUp(
91
+ binAmountIn,
92
+ fee,
93
+ BI_POWS[18] - fee,
94
+ );
95
+ delta.deltaInErc = binAmountIn + feeBasis;
96
+ delta.excess = MaverickBasicMath.clip(amountIn, delta.deltaInErc);
97
+ }
98
+
99
+ delta.deltaInBinInternal = this.amountToBinNetOfProtocolFee(
100
+ delta.deltaInErc,
101
+ feeBasis,
102
+ protocolFeeD3,
103
+ );
104
+
105
+ if (delta.excess != 0n) return delta;
106
+
107
+ let inOverL = MaverickBasicMath.divUp(
108
+ binAmountIn,
109
+ tickData.currentLiquidity + 1n,
110
+ );
111
+
112
+ delta.deltaOutErc = MaverickBasicMath.min(
113
+ delta.deltaOutErc,
114
+ MaverickBasicMath.mulDivDown(
115
+ binAmountIn,
116
+ tokenAIn ? MaverickBasicMath.invFloor(sqrtPrice) : sqrtPrice,
117
+ inOverL + (tokenAIn ? sqrtPrice : MaverickBasicMath.invCeil(sqrtPrice)),
118
+ ),
119
+ );
120
+
121
+ return delta;
122
+ }
123
+
124
+ static computeSwapExactOut(
125
+ sqrtPrice: bigint,
126
+ tickData: TickData,
127
+ amountOut: bigint,
128
+ tokenAIn: boolean,
129
+ fee: bigint,
130
+ protocolFeeD3: bigint,
131
+ ): Delta {
132
+ let delta: Delta = {
133
+ deltaInBinInternal: 0n,
134
+ deltaInErc: 0n,
135
+ deltaOutErc: 0n,
136
+ excess: 0n,
137
+ tokenAIn: false,
138
+ exactOutput: false,
139
+ swappedToMaxPrice: false,
140
+ skipCombine: false,
141
+ tickLimit: 0n,
142
+ sqrtLowerTickPrice: 0n,
143
+ sqrtUpperTickPrice: 0n,
144
+ sqrtPrice: 0n,
145
+ fractionalPart: 0n,
146
+ };
147
+
148
+ let amountOutAvailable = tokenAIn
149
+ ? tickData.currentReserveB
150
+ : tickData.currentReserveA;
151
+ let swapped = amountOutAvailable <= amountOut;
152
+ delta.deltaOutErc = swapped ? amountOutAvailable : amountOut;
153
+ let binAmountIn = this.remainingBinInputSpaceGivenOutput(
154
+ tickData.currentLiquidity,
155
+ delta.deltaOutErc,
156
+ sqrtPrice,
157
+ tokenAIn,
158
+ );
159
+
160
+ let feeBasis = MaverickBasicMath.mulDivUp(
161
+ binAmountIn,
162
+ fee,
163
+ BI_POWS[18] - fee,
164
+ );
165
+ delta.deltaInErc = binAmountIn + feeBasis;
166
+ delta.deltaInBinInternal = this.amountToBinNetOfProtocolFee(
167
+ delta.deltaInErc,
168
+ feeBasis,
169
+ protocolFeeD3,
170
+ );
171
+ delta.excess = swapped
172
+ ? MaverickBasicMath.clip(amountOut, delta.deltaOutErc)
173
+ : 0n;
174
+
175
+ return delta;
176
+ }
177
+
178
+ static computeEndPrice(delta: Delta, newDelta: Delta, tickData: TickData) {
179
+ let endSqrtPrice =
180
+ MaverickBasicMath.divDown(
181
+ newDelta.deltaInBinInternal,
182
+ tickData.currentLiquidity,
183
+ ) +
184
+ (delta.tokenAIn
185
+ ? delta.sqrtPrice
186
+ : MaverickBasicMath.invFloor(delta.sqrtPrice));
187
+ if (!delta.tokenAIn) {
188
+ endSqrtPrice = MaverickBasicMath.invFloor(endSqrtPrice);
189
+ }
190
+
191
+ newDelta.fractionalPart = MaverickBasicMath.min(
192
+ BI_POWS[8],
193
+ MaverickBasicMath.divDown(
194
+ MaverickBasicMath.clip(endSqrtPrice, delta.sqrtLowerTickPrice),
195
+ BI_POWS[10] * (delta.sqrtUpperTickPrice - delta.sqrtLowerTickPrice),
196
+ ),
197
+ );
198
+ }
199
+ }
@@ -0,0 +1,171 @@
1
+ import { BI_MAX_UINT256, BI_POWS } from '../../../bigint-constants';
2
+ import { _require } from '../../../utils';
3
+ import { MaverickBasicMath } from './maverick-basic-math';
4
+
5
+ const MAX_TICK = 460540;
6
+
7
+ export class MaverickTickMath {
8
+ static getTickSqrtPriceAndL(
9
+ reserveA: bigint,
10
+ reserveB: bigint,
11
+ sqrtLowerTickPrice: bigint,
12
+ sqrtUpperTickPrice: bigint,
13
+ ): [bigint, bigint] {
14
+ let liquidity = this.getTickL(
15
+ reserveA,
16
+ reserveB,
17
+ sqrtLowerTickPrice,
18
+ sqrtUpperTickPrice,
19
+ );
20
+
21
+ let sqrtPrice = this.getSqrtPrice(
22
+ reserveA,
23
+ reserveB,
24
+ sqrtLowerTickPrice,
25
+ sqrtUpperTickPrice,
26
+ liquidity,
27
+ );
28
+
29
+ return [sqrtPrice, liquidity];
30
+ }
31
+
32
+ static getSqrtPrice(
33
+ reserveA: bigint,
34
+ reserveB: bigint,
35
+ sqrtLowerTickPrice: bigint,
36
+ sqrtUpperTickPrice: bigint,
37
+ liquidity: bigint,
38
+ ): bigint {
39
+ if (reserveA === 0n) {
40
+ return sqrtLowerTickPrice;
41
+ }
42
+ if (reserveB === 0n) {
43
+ return sqrtUpperTickPrice;
44
+ }
45
+
46
+ let sqrtPrice = MaverickBasicMath.sqrt(
47
+ BI_POWS[18] *
48
+ MaverickBasicMath.divDown(
49
+ reserveA + MaverickBasicMath.mulDown(liquidity, sqrtLowerTickPrice),
50
+ reserveB + MaverickBasicMath.divDown(liquidity, sqrtUpperTickPrice),
51
+ ),
52
+ );
53
+
54
+ return MaverickBasicMath.min(
55
+ MaverickBasicMath.max(sqrtPrice, sqrtLowerTickPrice),
56
+ sqrtUpperTickPrice,
57
+ );
58
+ }
59
+
60
+ static getTickL(
61
+ reserveA: bigint,
62
+ reserveB: bigint,
63
+ sqrtLowerTickPrice: bigint,
64
+ sqrtUpperTickPrice: bigint,
65
+ ): bigint {
66
+ let precisionBump = 0n;
67
+
68
+ if (reserveA >> 78n === 0n && reserveB >> 78n === 0n) {
69
+ precisionBump = 57n;
70
+ reserveA <<= precisionBump;
71
+ reserveB <<= precisionBump;
72
+ }
73
+
74
+ let diff;
75
+ let b =
76
+ MaverickBasicMath.divDown(reserveA, sqrtUpperTickPrice) +
77
+ MaverickBasicMath.mulDown(reserveB, sqrtLowerTickPrice);
78
+ diff = sqrtUpperTickPrice - sqrtLowerTickPrice;
79
+
80
+ if (reserveA === 0n || reserveB === 0n)
81
+ return (
82
+ MaverickBasicMath.mulDivDown(b, sqrtUpperTickPrice, diff) >>
83
+ precisionBump
84
+ );
85
+
86
+ b >>= 1n;
87
+
88
+ return (
89
+ MaverickBasicMath.mulDiv(
90
+ b +
91
+ MaverickBasicMath.sqrt(
92
+ MaverickBasicMath.mulDiv(b, b, BI_POWS[18]) +
93
+ MaverickBasicMath.mulDiv(
94
+ MaverickBasicMath.mulFloor(reserveB, reserveA),
95
+ diff,
96
+ sqrtUpperTickPrice,
97
+ ),
98
+ ) *
99
+ BI_POWS[9],
100
+ sqrtUpperTickPrice,
101
+ diff,
102
+ ) >> precisionBump
103
+ );
104
+ }
105
+
106
+ static tickSqrtPrices(tickSpacing: bigint, tick: bigint): [bigint, bigint] {
107
+ return [
108
+ this.tickSqrtPrice(tickSpacing, tick),
109
+ this.tickSqrtPrice(tickSpacing, tick + 1n),
110
+ ];
111
+ }
112
+
113
+ static subTickIndex(tickSpacing: bigint, tick: bigint): bigint {
114
+ let subTick = MaverickBasicMath.abs(tick);
115
+ subTick *= tickSpacing;
116
+ if (subTick > MAX_TICK) {
117
+ throw new Error('OB');
118
+ }
119
+ return subTick;
120
+ }
121
+
122
+ static tickSqrtPrice(tickSpacing: bigint, _tick: bigint): bigint {
123
+ let tick = this.subTickIndex(tickSpacing, _tick);
124
+
125
+ let ratio: bigint =
126
+ (tick & 0x1n) != 0n
127
+ ? 0xfffcb933bd6fad9d3af5f0b9f25db4d6n
128
+ : 0x100000000000000000000000000000000n;
129
+ if ((tick & 0x2n) != 0n)
130
+ ratio = (ratio * 0xfff97272373d41fd789c8cb37ffcaa1cn) >> 128n;
131
+ if ((tick & 0x4n) != 0n)
132
+ ratio = (ratio * 0xfff2e50f5f656ac9229c67059486f389n) >> 128n;
133
+ if ((tick & 0x8n) != 0n)
134
+ ratio = (ratio * 0xffe5caca7e10e81259b3cddc7a064941n) >> 128n;
135
+ if ((tick & 0x10n) != 0n)
136
+ ratio = (ratio * 0xffcb9843d60f67b19e8887e0bd251eb7n) >> 128n;
137
+ if ((tick & 0x20n) != 0n)
138
+ ratio = (ratio * 0xff973b41fa98cd2e57b660be99eb2c4an) >> 128n;
139
+ if ((tick & 0x40n) != 0n)
140
+ ratio = (ratio * 0xff2ea16466c9838804e327cb417cafcbn) >> 128n;
141
+ if ((tick & 0x80n) != 0n)
142
+ ratio = (ratio * 0xfe5dee046a99d51e2cc356c2f617dbe0n) >> 128n;
143
+ if ((tick & 0x100n) != 0n)
144
+ ratio = (ratio * 0xfcbe86c7900aecf64236ab31f1f9dcb5n) >> 128n;
145
+ if ((tick & 0x200n) != 0n)
146
+ ratio = (ratio * 0xf987a7253ac4d9194200696907cf2e37n) >> 128n;
147
+ if ((tick & 0x400n) != 0n)
148
+ ratio = (ratio * 0xf3392b0822b88206f8abe8a3b44dd9ben) >> 128n;
149
+ if ((tick & 0x800n) != 0n)
150
+ ratio = (ratio * 0xe7159475a2c578ef4f1d17b2b235d480n) >> 128n;
151
+ if ((tick & 0x1000n) != 0n)
152
+ ratio = (ratio * 0xd097f3bdfd254ee83bdd3f248e7e785en) >> 128n;
153
+ if ((tick & 0x2000n) != 0n)
154
+ ratio = (ratio * 0xa9f746462d8f7dd10e744d913d033333n) >> 128n;
155
+ if ((tick & 0x4000n) != 0n)
156
+ ratio = (ratio * 0x70d869a156ddd32a39e257bc3f50aa9bn) >> 128n;
157
+ if ((tick & 0x8000n) != 0n)
158
+ ratio = (ratio * 0x31be135f97da6e09a19dc367e3b6da40n) >> 128n;
159
+ if ((tick & 0x10000n) != 0n)
160
+ ratio = (ratio * 0x9aa508b5b7e5a9780b0cc4e25d61a56n) >> 128n;
161
+ if ((tick & 0x20000n) != 0n)
162
+ ratio = (ratio * 0x5d6af8dedbcb3a6ccb7ce618d14225n) >> 128n;
163
+ if ((tick & 0x40000n) != 0n)
164
+ ratio = (ratio * 0x2216e584f630389b2052b8db590en) >> 128n;
165
+ if ((tick & 0x80000n) != 0n)
166
+ ratio = (ratio * 0x48a1703920644d4030024fen) >> 128n;
167
+ if ((tick & 0x100000n) != 0n) ratio = (ratio * 0x149b34ee7b4532n) >> 128n;
168
+ if (_tick > 0) ratio = BI_MAX_UINT256 / ratio;
169
+ return (ratio * BI_POWS[18]) >> 128n;
170
+ }
171
+ }
@@ -0,0 +1,54 @@
1
+ import { BI_POWS } from '../../../bigint-constants';
2
+ import { _require } from '../../../utils';
3
+ import { PoolState } from '../types';
4
+ import { MaverickBasicMath } from './maverick-basic-math';
5
+
6
+ export class TwaMath {
7
+ static updateValue(
8
+ self: PoolState,
9
+ value: bigint,
10
+ lookback: bigint,
11
+ timestamp: bigint,
12
+ ) {
13
+ if (timestamp === self.lastTimestamp) return;
14
+ self.lastTwaD8 = this.getTwa(self, lookback, timestamp);
15
+ self.lastTimestamp = timestamp;
16
+ self.lastLogPriceD8 = value;
17
+ }
18
+
19
+ static floor(self: PoolState) {
20
+ return MaverickBasicMath.floorD8Unchecked(self.lastTwaD8);
21
+ }
22
+
23
+ static getTwa(self: PoolState, lookback: bigint, timestamp: bigint): bigint {
24
+ let timeDiff = timestamp - self.lastTimestamp;
25
+ timeDiff = MaverickBasicMath.min(lookback, timeDiff);
26
+ if (timeDiff === 0n) return self.lastTwaD8;
27
+
28
+ let absValueDeviation = MaverickBasicMath.min(
29
+ BI_POWS[8],
30
+ MaverickBasicMath.abs(self.lastLogPriceD8 - self.lastTwaD8),
31
+ );
32
+
33
+ if (absValueDeviation === 0n) return self.lastTwaD8;
34
+ let twaDeviation = MaverickBasicMath.mulDivDown(
35
+ absValueDeviation,
36
+ timeDiff,
37
+ lookback,
38
+ );
39
+
40
+ return self.lastTwaD8 > self.lastLogPriceD8
41
+ ? -twaDeviation + self.lastTwaD8
42
+ : twaDeviation + self.lastTwaD8;
43
+ }
44
+
45
+ static getTwaFloor(
46
+ self: PoolState,
47
+ lookback: bigint,
48
+ timestamp: bigint,
49
+ ): bigint {
50
+ return MaverickBasicMath.floorD8Unchecked(
51
+ this.getTwa(self, lookback, timestamp),
52
+ );
53
+ }
54
+ }
@@ -0,0 +1,193 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { testE2E } from '../../../tests/utils-e2e';
6
+ import {
7
+ Tokens,
8
+ Holders,
9
+ NativeTokenSymbols,
10
+ } from '../../../tests/constants-e2e';
11
+ import { Network, ContractMethod, SwapSide } from '../../constants';
12
+ import { StaticJsonRpcProvider } from '@ethersproject/providers';
13
+ import { generateConfig } from '../../config';
14
+ import { ContractMethodV6 } from '@paraswap/sdk';
15
+
16
+ /*
17
+ README
18
+ ======
19
+
20
+ This test script should add e2e tests for MaverickV2. The tests
21
+ should cover as many cases as possible. Most of the DEXes follow
22
+ the following test structure:
23
+ - DexName
24
+ - ForkName + Network
25
+ - ContractMethod
26
+ - ETH -> Token swap
27
+ - Token -> ETH swap
28
+ - Token -> Token swap
29
+
30
+ The template already enumerates the basic structure which involves
31
+ testing simpleSwap, multiSwap, megaSwap contract methods for
32
+ ETH <> TOKEN and TOKEN <> TOKEN swaps. You should replace tokenA and
33
+ tokenB with any two highly liquid tokens on MaverickV2 for the tests
34
+ to work. If the tokens that you would like to use are not defined in
35
+ Tokens or Holders map, you can update the './tests/constants-e2e'
36
+
37
+ Other than the standard cases that are already added by the template
38
+ it is highly recommended to add test cases which could be specific
39
+ to testing MaverickV2 (Eg. Tests based on poolType, special tokens,
40
+ etc).
41
+
42
+ You can run this individual test script by running:
43
+ `npx jest src/dex/<dex-name>/<dex-name>-e2e.test.ts`
44
+
45
+ e2e tests use the Tenderly fork api. Please add the following to your
46
+ .env file:
47
+ TENDERLY_TOKEN=Find this under Account>Settings>Authorization.
48
+ TENDERLY_ACCOUNT_ID=Your Tenderly account name.
49
+ TENDERLY_PROJECT=Name of a Tenderly project you have created in your
50
+ dashboard.
51
+
52
+ (This comment should be removed from the final implementation)
53
+ */
54
+
55
+ function testForNetwork(
56
+ network: Network,
57
+ dexKey: string,
58
+ tokenASymbol: string,
59
+ tokenBSymbol: string,
60
+ tokenAAmount: string,
61
+ tokenBAmount: string,
62
+ nativeTokenAmount: string,
63
+ ) {
64
+ const provider = new StaticJsonRpcProvider(
65
+ generateConfig(network).privateHttpProvider,
66
+ network,
67
+ );
68
+ const tokens = Tokens[network];
69
+ const holders = Holders[network];
70
+ const nativeTokenSymbol = NativeTokenSymbols[network];
71
+
72
+ const sideToContractMethods = new Map([
73
+ [
74
+ SwapSide.SELL,
75
+ [ContractMethod.simpleSwap, ContractMethod.swapExactAmountIn],
76
+ ],
77
+ // [SwapSide.BUY, [ContractMethod.simpleBuy]],
78
+ ]);
79
+
80
+ describe(`${network}`, () => {
81
+ sideToContractMethods.forEach((contractMethods, side) =>
82
+ describe(`${side}`, () => {
83
+ contractMethods.forEach((contractMethod: ContractMethod) => {
84
+ describe(`${contractMethod}`, () => {
85
+ it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
86
+ await testE2E(
87
+ tokens[nativeTokenSymbol],
88
+ tokens[tokenASymbol],
89
+ holders[nativeTokenSymbol],
90
+ side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
91
+ side,
92
+ dexKey,
93
+ contractMethod,
94
+ network,
95
+ provider,
96
+ );
97
+ });
98
+ it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
99
+ await testE2E(
100
+ tokens[tokenASymbol],
101
+ tokens[nativeTokenSymbol],
102
+ holders[tokenASymbol],
103
+ side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
104
+ side,
105
+ dexKey,
106
+ contractMethod,
107
+ network,
108
+ provider,
109
+ );
110
+ });
111
+ it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
112
+ await testE2E(
113
+ tokens[tokenASymbol],
114
+ tokens[tokenBSymbol],
115
+ holders[tokenASymbol],
116
+ side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
117
+ side,
118
+ dexKey,
119
+ contractMethod,
120
+ network,
121
+ provider,
122
+ );
123
+ });
124
+ it(`${tokenBSymbol} -> ${tokenASymbol}`, async () => {
125
+ await testE2E(
126
+ tokens[tokenBSymbol],
127
+ tokens[tokenASymbol],
128
+ holders[tokenBSymbol],
129
+ side === SwapSide.SELL ? tokenBAmount : tokenAAmount,
130
+ side,
131
+ dexKey,
132
+ contractMethod,
133
+ network,
134
+ provider,
135
+ );
136
+ });
137
+ });
138
+ });
139
+ }),
140
+ );
141
+ });
142
+ }
143
+
144
+ describe('MaverickV2 E2E', () => {
145
+ const dexKey = 'MaverickV2';
146
+
147
+ const testCases = [
148
+ {
149
+ network: Network.BASE,
150
+ tokenASymbol: 'MAV',
151
+ tokenBSymbol: 'PRIME',
152
+ tokenAAmount: '1000000000000000',
153
+ tokenBAmount: '1000000000000000',
154
+ },
155
+ {
156
+ network: Network.ARBITRUM,
157
+ tokenASymbol: 'USDC',
158
+ tokenBSymbol: 'USDT',
159
+ tokenAAmount: '100000000',
160
+ tokenBAmount: '100000000',
161
+ },
162
+ {
163
+ network: Network.BSC,
164
+ tokenASymbol: 'USDC',
165
+ tokenBSymbol: 'USDT',
166
+ tokenAAmount: '100000000',
167
+ tokenBAmount: '100000000',
168
+ },
169
+ {
170
+ network: Network.MAINNET,
171
+ tokenASymbol: 'USDC',
172
+ tokenBSymbol: 'USDT',
173
+ tokenAAmount: '100000000',
174
+ tokenBAmount: '100000000',
175
+ },
176
+ ];
177
+
178
+ testCases.forEach(
179
+ ({ network, tokenAAmount, tokenBAmount, tokenASymbol, tokenBSymbol }) => {
180
+ const nativeTokenAmount = '100000000000000';
181
+
182
+ testForNetwork(
183
+ network,
184
+ dexKey,
185
+ tokenASymbol,
186
+ tokenBSymbol,
187
+ tokenAAmount,
188
+ tokenBAmount,
189
+ nativeTokenAmount,
190
+ );
191
+ },
192
+ );
193
+ });