@steerprotocol/sdk 1.19.15 → 1.19.17

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/README.md +281 -11
  2. package/dist/cjs/base/VaultClient.js +95 -1
  3. package/dist/cjs/base/VaultClient.js.map +1 -1
  4. package/dist/cjs/base/vault/single-asset/calculateLimitPrice.js +231 -0
  5. package/dist/cjs/base/vault/single-asset/calculateLimitPrice.js.map +1 -0
  6. package/dist/cjs/base/vault/single-asset/calculateSwapAmount.js +68 -0
  7. package/dist/cjs/base/vault/single-asset/calculateSwapAmount.js.map +1 -0
  8. package/dist/cjs/base/vault/single-asset/estimateLpTokens.js +355 -0
  9. package/dist/cjs/base/vault/single-asset/estimateLpTokens.js.map +1 -0
  10. package/dist/cjs/base/vault/single-asset/index.js +109 -0
  11. package/dist/cjs/base/vault/single-asset/index.js.map +1 -0
  12. package/dist/cjs/base/vault/single-asset/simulateSwap.js +317 -0
  13. package/dist/cjs/base/vault/single-asset/simulateSwap.js.map +1 -0
  14. package/dist/cjs/base/vault/single-asset/singleAssetDeposit.js +327 -0
  15. package/dist/cjs/base/vault/single-asset/singleAssetDeposit.js.map +1 -0
  16. package/dist/cjs/base/vault/single-asset/types.js +15 -0
  17. package/dist/cjs/base/vault/single-asset/types.js.map +1 -0
  18. package/dist/cjs/base/vault/utils.js +229 -18
  19. package/dist/cjs/base/vault/utils.js.map +1 -1
  20. package/dist/cjs/const/abis/index.js +3 -0
  21. package/dist/cjs/const/abis/index.js.map +1 -1
  22. package/dist/cjs/const/abis/quoter.js +1584 -0
  23. package/dist/cjs/const/abis/quoter.js.map +1 -0
  24. package/dist/cjs/const/abis/singleTokenDeposit.js +925 -0
  25. package/dist/cjs/const/abis/singleTokenDeposit.js.map +1 -0
  26. package/dist/cjs/const/amm/configs/protocols/machinex.js +3 -0
  27. package/dist/cjs/const/amm/configs/protocols/machinex.js.map +1 -1
  28. package/dist/cjs/const/amm/configs/protocols/quickswap.js +3 -0
  29. package/dist/cjs/const/amm/configs/protocols/quickswap.js.map +1 -1
  30. package/dist/cjs/const/amm/configs/protocols/retro.js +3 -0
  31. package/dist/cjs/const/amm/configs/protocols/retro.js.map +1 -1
  32. package/dist/cjs/const/amm/configs/protocols/sushi.js +3 -0
  33. package/dist/cjs/const/amm/configs/protocols/sushi.js.map +1 -1
  34. package/dist/cjs/const/amm/configs/protocols/uniswap.js +15 -0
  35. package/dist/cjs/const/amm/configs/protocols/uniswap.js.map +1 -1
  36. package/dist/cjs/const/amm/utils/contracts.js +6 -0
  37. package/dist/cjs/const/amm/utils/contracts.js.map +1 -1
  38. package/dist/cjs/const/deployments/abis.js +277 -0
  39. package/dist/cjs/const/deployments/abis.js.map +1 -1
  40. package/dist/cjs/const/deployments/peaq.js +8 -0
  41. package/dist/cjs/const/deployments/peaq.js.map +1 -1
  42. package/dist/cjs/const/deployments/polygon.js +8 -0
  43. package/dist/cjs/const/deployments/polygon.js.map +1 -1
  44. package/dist/cjs/const/index.js +6 -5
  45. package/dist/cjs/const/index.js.map +1 -1
  46. package/dist/cjs/const/network.js +9 -0
  47. package/dist/cjs/const/network.js.map +1 -1
  48. package/dist/cjs/const/protocol.js +18 -1
  49. package/dist/cjs/const/protocol.js.map +1 -1
  50. package/dist/cjs/const/quoter.js +425 -0
  51. package/dist/cjs/const/quoter.js.map +1 -0
  52. package/dist/cjs/index.js +1 -0
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/esm/base/VaultClient.js +81 -1
  55. package/dist/esm/base/VaultClient.js.map +1 -1
  56. package/dist/esm/base/vault/single-asset/calculateLimitPrice.js +224 -0
  57. package/dist/esm/base/vault/single-asset/calculateLimitPrice.js.map +1 -0
  58. package/dist/esm/base/vault/single-asset/calculateSwapAmount.js +65 -0
  59. package/dist/esm/base/vault/single-asset/calculateSwapAmount.js.map +1 -0
  60. package/dist/esm/base/vault/single-asset/estimateLpTokens.js +350 -0
  61. package/dist/esm/base/vault/single-asset/estimateLpTokens.js.map +1 -0
  62. package/dist/esm/base/vault/single-asset/index.js +83 -0
  63. package/dist/esm/base/vault/single-asset/index.js.map +1 -0
  64. package/dist/esm/base/vault/single-asset/simulateSwap.js +311 -0
  65. package/dist/esm/base/vault/single-asset/simulateSwap.js.map +1 -0
  66. package/dist/esm/base/vault/single-asset/singleAssetDeposit.js +323 -0
  67. package/dist/esm/base/vault/single-asset/singleAssetDeposit.js.map +1 -0
  68. package/dist/esm/base/vault/single-asset/types.js +12 -0
  69. package/dist/esm/base/vault/single-asset/types.js.map +1 -0
  70. package/dist/esm/base/vault/utils.js +226 -18
  71. package/dist/esm/base/vault/utils.js.map +1 -1
  72. package/dist/esm/const/abis/index.js +3 -0
  73. package/dist/esm/const/abis/index.js.map +1 -1
  74. package/dist/esm/const/abis/quoter.js +1581 -0
  75. package/dist/esm/const/abis/quoter.js.map +1 -0
  76. package/dist/esm/const/abis/singleTokenDeposit.js +922 -0
  77. package/dist/esm/const/abis/singleTokenDeposit.js.map +1 -0
  78. package/dist/esm/const/amm/configs/protocols/machinex.js +3 -0
  79. package/dist/esm/const/amm/configs/protocols/machinex.js.map +1 -1
  80. package/dist/esm/const/amm/configs/protocols/quickswap.js +3 -0
  81. package/dist/esm/const/amm/configs/protocols/quickswap.js.map +1 -1
  82. package/dist/esm/const/amm/configs/protocols/retro.js +3 -0
  83. package/dist/esm/const/amm/configs/protocols/retro.js.map +1 -1
  84. package/dist/esm/const/amm/configs/protocols/sushi.js +3 -0
  85. package/dist/esm/const/amm/configs/protocols/sushi.js.map +1 -1
  86. package/dist/esm/const/amm/configs/protocols/uniswap.js +15 -0
  87. package/dist/esm/const/amm/configs/protocols/uniswap.js.map +1 -1
  88. package/dist/esm/const/amm/utils/contracts.js +5 -0
  89. package/dist/esm/const/amm/utils/contracts.js.map +1 -1
  90. package/dist/esm/const/deployments/abis.js +277 -0
  91. package/dist/esm/const/deployments/abis.js.map +1 -1
  92. package/dist/esm/const/deployments/peaq.js +8 -0
  93. package/dist/esm/const/deployments/peaq.js.map +1 -1
  94. package/dist/esm/const/deployments/polygon.js +8 -0
  95. package/dist/esm/const/deployments/polygon.js.map +1 -1
  96. package/dist/esm/const/index.js +6 -5
  97. package/dist/esm/const/index.js.map +1 -1
  98. package/dist/esm/const/network.js +7 -0
  99. package/dist/esm/const/network.js.map +1 -1
  100. package/dist/esm/const/protocol.js +16 -0
  101. package/dist/esm/const/protocol.js.map +1 -1
  102. package/dist/esm/const/quoter.js +414 -0
  103. package/dist/esm/const/quoter.js.map +1 -0
  104. package/dist/esm/index.js +1 -0
  105. package/dist/esm/index.js.map +1 -1
  106. package/dist/types/base/VaultClient.d.ts +136 -4
  107. package/dist/types/base/VaultClient.d.ts.map +1 -1
  108. package/dist/types/base/vault/single-asset/calculateLimitPrice.d.ts +59 -0
  109. package/dist/types/base/vault/single-asset/calculateLimitPrice.d.ts.map +1 -0
  110. package/dist/types/base/vault/single-asset/calculateSwapAmount.d.ts +30 -0
  111. package/dist/types/base/vault/single-asset/calculateSwapAmount.d.ts.map +1 -0
  112. package/dist/types/base/vault/single-asset/estimateLpTokens.d.ts +61 -0
  113. package/dist/types/base/vault/single-asset/estimateLpTokens.d.ts.map +1 -0
  114. package/dist/types/base/vault/single-asset/index.d.ts +80 -0
  115. package/dist/types/base/vault/single-asset/index.d.ts.map +1 -0
  116. package/dist/types/base/vault/single-asset/simulateSwap.d.ts +119 -0
  117. package/dist/types/base/vault/single-asset/simulateSwap.d.ts.map +1 -0
  118. package/dist/types/base/vault/single-asset/singleAssetDeposit.d.ts +141 -0
  119. package/dist/types/base/vault/single-asset/singleAssetDeposit.d.ts.map +1 -0
  120. package/dist/types/base/vault/single-asset/types.d.ts +169 -0
  121. package/dist/types/base/vault/single-asset/types.d.ts.map +1 -0
  122. package/dist/types/base/vault/utils.d.ts +95 -0
  123. package/dist/types/base/vault/utils.d.ts.map +1 -1
  124. package/dist/types/const/abis/index.d.ts +3 -0
  125. package/dist/types/const/abis/index.d.ts.map +1 -1
  126. package/dist/types/const/abis/quoter.d.ts +432 -0
  127. package/dist/types/const/abis/quoter.d.ts.map +1 -0
  128. package/dist/types/const/abis/singleTokenDeposit.d.ts +47 -0
  129. package/dist/types/const/abis/singleTokenDeposit.d.ts.map +1 -0
  130. package/dist/types/const/amm/configs/protocols/machinex.d.ts.map +1 -1
  131. package/dist/types/const/amm/configs/protocols/quickswap.d.ts.map +1 -1
  132. package/dist/types/const/amm/configs/protocols/retro.d.ts.map +1 -1
  133. package/dist/types/const/amm/configs/protocols/sushi.d.ts.map +1 -1
  134. package/dist/types/const/amm/configs/protocols/uniswap.d.ts.map +1 -1
  135. package/dist/types/const/amm/utils/contracts.d.ts +2 -0
  136. package/dist/types/const/amm/utils/contracts.d.ts.map +1 -1
  137. package/dist/types/const/deployments/abis.d.ts +215 -0
  138. package/dist/types/const/deployments/abis.d.ts.map +1 -1
  139. package/dist/types/const/deployments/peaq.d.ts.map +1 -1
  140. package/dist/types/const/deployments/polygon.d.ts.map +1 -1
  141. package/dist/types/const/index.d.ts +6 -5
  142. package/dist/types/const/index.d.ts.map +1 -1
  143. package/dist/types/const/network.d.ts +4 -0
  144. package/dist/types/const/network.d.ts.map +1 -1
  145. package/dist/types/const/protocol.d.ts +2 -0
  146. package/dist/types/const/protocol.d.ts.map +1 -1
  147. package/dist/types/const/quoter.d.ts +456 -0
  148. package/dist/types/const/quoter.d.ts.map +1 -0
  149. package/dist/types/index.d.ts +1 -0
  150. package/dist/types/index.d.ts.map +1 -1
  151. package/dist/types/types.d.ts +3 -0
  152. package/dist/types/types.d.ts.map +1 -1
  153. package/package.json +1 -1
