@steerprotocol/sdk 1.19.14 → 1.19.16

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 (119) 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 +291 -0
  13. package/dist/cjs/base/vault/single-asset/simulateSwap.js.map +1 -0
  14. package/dist/cjs/base/vault/single-asset/singleAssetDeposit.js +324 -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 +248 -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/quickswap-integral.js +3 -0
  27. package/dist/cjs/const/amm/configs/protocols/quickswap-integral.js.map +1 -1
  28. package/dist/cjs/const/amm/configs/protocols/uniswap.js +15 -0
  29. package/dist/cjs/const/amm/configs/protocols/uniswap.js.map +1 -1
  30. package/dist/cjs/const/deployments/abis.js +277 -0
  31. package/dist/cjs/const/deployments/abis.js.map +1 -1
  32. package/dist/cjs/const/deployments/polygon.js +8 -0
  33. package/dist/cjs/const/deployments/polygon.js.map +1 -1
  34. package/dist/cjs/const/index.js +6 -5
  35. package/dist/cjs/const/index.js.map +1 -1
  36. package/dist/cjs/const/network.js.map +1 -1
  37. package/dist/cjs/const/quoter.js +38 -0
  38. package/dist/cjs/const/quoter.js.map +1 -0
  39. package/dist/cjs/index.js +1 -0
  40. package/dist/cjs/index.js.map +1 -1
  41. package/dist/esm/base/VaultClient.js +81 -1
  42. package/dist/esm/base/VaultClient.js.map +1 -1
  43. package/dist/esm/base/vault/single-asset/calculateLimitPrice.js +224 -0
  44. package/dist/esm/base/vault/single-asset/calculateLimitPrice.js.map +1 -0
  45. package/dist/esm/base/vault/single-asset/calculateSwapAmount.js +65 -0
  46. package/dist/esm/base/vault/single-asset/calculateSwapAmount.js.map +1 -0
  47. package/dist/esm/base/vault/single-asset/estimateLpTokens.js +350 -0
  48. package/dist/esm/base/vault/single-asset/estimateLpTokens.js.map +1 -0
  49. package/dist/esm/base/vault/single-asset/index.js +83 -0
  50. package/dist/esm/base/vault/single-asset/index.js.map +1 -0
  51. package/dist/esm/base/vault/single-asset/simulateSwap.js +285 -0
  52. package/dist/esm/base/vault/single-asset/simulateSwap.js.map +1 -0
  53. package/dist/esm/base/vault/single-asset/singleAssetDeposit.js +320 -0
  54. package/dist/esm/base/vault/single-asset/singleAssetDeposit.js.map +1 -0
  55. package/dist/esm/base/vault/single-asset/types.js +12 -0
  56. package/dist/esm/base/vault/single-asset/types.js.map +1 -0
  57. package/dist/esm/base/vault/utils.js +226 -18
  58. package/dist/esm/base/vault/utils.js.map +1 -1
  59. package/dist/esm/const/abis/index.js +3 -0
  60. package/dist/esm/const/abis/index.js.map +1 -1
  61. package/dist/esm/const/abis/quoter.js +245 -0
  62. package/dist/esm/const/abis/quoter.js.map +1 -0
  63. package/dist/esm/const/abis/singleTokenDeposit.js +922 -0
  64. package/dist/esm/const/abis/singleTokenDeposit.js.map +1 -0
  65. package/dist/esm/const/amm/configs/protocols/quickswap-integral.js +3 -0
  66. package/dist/esm/const/amm/configs/protocols/quickswap-integral.js.map +1 -1
  67. package/dist/esm/const/amm/configs/protocols/uniswap.js +15 -0
  68. package/dist/esm/const/amm/configs/protocols/uniswap.js.map +1 -1
  69. package/dist/esm/const/deployments/abis.js +277 -0
  70. package/dist/esm/const/deployments/abis.js.map +1 -1
  71. package/dist/esm/const/deployments/polygon.js +8 -0
  72. package/dist/esm/const/deployments/polygon.js.map +1 -1
  73. package/dist/esm/const/index.js +6 -5
  74. package/dist/esm/const/index.js.map +1 -1
  75. package/dist/esm/const/network.js.map +1 -1
  76. package/dist/esm/const/quoter.js +34 -0
  77. package/dist/esm/const/quoter.js.map +1 -0
  78. package/dist/esm/index.js +1 -0
  79. package/dist/esm/index.js.map +1 -1
  80. package/dist/types/base/VaultClient.d.ts +136 -4
  81. package/dist/types/base/VaultClient.d.ts.map +1 -1
  82. package/dist/types/base/vault/single-asset/calculateLimitPrice.d.ts +59 -0
  83. package/dist/types/base/vault/single-asset/calculateLimitPrice.d.ts.map +1 -0
  84. package/dist/types/base/vault/single-asset/calculateSwapAmount.d.ts +30 -0
  85. package/dist/types/base/vault/single-asset/calculateSwapAmount.d.ts.map +1 -0
  86. package/dist/types/base/vault/single-asset/estimateLpTokens.d.ts +61 -0
  87. package/dist/types/base/vault/single-asset/estimateLpTokens.d.ts.map +1 -0
  88. package/dist/types/base/vault/single-asset/index.d.ts +80 -0
  89. package/dist/types/base/vault/single-asset/index.d.ts.map +1 -0
  90. package/dist/types/base/vault/single-asset/simulateSwap.d.ts +119 -0
  91. package/dist/types/base/vault/single-asset/simulateSwap.d.ts.map +1 -0
  92. package/dist/types/base/vault/single-asset/singleAssetDeposit.d.ts +141 -0
  93. package/dist/types/base/vault/single-asset/singleAssetDeposit.d.ts.map +1 -0
  94. package/dist/types/base/vault/single-asset/types.d.ts +167 -0
  95. package/dist/types/base/vault/single-asset/types.d.ts.map +1 -0
  96. package/dist/types/base/vault/utils.d.ts +95 -0
  97. package/dist/types/base/vault/utils.d.ts.map +1 -1
  98. package/dist/types/const/abis/index.d.ts +3 -0
  99. package/dist/types/const/abis/index.d.ts.map +1 -1
  100. package/dist/types/const/abis/quoter.d.ts +206 -0
  101. package/dist/types/const/abis/quoter.d.ts.map +1 -0
  102. package/dist/types/const/abis/singleTokenDeposit.d.ts +47 -0
  103. package/dist/types/const/abis/singleTokenDeposit.d.ts.map +1 -0
  104. package/dist/types/const/amm/configs/protocols/quickswap-integral.d.ts.map +1 -1
  105. package/dist/types/const/amm/configs/protocols/uniswap.d.ts.map +1 -1
  106. package/dist/types/const/deployments/abis.d.ts +215 -0
  107. package/dist/types/const/deployments/abis.d.ts.map +1 -1
  108. package/dist/types/const/deployments/polygon.d.ts.map +1 -1
  109. package/dist/types/const/index.d.ts +6 -5
  110. package/dist/types/const/index.d.ts.map +1 -1
  111. package/dist/types/const/network.d.ts +2 -0
  112. package/dist/types/const/network.d.ts.map +1 -1
  113. package/dist/types/const/quoter.d.ts +17 -0
  114. package/dist/types/const/quoter.d.ts.map +1 -0
  115. package/dist/types/index.d.ts +1 -0
  116. package/dist/types/index.d.ts.map +1 -1
  117. package/dist/types/types.d.ts +3 -0
  118. package/dist/types/types.d.ts.map +1 -1
  119. package/package.json +1 -1