@@ -0,0 +1,311 @@
1
+ import { decodeFunctionResult, encodeFunctionData } from 'viem';
2
+ import { getNetworkByChainId, getProtcolTypeByAmmType } from '../../../const';
3
+ import { QuoterV2Factory } from '../../../const/quoter';
4
+ import { getPoolPrice } from '../utils';
5
+ import { bigintToDecimal, decimalToBigint, getPoolSlot0, getQuoteFromSqrtRatioX96 } from './calculateLimitPrice';
6
+ import { AMMType } from './types';
7
+ /**
8
+ * Simulates a swap to get the expected output amounts without executing the swap
9
+ * Uses Uniswap V3 Quoter contract for accurate simulation
10
+ *
11
+ * @param publicClient - Viem public client for blockchain reads
12
+ * @param params - Parameters for swap simulation
13
+ * @param chainId - Chain ID to get the appropriate Quoter address
14
+ * @returns Promise resolving to the simulated swap results
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const result = await simulateSwap(publicClient, {
19
+ * pool: '0x...',
20
+ * recipient: '0x...',
21
+ * zeroForOne: true,
22
+ * amountSpecified: parseEther('10'),
23
+ * sqrtPriceLimitX96: limitPrice,
24
+ * ammType: AMMType.UniswapV3,
25
+ * tokenIn: '0x...',
26
+ * tokenOut: '0x...',
27
+ * fee: 3000
28
+ * }, 137); // Polygon chain ID
29
+ *
30
+ * if (result.success) {
31
+ * console.log('Amount out:', result.data.amountOut);
32
+ * }
33
+ * ```
34
+ */
35
+ export async function simulateSwap(publicClient, params, chainId) {
36
+ try {
37
+ // For now, only handle UniswapV3 - other AMMs can be added later
38
+ // Get the appropriate Quoter contract address
39
+ const networkConfig = getNetworkByChainId(chainId);
40
+ if (!networkConfig) {
41
+ throw Error('Network config not found');
42
+ }
43
+ const protocol = getProtcolTypeByAmmType(params.ammType);
44
+ const quoterFactory = new QuoterV2Factory(networkConfig);
45
+ const quoterABI = quoterFactory.getQuoterAbi(protocol);
46
+ const quoteParams = quoterFactory.getQuoteParams(protocol, {
47
+ tokenIn: params.tokenIn,
48
+ tokenOut: params.tokenOut,
49
+ fee: params.fee,
50
+ tickSpacing: params.tickSpacing,
51
+ amountIn: params.amountSpecified,
52
+ sqrtPriceLimitX96: params.sqrtPriceLimitX96,
53
+ limitSqrtPrice: params.sqrtPriceLimitX96,
54
+ });
55
+ const quoterAddress = quoterFactory.getQuoterV2Address(protocol);
56
+ // Use Quoter's quoteExactInputSingle for simulation
57
+ const result = await publicClient.call({
58
+ to: quoterAddress,
59
+ data: encodeFunctionData({
60
+ abi: quoterABI,
61
+ functionName: 'quoteExactInputSingle',
62
+ //@ts-expect-error Parameters are dynamic in nature and very based on abi types
63
+ args: [{
64
+ ...quoteParams
65
+ }]
66
+ })
67
+ });
68
+ if (!result.data) {
69
+ throw new Error('No data returned from quoter simulation');
70
+ }
71
+ // Decode the result - Quoter returns a tuple: [amountOut, sqrtPriceX96After, initializedTicksCrossed, gasEstimate]
72
+ const [amountOut, sqrtPriceX96After] = decodeFunctionResult({
73
+ abi: quoterABI,
74
+ functionName: 'quoteExactInputSingle',
75
+ data: result.data
76
+ });
77
+ // Convert to the expected SwapSimulationResponse format
78
+ // For exact input swaps, we know the input amount and get the output amount
79
+ let amount0, amount1;
80
+ if (params.zeroForOne) {
81
+ // Swapping token0 for token1
82
+ amount0 = -params.amountSpecified; // negative because we're giving token0
83
+ amount1 = amountOut; // positive because we're receiving token1
84
+ }
85
+ else {
86
+ // Swapping token1 for token0
87
+ amount0 = amountOut; // positive because we're receiving token0
88
+ amount1 = -params.amountSpecified; // negative because we're giving token1
89
+ }
90
+ return {
91
+ data: {
92
+ amount0,
93
+ amount1,
94
+ sqrtPriceX96After
95
+ },
96
+ status: 200,
97
+ success: true
98
+ };
99
+ }
100
+ catch (error) {
101
+ return {
102
+ data: null,
103
+ status: 500,
104
+ success: false,
105
+ error: error instanceof Error ? error.message : 'Failed to simulate swap'
106
+ };
107
+ }
108
+ }
109
+ /**
110
+ * Determines the swap direction based on the token being deposited
111
+ *
112
+ * @param isToken0 - true if depositing token0, false if token1
113
+ * @returns true if swapping token0 → token1, false otherwise
114
+ */
115
+ export function determineSwapDirection(isToken0) {
116
+ // If depositing token0, we need to swap some token0 to token1
117
+ // If depositing token1, we need to swap some token1 to token0
118
+ return isToken0;
119
+ }
120
+ /**
121
+ * Validates swap simulation parameters
122
+ *
123
+ * @param params - Parameters to validate
124
+ * @throws Error if parameters are invalid
125
+ */
126
+ export function validateSwapParams(params) {
127
+ if (!params.pool || params.pool === '0x0000000000000000000000000000000000000000') {
128
+ throw new Error('Invalid pool address');
129
+ }
130
+ if (!params.recipient || params.recipient === '0x0000000000000000000000000000000000000000') {
131
+ throw new Error('Invalid recipient address');
132
+ }
133
+ if (params.amountSpecified <= 0n) {
134
+ throw new Error('Amount specified must be greater than 0');
135
+ }
136
+ if (params.sqrtPriceLimitX96 <= 0n) {
137
+ throw new Error('Sqrt price limit must be greater than 0');
138
+ }
139
+ if (!params.tokenIn || params.tokenIn === '0x0000000000000000000000000000000000000000') {
140
+ throw new Error('Invalid tokenIn address');
141
+ }
142
+ if (!params.tokenOut || params.tokenOut === '0x0000000000000000000000000000000000000000') {
143
+ throw new Error('Invalid tokenOut address');
144
+ }
145
+ if (params.fee <= 0) {
146
+ throw new Error('Pool fee must be greater than 0');
147
+ }
148
+ }
149
+ /**
150
+ * Simulates a swap with slippage analysis by first getting current pool state,
151
+ * then simulating the swap and calculating price impact
152
+ *
153
+ * @param publicClient - Viem public client for blockchain reads
154
+ * @param params - Parameters for swap simulation with slippage analysis
155
+ * @param chainId - Chain ID to get the appropriate Quoter address
156
+ * @returns Promise resolving to swap results with slippage analysis
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * const result = await simulateSwapWithSlippage(publicClient, {
161
+ * poolAddress: '0x...',
162
+ * recipient: '0x...',
163
+ * zeroForOne: true,
164
+ * amountSpecified: parseEther('10'),
165
+ * sqrtPriceLimitX96: limitPrice,
166
+ * ammType: AMMType.UniswapV3,
167
+ * tokenIn: '0x...',
168
+ * tokenOut: '0x...',
169
+ * fee: 3000
170
+ * }, 137); // Polygon chain ID
171
+ *
172
+ * if (result.success) {
173
+ * console.log('Price slippage:', result.data.priceSlippagePercent, '%');
174
+ * console.log('Current price:', result.data.currentPrice);
175
+ * console.log('Price after swap:', result.data.priceAfter);
176
+ * }
177
+ * ```
178
+ */
179
+ export async function simulateSwapWithSlippage(publicClient, params, chainId) {
180
+ try {
181
+ // Validate params
182
+ validateSwapWithSlippageParams(params);
183
+ // Step 1: Get current pool state from slot0
184
+ const slot0Result = await getPoolSlot0(publicClient, params.poolAddress, params.ammType);
185
+ if (!slot0Result.data) {
186
+ throw new Error('Failed to get pool slot0 data');
187
+ }
188
+ // Decode slot0 result
189
+ const currentSlot0 = {
190
+ sqrtPriceX96: getPoolPrice(slot0Result.data, {
191
+ isAlgebraPool: params.ammType === AMMType.Algebra,
192
+ isAlgebraIntegralPool: params.ammType === AMMType.AlgebraIntegral,
193
+ isPoolSharkPool: false // PoolShark not defined in AMMType enum
194
+ }) || BigInt(0),
195
+ tick: slot0Result.data.tick,
196
+ observationIndex: slot0Result.data.observationIndex,
197
+ observationCardinality: slot0Result.data.observationCardinality,
198
+ observationCardinalityNext: slot0Result.data.observationCardinalityNext,
199
+ feeProtocol: slot0Result.data.feeProtocol,
200
+ unlocked: slot0Result.data.unlocked
201
+ };
202
+ const tickSpacing = await publicClient.readContract({
203
+ abi: [{
204
+ "inputs": [],
205
+ "name": "tickSpacing",
206
+ "outputs": [
207
+ {
208
+ "internalType": "int24",
209
+ "name": "",
210
+ "type": "int24"
211
+ }
212
+ ],
213
+ "stateMutability": "view",
214
+ "type": "function"
215
+ },],
216
+ functionName: 'tickSpacing',
217
+ address: params.poolAddress,
218
+ });
219
+ // Step 2: Simulate the swap using existing function
220
+ const swapParams = {
221
+ pool: params.poolAddress,
222
+ recipient: params.recipient,
223
+ zeroForOne: params.zeroForOne,
224
+ amountSpecified: params.amountSpecified,
225
+ sqrtPriceLimitX96: params.sqrtPriceLimitX96,
226
+ ammType: params.ammType,
227
+ tokenIn: params.tokenIn,
228
+ tokenOut: params.tokenOut,
229
+ fee: params.fee,
230
+ tickSpacing: tickSpacing,
231
+ quoterAddress: params.quoterAddress
232
+ };
233
+ const swapResult = await simulateSwap(publicClient, swapParams, chainId);
234
+ if (!swapResult.success || !swapResult.data) {
235
+ throw new Error(swapResult.error || 'Swap simulation failed');
236
+ }
237
+ // Step 3: Calculate price slippage
238
+ const currentPrice = getQuoteFromSqrtRatioX96(bigintToDecimal(currentSlot0.sqrtPriceX96), bigintToDecimal(10n ** 18n), params.tokenIn, params.tokenOut);
239
+ const priceAfter = getQuoteFromSqrtRatioX96(bigintToDecimal(swapResult.data.sqrtPriceX96After), bigintToDecimal(10n ** 18n), params.tokenIn, params.tokenOut);
240
+ // Calculate slippage percentage
241
+ // Positive slippage means unfavorable price movement
242
+ const priceSlippagePercent = calculatePriceSlippage(currentPrice, priceAfter, params.zeroForOne);
243
+ return {
244
+ data: {
245
+ currentSlot0,
246
+ swapSimulation: swapResult.data,
247
+ priceSlippagePercent: priceSlippagePercent.toFixed(5),
248
+ currentPrice: decimalToBigint(currentPrice),
249
+ priceAfter: decimalToBigint(priceAfter)
250
+ },
251
+ status: 200,
252
+ success: true
253
+ };
254
+ }
255
+ catch (error) {
256
+ return {
257
+ data: null,
258
+ status: 500,
259
+ success: false,
260
+ error: error instanceof Error ? error.message : 'Failed to simulate swap with slippage'
261
+ };
262
+ }
263
+ }
264
+ /**
265
+ * Calculates price slippage percentage using Decimal.js
266
+ *
267
+ * @param priceBefore - Price before the swap (Decimal)
268
+ * @param priceAfter - Price after the swap (Decimal)
269
+ * @param zeroForOne - Swap direction (true if token0 → token1)
270
+ * @returns Slippage percentage (positive means unfavorable movement)
271
+ */
272
+ function calculatePriceSlippage(priceBefore, priceAfter, zeroForOne) {
273
+ if (priceBefore.isZero()) {
274
+ throw new Error('Price before cannot be zero');
275
+ }
276
+ const priceChange = priceAfter.minus(priceBefore).dividedBy(priceBefore).times(100);
277
+ // For zeroForOne swaps (selling token0), favorable movement is price going down
278
+ // For oneForZero swaps (selling token1), favorable movement is price going up
279
+ // We return positive values for unfavorable movement (slippage)
280
+ return zeroForOne ? priceChange : priceChange.negated();
281
+ }
282
+ /**
283
+ * Validates swap with slippage parameters
284
+ *
285
+ * @param params - Parameters to validate
286
+ * @throws Error if parameters are invalid
287
+ */
288
+ function validateSwapWithSlippageParams(params) {
289
+ if (!params.poolAddress || params.poolAddress === '0x0000000000000000000000000000000000000000') {
290
+ throw new Error('Invalid pool address');
291
+ }
292
+ if (!params.recipient || params.recipient === '0x0000000000000000000000000000000000000000') {
293
+ throw new Error('Invalid recipient address');
294
+ }
295
+ if (params.amountSpecified <= 0n) {
296
+ throw new Error('Amount specified must be greater than 0');
297
+ }
298
+ if (params.sqrtPriceLimitX96 <= 0n) {
299
+ throw new Error('Sqrt price limit must be greater than 0');
300
+ }
301
+ if (!params.tokenIn || params.tokenIn === '0x0000000000000000000000000000000000000000') {
302
+ throw new Error('Invalid tokenIn address');
303
+ }
304
+ if (!params.tokenOut || params.tokenOut === '0x0000000000000000000000000000000000000000') {
305
+ throw new Error('Invalid tokenOut address');
306
+ }
307
+ if (params.fee <= 0) {
308
+ throw new Error('Pool fee must be greater than 0');
309
+ }
310
+ }
311
+ //# sourceMappingURL=simulateSwap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulateSwap.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/simulateSwap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
1
+ import { getContractAddressByChainIdAndContractName } from '../../../const';
2
+ import { singleTokenDepositAbi } from '../../../const/abis/singleTokenDeposit';
3
+ import { UniswapV3PoolABI } from '../../../const/abis/UniswapPool';
4
+ import { calculateLimitPrice } from './calculateLimitPrice';
5
+ import { calculateSwapAmount } from './calculateSwapAmount';
6
+ import { estimateLpTokens } from './estimateLpTokens';
7
+ import { determineSwapDirection, simulateSwapWithSlippage } from './simulateSwap';
8
+ import { AMMType } from './types';
9
+ /**
10
+ * Main single-asset deposit client that orchestrates all the steps
11
+ */
12
+ export class SingleAssetDepositClient {
13
+ constructor(publicClient, walletClient) {
14
+ this.publicClient = publicClient;
15
+ this.walletClient = walletClient;
16
+ }
17
+ /**
18
+ * Previews a single-asset deposit by running all simulation steps
19
+ * This allows users to see the expected outcome before executing the transaction
20
+ *
21
+ * @param params - Single-asset deposit parameters
22
+ * @param poolAddress - Address of the pool (must be provided separately)
23
+ * @returns Promise resolving to the complete deposit preview
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const preview = await client.previewDeposit({
28
+ * assets: parseEther('100'),
29
+ * receiver: userAddress,
30
+ * vault: vaultAddress,
31
+ * isToken0: true,
32
+ * depositSlippagePercent: 5n,
33
+ * swapSlippageBP: 500,
34
+ * ammType: AMMType.UniswapV3,
35
+ * singleAssetDepositContract: contractAddress
36
+ * }, poolAddress);
37
+ *
38
+ * if (preview.success) {
39
+ * console.log('Expected LP tokens:', preview.data.lpEstimation.lpTokens);
40
+ * console.log('Swap amount:', preview.data.swapAmount);
41
+ * }
42
+ * ```
43
+ */
44
+ async previewDeposit(params, poolAddress) {
45
+ try {
46
+ const chainId = await this.publicClient.getChainId();
47
+ const singleAssentDeposit = params.singleAssetDepositContract || getContractAddressByChainIdAndContractName(chainId, 'SingleAssetDeposit');
48
+ // Step 1: Calculate swap amount
49
+ const swapAmountParams = {
50
+ depositAmount: params.assets,
51
+ isToken0: params.isToken0,
52
+ vault: params.vault,
53
+ pool: poolAddress,
54
+ ammType: params.ammType,
55
+ singleAssetDepositContract: singleAssentDeposit
56
+ };
57
+ const swapAmountResult = await calculateSwapAmount(this.publicClient, swapAmountParams);
58
+ if (!swapAmountResult.success || !swapAmountResult.data) {
59
+ return {
60
+ data: null,
61
+ status: swapAmountResult.status,
62
+ success: false,
63
+ error: swapAmountResult.error || 'Failed to calculate swap amount'
64
+ };
65
+ }
66
+ const { swapAmount, sqrtPrice } = swapAmountResult.data;
67
+ const zeroForOne = determineSwapDirection(params.isToken0);
68
+ // Get token addresses from the pool contract
69
+ const [token0, token1] = await Promise.all([
70
+ this.publicClient.readContract({
71
+ address: poolAddress,
72
+ abi: UniswapV3PoolABI,
73
+ functionName: 'token0'
74
+ }),
75
+ this.publicClient.readContract({
76
+ address: poolAddress,
77
+ abi: UniswapV3PoolABI,
78
+ functionName: 'token1'
79
+ })
80
+ ]);
81
+ // Step 2: Calculate limit price
82
+ const limitPriceParams = {
83
+ pool: poolAddress,
84
+ slippageBP: params.swapSlippageBP,
85
+ zeroForOne,
86
+ ammType: params.ammType,
87
+ token0,
88
+ token1
89
+ };
90
+ const limitPriceResult = await calculateLimitPrice(this.publicClient, limitPriceParams);
91
+ if (!limitPriceResult.success || limitPriceResult.data === null) {
92
+ return {
93
+ data: null,
94
+ status: limitPriceResult.status,
95
+ success: false,
96
+ error: limitPriceResult.error || 'Failed to calculate limit price'
97
+ };
98
+ }
99
+ const sqrtPriceLimitX96 = limitPriceResult.data;
100
+ let fee = 3000;
101
+ if (params.ammType === AMMType.UniswapV3) {
102
+ fee = await this.publicClient.readContract({
103
+ address: poolAddress,
104
+ abi: UniswapV3PoolABI,
105
+ functionName: 'fee'
106
+ });
107
+ }
108
+ // Get pool fee from the contract
109
+ // Step 3: Simulate swap
110
+ const simulateSwapParams = {
111
+ poolAddress: poolAddress,
112
+ recipient: params.receiver, // For simulation, use receiver address
113
+ zeroForOne,
114
+ amountSpecified: swapAmount,
115
+ sqrtPriceLimitX96,
116
+ ammType: params.ammType,
117
+ tokenIn: zeroForOne ? token0 : token1,
118
+ tokenOut: zeroForOne ? token1 : token0,
119
+ fee
120
+ };
121
+ const swapSimulationResult = await simulateSwapWithSlippage(this.publicClient, simulateSwapParams, this.publicClient.chain?.id || 1 // Use chain ID from public client, fallback to mainnet
122
+ );
123
+ if (!swapSimulationResult.success || !swapSimulationResult.data) {
124
+ return {
125
+ data: null,
126
+ status: swapSimulationResult.status,
127
+ success: false,
128
+ error: swapSimulationResult.error || 'Failed to simulate swap'
129
+ };
130
+ }
131
+ const swapSimulation = swapSimulationResult.data;
132
+ // Step 4: Estimate LP tokens
133
+ const lpEstimationResult = await estimateLpTokens(this.publicClient, {
134
+ vault: params.vault,
135
+ originalAssets: params.assets,
136
+ swapAmount,
137
+ swapResult: swapSimulation.swapSimulation,
138
+ isToken0: params.isToken0
139
+ });
140
+ if (!lpEstimationResult.success || !lpEstimationResult.data) {
141
+ return {
142
+ data: null,
143
+ status: lpEstimationResult.status,
144
+ success: false,
145
+ error: lpEstimationResult.error || 'Failed to estimate LP tokens'
146
+ };
147
+ }
148
+ const lpEstimation = lpEstimationResult.data;
149
+ return {
150
+ data: {
151
+ swapAmount,
152
+ currentSqrtPrice: sqrtPrice,
153
+ sqrtPriceLimitX96,
154
+ swapSimulation,
155
+ lpEstimation,
156
+ zeroForOne
157
+ },
158
+ status: 200,
159
+ success: true
160
+ };
161
+ }
162
+ catch (error) {
163
+ return {
164
+ data: null,
165
+ status: 500,
166
+ success: false,
167
+ error: error instanceof Error ? error.message : 'Failed to preview single-asset deposit'
168
+ };
169
+ }
170
+ }
171
+ /**
172
+ * Executes a single-asset deposit transaction
173
+ *
174
+ * @param params - Single-asset deposit parameters
175
+ * @returns Promise resolving to the transaction hash
176
+ *
177
+ * @example
178
+ * ```typescript
179
+ * const result = await client.deposit({
180
+ * assets: parseEther('100'),
181
+ * receiver: userAddress,
182
+ * vault: vaultAddress,
183
+ * isToken0: true,
184
+ * depositSlippagePercent: 5n,
185
+ * swapSlippageBP: 500,
186
+ * ammType: AMMType.UniswapV3,
187
+ * singleAssetDepositContract: contractAddress
188
+ * });
189
+ *
190
+ * if (result.success) {
191
+ * console.log('Transaction hash:', result.data);
192
+ * }
193
+ * ```
194
+ */
195
+ async deposit(params) {
196
+ try {
197
+ const account = await this.walletClient.getAddresses();
198
+ if (!account[0]) {
199
+ throw new Error('No account found');
200
+ }
201
+ const singleAssentDeposit = params.singleAssetDepositContract || getContractAddressByChainIdAndContractName(this.publicClient.chain?.id || 1, 'SingleAssetDeposit');
202
+ // Prepare the transaction
203
+ const { request } = await this.publicClient.simulateContract({
204
+ address: singleAssentDeposit,
205
+ abi: singleTokenDepositAbi,
206
+ functionName: 'deposit',
207
+ args: [
208
+ params.assets,
209
+ params.receiver,
210
+ params.vault,
211
+ params.isToken0,
212
+ params.depositSlippagePercent,
213
+ params.swapSlippageBP,
214
+ params.ammType
215
+ ],
216
+ account: account[0]
217
+ });
218
+ // Execute the transaction
219
+ const hash = await this.walletClient.writeContract(request);
220
+ return {
221
+ data: hash,
222
+ status: 200,
223
+ success: true
224
+ };
225
+ }
226
+ catch (error) {
227
+ return {
228
+ data: null,
229
+ status: 500,
230
+ success: false,
231
+ error: error instanceof Error ? error.message : 'Failed to execute single-asset deposit'
232
+ };
233
+ }
234
+ }
235
+ /**
236
+ * Prepares a single-asset deposit transaction without executing it
237
+ * Useful for batching transactions or custom execution logic
238
+ *
239
+ * @param params - Single-asset deposit parameters
240
+ * @returns Promise resolving to the prepared transaction data
241
+ */
242
+ async prepareDepositTx(params) {
243
+ try {
244
+ const account = await this.walletClient.getAddresses();
245
+ if (!account[0]) {
246
+ throw new Error('No account found');
247
+ }
248
+ const chainId = await this.publicClient.getChainId();
249
+ const singleAssentDeposit = params.singleAssetDepositContract || getContractAddressByChainIdAndContractName(chainId, 'SingleAssetDeposit');
250
+ await this.publicClient.simulateContract({
251
+ address: singleAssentDeposit,
252
+ abi: singleTokenDepositAbi,
253
+ functionName: 'deposit',
254
+ args: [
255
+ params.assets,
256
+ params.receiver,
257
+ params.vault,
258
+ params.isToken0,
259
+ params.depositSlippagePercent,
260
+ params.swapSlippageBP,
261
+ params.ammType
262
+ ],
263
+ account: account[0]
264
+ });
265
+ return {
266
+ data: {
267
+ address: params.singleAssetDepositContract,
268
+ abi: singleTokenDepositAbi,
269
+ functionName: 'deposit',
270
+ args: [
271
+ params.assets,
272
+ params.receiver,
273
+ params.vault,
274
+ params.isToken0,
275
+ params.depositSlippagePercent,
276
+ params.swapSlippageBP,
277
+ params.ammType
278
+ ]
279
+ },
280
+ status: 200,
281
+ success: true
282
+ };
283
+ }
284
+ catch (error) {
285
+ return {
286
+ data: null,
287
+ status: 500,
288
+ success: false,
289
+ error: error instanceof Error ? error.message : 'Failed to prepare single-asset deposit transaction'
290
+ };
291
+ }
292
+ }
293
+ /**
294
+ * Validates single-asset deposit parameters
295
+ *
296
+ * @param params - Parameters to validate
297
+ * @throws Error if parameters are invalid
298
+ */
299
+ validateDepositParams(params) {
300
+ if (params.assets <= 0n) {
301
+ throw new Error('Assets amount must be greater than 0');
302
+ }
303
+ if (!params.vault || params.vault === '0x0000000000000000000000000000000000000000') {
304
+ throw new Error('Invalid vault address');
305
+ }
306
+ if (!params.receiver || params.receiver === '0x0000000000000000000000000000000000000000') {
307
+ throw new Error('Invalid receiver address');
308
+ }
309
+ if (!params.singleAssetDepositContract || params.singleAssetDepositContract === '0x0000000000000000000000000000000000000000') {
310
+ throw new Error('Invalid single-asset deposit contract address');
311
+ }
312
+ if (params.depositSlippagePercent > 100n) {
313
+ throw new Error('Deposit slippage percent cannot exceed 100%');
314
+ }
315
+ if (params.swapSlippageBP > 10000) {
316
+ throw new Error('Swap slippage BP cannot exceed 10000 (100%)');
317
+ }
318
+ if (!Object.values(AMMType).includes(params.ammType)) {
319
+ throw new Error('Invalid AMM type');
320
+ }
321
+ }
322
+ }
323
+ //# sourceMappingURL=singleAssetDeposit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleAssetDeposit.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/singleAssetDeposit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0CAA0C,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAA0B,MAAM,gBAAgB,CAAC;AAO1G,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACnC,YACmB,YAA0B,EAC1B,YAA0B;QAD1B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,iBAAY,GAAZ,YAAY,CAAc;IAC1C,CAAC;IAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACI,KAAK,CAAC,cAAc,CACzB,MAAgC,EAChC,WAA0B;QAE1B,IAAI,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YACrD,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,IAAI,0CAA0C,CACzG,OAAO,EACP,oBAAoB,CACrB,CAAA;YAED,gCAAgC;YAChC,MAAM,gBAAgB,GAA8B;gBAClD,aAAa,EAAE,MAAM,CAAC,MAAM;gBAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,0BAA0B,EAAE,mBAA8B;aAC3D,CAAC;YAEF,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;YACxF,IAAI,CAAC,gBAAgB,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBACxD,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,gBAAgB,CAAC,MAAM;oBAC/B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gBAAgB,CAAC,KAAK,IAAI,iCAAiC;iBACnE,CAAC;YACJ,CAAC;YAED,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC;YACxD,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE3D,6CAA6C;YAC7C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACzC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;oBAC7B,OAAO,EAAE,WAAW;oBACpB,GAAG,EAAE,gBAAgB;oBACrB,YAAY,EAAE,QAAQ;iBACvB,CAA2B;gBAC5B,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;oBAC7B,OAAO,EAAE,WAAW;oBACpB,GAAG,EAAE,gBAAgB;oBACrB,YAAY,EAAE,QAAQ;iBACvB,CAA2B;aAC7B,CAAC,CAAC;YAEH,gCAAgC;YAChC,MAAM,gBAAgB,GAA8B;gBAClD,IAAI,EAAE,WAAW;gBACjB,UAAU,EAAE,MAAM,CAAC,cAAc;gBACjC,UAAU;gBACV,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM;gBACN,MAAM;aACP,CAAC;YAEF,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;YACxF,IAAI,CAAC,gBAAgB,CAAC,OAAO,IAAI,gBAAgB,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChE,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,gBAAgB,CAAC,MAAM;oBAC/B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,gBAAgB,CAAC,KAAK,IAAI,iCAAiC;iBACnE,CAAC;YACJ,CAAC;YAED,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,IAAI,CAAC;YAEhD,IAAI,GAAG,GAAG,IAAI,CAAC;YACf,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;gBACzC,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;oBACzC,OAAO,EAAE,WAAW;oBACpB,GAAG,EAAE,gBAAgB;oBACrB,YAAY,EAAE,KAAK;iBACpB,CAAW,CAAC;YACf,CAAC;YACD,iCAAiC;YAGjC,wBAAwB;YACxB,MAAM,kBAAkB,GAA2B;gBACjD,WAAW,EAAE,WAAW;gBACxB,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,uCAAuC;gBACnE,UAAU;gBACV,eAAe,EAAE,UAAU;gBAC3B,iBAAiB;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACrC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACtC,GAAG;aACJ,CAAC;YAEF,MAAM,oBAAoB,GAAG,MAAM,wBAAwB,CACzD,IAAI,CAAC,YAAY,EACjB,kBAAkB,EAClB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,uDAAuD;aACzF,CAAC;YACF,IAAI,CAAC,oBAAoB,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC;gBAChE,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,oBAAoB,CAAC,MAAM;oBACnC,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,oBAAoB,CAAC,KAAK,IAAI,yBAAyB;iBAC/D,CAAC;YACJ,CAAC;YAED,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC;YAEjD,6BAA6B;YAC7B,MAAM,kBAAkB,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE;gBACnE,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,cAAc,EAAE,MAAM,CAAC,MAAM;gBAC7B,UAAU;gBACV,UAAU,EAAE,cAAc,CAAC,cAAc;gBACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,kBAAkB,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBAC5D,OAAO;oBACL,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,kBAAkB,CAAC,MAAM;oBACjC,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,kBAAkB,CAAC,KAAK,IAAI,8BAA8B;iBAClE,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC;YAE7C,OAAO;gBACL,IAAI,EAAE;oBACJ,UAAU;oBACV,gBAAgB,EAAE,SAAS;oBAC3B,iBAAiB;oBACjB,cAAc;oBACd,YAAY;oBACZ,UAAU;iBACX;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;aACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACI,KAAK,CAAC,OAAO,CAAC,MAAgC;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,IAAI,0CAA0C,CACzG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,EAChC,oBAAoB,CACrB,CAAA;YAED,0BAA0B;YAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;gBAC3D,OAAO,EAAE,mBAA8B;gBACvC,GAAG,EAAE,qBAAqB;gBAC1B,YAAY,EAAE,SAAS;gBACvB,IAAI,EAAE;oBACJ,MAAM,CAAC,MAAM;oBACb,MAAM,CAAC,QAAQ;oBACf,MAAM,CAAC,KAAK;oBACZ,MAAM,CAAC,QAAQ;oBACf,MAAM,CAAC,sBAAsB;oBAC7B,MAAM,CAAC,cAAc;oBACrB,MAAM,CAAC,OAAO;iBACf;gBACD,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;aACpB,CAAC,CAAC;YAEH,0BAA0B;YAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE5D,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;aACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,gBAAgB,CAAC,MAAgC;QAC5D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAErD,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,IAAI,0CAA0C,CACzG,OAAO,EACP,oBAAoB,CACrB,CAAA;YACD,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;gBACvC,OAAO,EAAE,mBAA8B;gBACvC,GAAG,EAAE,qBAAqB;gBAC1B,YAAY,EAAE,SAAS;gBACvB,IAAI,EAAE;oBACJ,MAAM,CAAC,MAAM;oBACb,MAAM,CAAC,QAAQ;oBACf,MAAM,CAAC,KAAK;oBACZ,MAAM,CAAC,QAAQ;oBACf,MAAM,CAAC,sBAAsB;oBAC7B,MAAM,CAAC,cAAc;oBACrB,MAAM,CAAC,OAAO;iBACf;gBACD,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;aACpB,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE;oBACJ,OAAO,EAAE,MAAM,CAAC,0BAA0B;oBAC1C,GAAG,EAAE,qBAAqB;oBAC1B,YAAY,EAAE,SAAkB;oBAChC,IAAI,EAAE;wBACJ,MAAM,CAAC,MAAM;wBACb,MAAM,CAAC,QAAQ;wBACf,MAAM,CAAC,KAAK;wBACZ,MAAM,CAAC,QAAQ;wBACf,MAAM,CAAC,sBAAsB;wBAC7B,MAAM,CAAC,cAAc;wBACrB,MAAM,CAAC,OAAO;qBACN;iBACX;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI;aACd,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD;aACrG,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,MAAgC;QAC3D,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,4CAA4C,EAAE,CAAC;YACnF,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,4CAA4C,EAAE,CAAC;YACzF,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,0BAA0B,IAAI,MAAM,CAAC,0BAA0B,KAAK,4CAA4C,EAAE,CAAC;YAC7H,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,MAAM,CAAC,sBAAsB,GAAG,IAAI,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,MAAM,CAAC,cAAc,GAAG,KAAK,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * AMM Types supported by single-asset deposits
3
+ */
4
+ export var AMMType;
5
+ (function (AMMType) {
6
+ AMMType[AMMType["UniswapV3"] = 0] = "UniswapV3";
7
+ AMMType[AMMType["Algebra"] = 1] = "Algebra";
8
+ AMMType[AMMType["AlgebraDirectional"] = 2] = "AlgebraDirectional";
9
+ AMMType[AMMType["AlgebraVE33"] = 3] = "AlgebraVE33";
10
+ AMMType[AMMType["AlgebraIntegral"] = 4] = "AlgebraIntegral";
11
+ })(AMMType || (AMMType = {}));
12
+ //# sourceMappingURL=types.js.map