@@ -0,0 +1,350 @@
1
+ import { abis } from '../../../const/deployments/abis';
2
+ import { getContractAddressByChainIdAndContractName } from '../../../const/network';
3
+ // Use the vault ABI for reading vault state
4
+ const VAULT_ABI = abis.QuickSwapUniv3MultiPositionLiquidityManager;
5
+ /**
6
+ * Estimates the amount of LP tokens that will be received based on the final token amounts
7
+ * This calculation follows the Solidity getShares implementation from the vault contract
8
+ *
9
+ * @param publicClient - Viem public client for blockchain reads
10
+ * @param params - Parameters for LP token estimation
11
+ * @returns Promise resolving to the estimated LP tokens and final amounts
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const result = await estimateLpTokens(publicClient, {
16
+ * vault: '0x...',
17
+ * originalAssets: parseEther('100'),
18
+ * swapAmount: parseEther('50'),
19
+ * swapResult: { amount0: -parseEther('50'), amount1: parseEther('150') },
20
+ * isToken0: true
21
+ * });
22
+ *
23
+ * if (result.success) {
24
+ * console.log('Estimated LP tokens:', result.data.lpTokens);
25
+ * console.log('Final amount0:', result.data.finalAmount0);
26
+ * console.log('Final amount1:', result.data.finalAmount1);
27
+ * }
28
+ * ```
29
+ */
30
+ export async function estimateLpTokens(publicClient, params) {
31
+ try {
32
+ // Calculate final amounts based on original deposit and swap results
33
+ const finalAmount0 = params.isToken0
34
+ ? params.originalAssets - params.swapAmount + (params.swapResult.amount0 < 0n ? -params.swapResult.amount0 : params.swapResult.amount0)
35
+ : (params.swapResult.amount0 < 0n ? -params.swapResult.amount0 : params.swapResult.amount0);
36
+ const finalAmount1 = params.isToken0
37
+ ? (params.swapResult.amount1 < 0n ? -params.swapResult.amount1 : params.swapResult.amount1)
38
+ : params.originalAssets - params.swapAmount + (params.swapResult.amount1 < 0n ? -params.swapResult.amount1 : params.swapResult.amount1);
39
+ // Get vault reserves and total supply
40
+ const [totalSupply, tokenBalances] = await Promise.all([
41
+ publicClient.readContract({
42
+ address: params.vault,
43
+ abi: [{
44
+ "inputs": [],
45
+ "name": "totalSupply",
46
+ "outputs": [
47
+ {
48
+ "internalType": "uint256",
49
+ "name": "",
50
+ "type": "uint256"
51
+ }
52
+ ],
53
+ "stateMutability": "view",
54
+ "type": "function"
55
+ },],
56
+ functionName: 'totalSupply'
57
+ }),
58
+ // Get token0 address first, then balance
59
+ publicClient.readContract({
60
+ address: params.vault,
61
+ abi: [{
62
+ "inputs": [],
63
+ "name": "getTotalAmounts",
64
+ "outputs": [
65
+ {
66
+ "internalType": "uint256",
67
+ "name": "total0",
68
+ "type": "uint256"
69
+ },
70
+ {
71
+ "internalType": "uint256",
72
+ "name": "total1",
73
+ "type": "uint256"
74
+ }
75
+ ],
76
+ "stateMutability": "view",
77
+ "type": "function"
78
+ },],
79
+ functionName: 'getTotalAmounts'
80
+ })
81
+ ]);
82
+ const chainId = await publicClient.getChainId();
83
+ const helper = getContractAddressByChainIdAndContractName(chainId, 'Helper');
84
+ const [shares, amount0Used, amount1Used] = await publicClient.readContract({
85
+ address: helper,
86
+ abi: [{
87
+ "inputs": [
88
+ {
89
+ "internalType": "uint256",
90
+ "name": "_totalSupply",
91
+ "type": "uint256"
92
+ },
93
+ {
94
+ "internalType": "uint256",
95
+ "name": "total0",
96
+ "type": "uint256"
97
+ },
98
+ {
99
+ "internalType": "uint256",
100
+ "name": "total1",
101
+ "type": "uint256"
102
+ },
103
+ {
104
+ "internalType": "uint256",
105
+ "name": "amount0Desired",
106
+ "type": "uint256"
107
+ },
108
+ {
109
+ "internalType": "uint256",
110
+ "name": "amount1Desired",
111
+ "type": "uint256"
112
+ },
113
+ {
114
+ "internalType": "uint256",
115
+ "name": "amount0Min",
116
+ "type": "uint256"
117
+ },
118
+ {
119
+ "internalType": "uint256",
120
+ "name": "amount1Min",
121
+ "type": "uint256"
122
+ },
123
+ {
124
+ "internalType": "uint256",
125
+ "name": "minShares",
126
+ "type": "uint256"
127
+ }
128
+ ],
129
+ "name": "getShares",
130
+ "outputs": [
131
+ {
132
+ "internalType": "uint256",
133
+ "name": "shares",
134
+ "type": "uint256"
135
+ },
136
+ {
137
+ "internalType": "uint256",
138
+ "name": "amount0Used",
139
+ "type": "uint256"
140
+ },
141
+ {
142
+ "internalType": "uint256",
143
+ "name": "amount1Used",
144
+ "type": "uint256"
145
+ }
146
+ ],
147
+ "stateMutability": "pure",
148
+ "type": "function"
149
+ }],
150
+ functionName: 'getShares',
151
+ args: [
152
+ totalSupply,
153
+ tokenBalances[0],
154
+ tokenBalances[1],
155
+ finalAmount0,
156
+ finalAmount1,
157
+ 0n, // amount0Min = 0 as requested
158
+ 0n, // amount1Min = 0 as requested
159
+ 0n // minShares = 0
160
+ ]
161
+ });
162
+ return {
163
+ data: {
164
+ lpTokens: shares,
165
+ finalAmount0: amount0Used,
166
+ finalAmount1: amount1Used
167
+ },
168
+ status: 200,
169
+ success: true
170
+ };
171
+ }
172
+ catch (error) {
173
+ return {
174
+ data: null,
175
+ status: 500,
176
+ success: false,
177
+ error: error instanceof Error ? error.message : 'Failed to estimate LP tokens'
178
+ };
179
+ }
180
+ }
181
+ /**
182
+ * Calculates shares (LP tokens) based on deposit amounts and vault reserves
183
+ * This is a TypeScript implementation of the Solidity getShares function
184
+ *
185
+ * @param totalSupply - Current total supply of LP tokens
186
+ * @param total0 - Current balance of token0 in vault
187
+ * @param total1 - Current balance of token1 in vault
188
+ * @param amount0Desired - Desired amount of token0 to deposit
189
+ * @param amount1Desired - Desired amount of token1 to deposit
190
+ * @param amount0Min - Minimum amount of token0 (set to 0n)
191
+ * @param amount1Min - Minimum amount of token1 (set to 0n)
192
+ * @param minShares - Minimum shares required (set to 0n)
193
+ * @returns Object with shares, amount0Used, and amount1Used
194
+ */
195
+ export function getShares(totalSupply, total0, total1, amount0Desired, amount1Desired, amount0Min, amount1Min, minShares) {
196
+ // If total supply > 0, vault can't be empty.
197
+ if (!(totalSupply === 0n || total0 > 0n || total1 > 0n)) {
198
+ throw new Error('Invalid vault state');
199
+ }
200
+ let shares;
201
+ let amount0Used = 0n;
202
+ let amount1Used = 0n;
203
+ if (totalSupply === 0n) {
204
+ // For first deposit, just use the amounts desired
205
+ amount0Used = amount0Desired;
206
+ amount1Used = amount1Desired;
207
+ shares = amount0Used > amount1Used ? amount0Used : amount1Used;
208
+ if (shares < minShares) {
209
+ throw new Error('Insufficient shares for minimum requirement');
210
+ }
211
+ }
212
+ else if (total0 === 0n) {
213
+ // Vault only has token1
214
+ shares = mulDiv(amount1Desired, totalSupply, total1);
215
+ amount1Used = mulDivRoundingUp(shares, total1, totalSupply);
216
+ amount0Used = 0n;
217
+ }
218
+ else if (total1 === 0n) {
219
+ // Vault only has token0
220
+ shares = mulDiv(amount0Desired, totalSupply, total0);
221
+ amount0Used = mulDivRoundingUp(shares, total0, totalSupply);
222
+ amount1Used = 0n;
223
+ }
224
+ else {
225
+ // Both tokens present - calculate cross product
226
+ const cross = min(amount0Desired * total1, amount1Desired * total0);
227
+ if (cross === 0n) {
228
+ throw new Error('Invalid deposit ratio - cross product is zero');
229
+ }
230
+ // Round up amounts
231
+ amount0Used = ((cross - 1n) / total1) + 1n;
232
+ amount1Used = ((cross - 1n) / total0) + 1n;
233
+ shares = mulDiv(cross, totalSupply, total0) / total1;
234
+ }
235
+ // Validate requirements
236
+ if (shares === 0n) {
237
+ throw new Error('Zero shares calculated');
238
+ }
239
+ if (amount0Used < amount0Min) {
240
+ throw new Error('Amount0 used less than minimum');
241
+ }
242
+ if (amount1Used < amount1Min) {
243
+ throw new Error('Amount1 used less than minimum');
244
+ }
245
+ return { shares, amount0Used, amount1Used };
246
+ }
247
+ /**
248
+ * Multiplies two BigInt values and divides by a third (a * b / c)
249
+ * Equivalent to Solidity's FullMath.mulDiv
250
+ */
251
+ function mulDiv(a, b, c) {
252
+ if (c === 0n) {
253
+ throw new Error('Division by zero');
254
+ }
255
+ return (a * b) / c;
256
+ }
257
+ /**
258
+ * Multiplies two BigInt values, divides by a third, and rounds up
259
+ * Equivalent to Solidity's FullMath.mulDivRoundingUp
260
+ */
261
+ function mulDivRoundingUp(a, b, c) {
262
+ if (c === 0n) {
263
+ throw new Error('Division by zero');
264
+ }
265
+ const result = (a * b) / c;
266
+ const remainder = (a * b) % c;
267
+ return remainder > 0n ? result + 1n : result;
268
+ }
269
+ /**
270
+ * Returns the minimum of two BigInt values
271
+ */
272
+ function min(a, b) {
273
+ return a < b ? a : b;
274
+ }
275
+ /**
276
+ * Gets the current vault reserves for both tokens
277
+ *
278
+ * @param publicClient - Viem public client for blockchain reads
279
+ * @param vaultAddress - Address of the vault
280
+ * @returns Promise resolving to [token0Balance, token1Balance, totalSupply]
281
+ */
282
+ export async function getVaultReserves(publicClient, vaultAddress) {
283
+ try {
284
+ const [totalSupply, token0Address, token1Address] = await Promise.all([
285
+ publicClient.readContract({
286
+ address: vaultAddress,
287
+ abi: VAULT_ABI,
288
+ functionName: 'totalSupply'
289
+ }),
290
+ publicClient.readContract({
291
+ address: vaultAddress,
292
+ abi: VAULT_ABI,
293
+ functionName: 'token0'
294
+ }),
295
+ publicClient.readContract({
296
+ address: vaultAddress,
297
+ abi: VAULT_ABI,
298
+ functionName: 'token1'
299
+ })
300
+ ]);
301
+ const [token0Balance, token1Balance] = await Promise.all([
302
+ publicClient.readContract({
303
+ address: token0Address,
304
+ abi: [
305
+ {
306
+ type: 'function',
307
+ name: 'balanceOf',
308
+ inputs: [{ name: 'account', type: 'address', internalType: 'address' }],
309
+ outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
310
+ stateMutability: 'view'
311
+ }
312
+ ],
313
+ functionName: 'balanceOf',
314
+ args: [vaultAddress]
315
+ }),
316
+ publicClient.readContract({
317
+ address: token1Address,
318
+ abi: [
319
+ {
320
+ type: 'function',
321
+ name: 'balanceOf',
322
+ inputs: [{ name: 'account', type: 'address', internalType: 'address' }],
323
+ outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
324
+ stateMutability: 'view'
325
+ }
326
+ ],
327
+ functionName: 'balanceOf',
328
+ args: [vaultAddress]
329
+ })
330
+ ]);
331
+ return {
332
+ data: {
333
+ token0Balance,
334
+ token1Balance,
335
+ totalSupply
336
+ },
337
+ status: 200,
338
+ success: true
339
+ };
340
+ }
341
+ catch (error) {
342
+ return {
343
+ data: null,
344
+ status: 500,
345
+ success: false,
346
+ error: error instanceof Error ? error.message : 'Failed to get vault reserves'
347
+ };
348
+ }
349
+ }
350
+ //# sourceMappingURL=estimateLpTokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimateLpTokens.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/estimateLpTokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ // Export all types
2
+ export * from './types';
3
+ // Export individual functions for separate testing and usage
4
+ export { calculateSwapAmount } from './calculateSwapAmount';
5
+ export { calculateLimitPrice, getPoolSlot0 } from './calculateLimitPrice';
6
+ export { simulateSwap, determineSwapDirection, validateSwapParams } from './simulateSwap';
7
+ export { estimateLpTokens, getVaultReserves } from './estimateLpTokens';
8
+ // Export the main client
9
+ export { SingleAssetDepositClient } from './singleAssetDeposit';
10
+ /**
11
+ * @fileoverview Single-Asset Deposit Module
12
+ *
13
+ * This module provides comprehensive functionality for single-asset deposits into liquidity vaults.
14
+ * The process allows users to deposit only one token (token0 or token1), while the contract
15
+ * internally performs a swap to balance the token pair before depositing into the vault.
16
+ *
17
+ * ## Architecture
18
+ *
19
+ * The single-asset deposit process is broken down into separate, testable functions:
20
+ *
21
+ * 1. **calculateSwapAmount** - Determines how much of the input token needs to be swapped
22
+ * 2. **calculateLimitPrice** - Calculates slippage protection limits for the internal swap
23
+ * 3. **simulateSwap** - Simulates the swap to preview expected output amounts
24
+ * 4. **estimateLpTokens** - Estimates the final LP tokens that will be received
25
+ * 5. **SingleAssetDepositClient** - Main orchestrator that combines all steps
26
+ *
27
+ * ## Supported AMM Types
28
+ *
29
+ * Currently supports:
30
+ * - UniswapV3 (fully implemented)
31
+ * - Algebra variants (planned for future implementation)
32
+ *
33
+ * ## Example Usage
34
+ *
35
+ * ```typescript
36
+ * import { SingleAssetDepositClient, AMMType } from '@steerprotocol/sdk';
37
+ * import { parseEther } from 'viem';
38
+ *
39
+ * // Initialize the client
40
+ * const client = new SingleAssetDepositClient(publicClient, walletClient);
41
+ *
42
+ * // Preview the deposit
43
+ * const preview = await client.previewDeposit({
44
+ * assets: parseEther('100'),
45
+ * receiver: userAddress,
46
+ * vault: vaultAddress,
47
+ * isToken0: true,
48
+ * depositSlippagePercent: 5n,
49
+ * swapSlippageBP: 500,
50
+ * ammType: AMMType.UniswapV3,
51
+ * singleAssetDepositContract: contractAddress
52
+ * }, poolAddress);
53
+ *
54
+ * if (preview.success) {
55
+ * console.log('Expected LP tokens:', preview.data.lpEstimation.lpTokens);
56
+ *
57
+ * // Execute the deposit
58
+ * const result = await client.deposit(params);
59
+ * if (result.success) {
60
+ * console.log('Transaction hash:', result.data);
61
+ * }
62
+ * }
63
+ * ```
64
+ *
65
+ * ## Testing Individual Functions
66
+ *
67
+ * Each function can be tested separately:
68
+ *
69
+ * ```typescript
70
+ * import { calculateSwapAmount, AMMType } from '@steerprotocol/sdk';
71
+ *
72
+ * // Test swap amount calculation
73
+ * const result = await calculateSwapAmount(publicClient, {
74
+ * depositAmount: parseEther('100'),
75
+ * isToken0: true,
76
+ * vault: vaultAddress,
77
+ * pool: poolAddress,
78
+ * ammType: AMMType.UniswapV3,
79
+ * singleAssetDepositContract: contractAddress
80
+ * });
81
+ * ```
82
+ */
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,cAAc,SAAS,CAAC;AAExB,6DAA6D;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAExE,yBAAyB;AACzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG"}