@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.
- package/README.md +281 -11
- package/dist/cjs/base/VaultClient.js +95 -1
- package/dist/cjs/base/VaultClient.js.map +1 -1
- package/dist/cjs/base/vault/single-asset/calculateLimitPrice.js +231 -0
- package/dist/cjs/base/vault/single-asset/calculateLimitPrice.js.map +1 -0
- package/dist/cjs/base/vault/single-asset/calculateSwapAmount.js +68 -0
- package/dist/cjs/base/vault/single-asset/calculateSwapAmount.js.map +1 -0
- package/dist/cjs/base/vault/single-asset/estimateLpTokens.js +355 -0
- package/dist/cjs/base/vault/single-asset/estimateLpTokens.js.map +1 -0
- package/dist/cjs/base/vault/single-asset/index.js +109 -0
- package/dist/cjs/base/vault/single-asset/index.js.map +1 -0
- package/dist/cjs/base/vault/single-asset/simulateSwap.js +291 -0
- package/dist/cjs/base/vault/single-asset/simulateSwap.js.map +1 -0
- package/dist/cjs/base/vault/single-asset/singleAssetDeposit.js +324 -0
- package/dist/cjs/base/vault/single-asset/singleAssetDeposit.js.map +1 -0
- package/dist/cjs/base/vault/single-asset/types.js +15 -0
- package/dist/cjs/base/vault/single-asset/types.js.map +1 -0
- package/dist/cjs/base/vault/utils.js +229 -18
- package/dist/cjs/base/vault/utils.js.map +1 -1
- package/dist/cjs/const/abis/index.js +3 -0
- package/dist/cjs/const/abis/index.js.map +1 -1
- package/dist/cjs/const/abis/quoter.js +248 -0
- package/dist/cjs/const/abis/quoter.js.map +1 -0
- package/dist/cjs/const/abis/singleTokenDeposit.js +925 -0
- package/dist/cjs/const/abis/singleTokenDeposit.js.map +1 -0
- package/dist/cjs/const/amm/configs/protocols/quickswap-integral.js +3 -0
- package/dist/cjs/const/amm/configs/protocols/quickswap-integral.js.map +1 -1
- package/dist/cjs/const/amm/configs/protocols/uniswap.js +15 -0
- package/dist/cjs/const/amm/configs/protocols/uniswap.js.map +1 -1
- package/dist/cjs/const/deployments/abis.js +277 -0
- package/dist/cjs/const/deployments/abis.js.map +1 -1
- package/dist/cjs/const/deployments/polygon.js +8 -0
- package/dist/cjs/const/deployments/polygon.js.map +1 -1
- package/dist/cjs/const/index.js +6 -5
- package/dist/cjs/const/index.js.map +1 -1
- package/dist/cjs/const/network.js.map +1 -1
- package/dist/cjs/const/quoter.js +38 -0
- package/dist/cjs/const/quoter.js.map +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/base/VaultClient.js +81 -1
- package/dist/esm/base/VaultClient.js.map +1 -1
- package/dist/esm/base/vault/single-asset/calculateLimitPrice.js +224 -0
- package/dist/esm/base/vault/single-asset/calculateLimitPrice.js.map +1 -0
- package/dist/esm/base/vault/single-asset/calculateSwapAmount.js +65 -0
- package/dist/esm/base/vault/single-asset/calculateSwapAmount.js.map +1 -0
- package/dist/esm/base/vault/single-asset/estimateLpTokens.js +350 -0
- package/dist/esm/base/vault/single-asset/estimateLpTokens.js.map +1 -0
- package/dist/esm/base/vault/single-asset/index.js +83 -0
- package/dist/esm/base/vault/single-asset/index.js.map +1 -0
- package/dist/esm/base/vault/single-asset/simulateSwap.js +285 -0
- package/dist/esm/base/vault/single-asset/simulateSwap.js.map +1 -0
- package/dist/esm/base/vault/single-asset/singleAssetDeposit.js +320 -0
- package/dist/esm/base/vault/single-asset/singleAssetDeposit.js.map +1 -0
- package/dist/esm/base/vault/single-asset/types.js +12 -0
- package/dist/esm/base/vault/single-asset/types.js.map +1 -0
- package/dist/esm/base/vault/utils.js +226 -18
- package/dist/esm/base/vault/utils.js.map +1 -1
- package/dist/esm/const/abis/index.js +3 -0
- package/dist/esm/const/abis/index.js.map +1 -1
- package/dist/esm/const/abis/quoter.js +245 -0
- package/dist/esm/const/abis/quoter.js.map +1 -0
- package/dist/esm/const/abis/singleTokenDeposit.js +922 -0
- package/dist/esm/const/abis/singleTokenDeposit.js.map +1 -0
- package/dist/esm/const/amm/configs/protocols/quickswap-integral.js +3 -0
- package/dist/esm/const/amm/configs/protocols/quickswap-integral.js.map +1 -1
- package/dist/esm/const/amm/configs/protocols/uniswap.js +15 -0
- package/dist/esm/const/amm/configs/protocols/uniswap.js.map +1 -1
- package/dist/esm/const/deployments/abis.js +277 -0
- package/dist/esm/const/deployments/abis.js.map +1 -1
- package/dist/esm/const/deployments/polygon.js +8 -0
- package/dist/esm/const/deployments/polygon.js.map +1 -1
- package/dist/esm/const/index.js +6 -5
- package/dist/esm/const/index.js.map +1 -1
- package/dist/esm/const/network.js.map +1 -1
- package/dist/esm/const/quoter.js +34 -0
- package/dist/esm/const/quoter.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/base/VaultClient.d.ts +136 -4
- package/dist/types/base/VaultClient.d.ts.map +1 -1
- package/dist/types/base/vault/single-asset/calculateLimitPrice.d.ts +59 -0
- package/dist/types/base/vault/single-asset/calculateLimitPrice.d.ts.map +1 -0
- package/dist/types/base/vault/single-asset/calculateSwapAmount.d.ts +30 -0
- package/dist/types/base/vault/single-asset/calculateSwapAmount.d.ts.map +1 -0
- package/dist/types/base/vault/single-asset/estimateLpTokens.d.ts +61 -0
- package/dist/types/base/vault/single-asset/estimateLpTokens.d.ts.map +1 -0
- package/dist/types/base/vault/single-asset/index.d.ts +80 -0
- package/dist/types/base/vault/single-asset/index.d.ts.map +1 -0
- package/dist/types/base/vault/single-asset/simulateSwap.d.ts +119 -0
- package/dist/types/base/vault/single-asset/simulateSwap.d.ts.map +1 -0
- package/dist/types/base/vault/single-asset/singleAssetDeposit.d.ts +141 -0
- package/dist/types/base/vault/single-asset/singleAssetDeposit.d.ts.map +1 -0
- package/dist/types/base/vault/single-asset/types.d.ts +167 -0
- package/dist/types/base/vault/single-asset/types.d.ts.map +1 -0
- package/dist/types/base/vault/utils.d.ts +95 -0
- package/dist/types/base/vault/utils.d.ts.map +1 -1
- package/dist/types/const/abis/index.d.ts +3 -0
- package/dist/types/const/abis/index.d.ts.map +1 -1
- package/dist/types/const/abis/quoter.d.ts +206 -0
- package/dist/types/const/abis/quoter.d.ts.map +1 -0
- package/dist/types/const/abis/singleTokenDeposit.d.ts +47 -0
- package/dist/types/const/abis/singleTokenDeposit.d.ts.map +1 -0
- package/dist/types/const/amm/configs/protocols/quickswap-integral.d.ts.map +1 -1
- package/dist/types/const/amm/configs/protocols/uniswap.d.ts.map +1 -1
- package/dist/types/const/deployments/abis.d.ts +215 -0
- package/dist/types/const/deployments/abis.d.ts.map +1 -1
- package/dist/types/const/deployments/polygon.d.ts.map +1 -1
- package/dist/types/const/index.d.ts +6 -5
- package/dist/types/const/index.d.ts.map +1 -1
- package/dist/types/const/network.d.ts +2 -0
- package/dist/types/const/network.d.ts.map +1 -1
- package/dist/types/const/quoter.d.ts +17 -0
- package/dist/types/const/quoter.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +3 -0
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SingleAssetDepositClient = void 0;
|
|
4
|
+
const const_1 = require("../../../const");
|
|
5
|
+
const singleTokenDeposit_1 = require("../../../const/abis/singleTokenDeposit");
|
|
6
|
+
const UniswapPool_1 = require("../../../const/abis/UniswapPool");
|
|
7
|
+
const calculateLimitPrice_1 = require("./calculateLimitPrice");
|
|
8
|
+
const calculateSwapAmount_1 = require("./calculateSwapAmount");
|
|
9
|
+
const estimateLpTokens_1 = require("./estimateLpTokens");
|
|
10
|
+
const simulateSwap_1 = require("./simulateSwap");
|
|
11
|
+
const types_1 = require("./types");
|
|
12
|
+
/**
|
|
13
|
+
* Main single-asset deposit client that orchestrates all the steps
|
|
14
|
+
*/
|
|
15
|
+
class SingleAssetDepositClient {
|
|
16
|
+
constructor(publicClient, walletClient) {
|
|
17
|
+
this.publicClient = publicClient;
|
|
18
|
+
this.walletClient = walletClient;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Previews a single-asset deposit by running all simulation steps
|
|
22
|
+
* This allows users to see the expected outcome before executing the transaction
|
|
23
|
+
*
|
|
24
|
+
* @param params - Single-asset deposit parameters
|
|
25
|
+
* @param poolAddress - Address of the pool (must be provided separately)
|
|
26
|
+
* @returns Promise resolving to the complete deposit preview
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const preview = await client.previewDeposit({
|
|
31
|
+
* assets: parseEther('100'),
|
|
32
|
+
* receiver: userAddress,
|
|
33
|
+
* vault: vaultAddress,
|
|
34
|
+
* isToken0: true,
|
|
35
|
+
* depositSlippagePercent: 5n,
|
|
36
|
+
* swapSlippageBP: 500,
|
|
37
|
+
* ammType: AMMType.UniswapV3,
|
|
38
|
+
* singleAssetDepositContract: contractAddress
|
|
39
|
+
* }, poolAddress);
|
|
40
|
+
*
|
|
41
|
+
* if (preview.success) {
|
|
42
|
+
* console.log('Expected LP tokens:', preview.data.lpEstimation.lpTokens);
|
|
43
|
+
* console.log('Swap amount:', preview.data.swapAmount);
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
async previewDeposit(params, poolAddress) {
|
|
48
|
+
try {
|
|
49
|
+
const chainId = await this.publicClient.getChainId();
|
|
50
|
+
const singleAssentDeposit = params.singleAssetDepositContract || (0, const_1.getContractAddressByChainIdAndContractName)(chainId, 'SingleAssetDeposit');
|
|
51
|
+
// Step 1: Calculate swap amount
|
|
52
|
+
const swapAmountParams = {
|
|
53
|
+
depositAmount: params.assets,
|
|
54
|
+
isToken0: params.isToken0,
|
|
55
|
+
vault: params.vault,
|
|
56
|
+
pool: poolAddress,
|
|
57
|
+
ammType: params.ammType,
|
|
58
|
+
singleAssetDepositContract: singleAssentDeposit
|
|
59
|
+
};
|
|
60
|
+
const swapAmountResult = await (0, calculateSwapAmount_1.calculateSwapAmount)(this.publicClient, swapAmountParams);
|
|
61
|
+
if (!swapAmountResult.success || !swapAmountResult.data) {
|
|
62
|
+
return {
|
|
63
|
+
data: null,
|
|
64
|
+
status: swapAmountResult.status,
|
|
65
|
+
success: false,
|
|
66
|
+
error: swapAmountResult.error || 'Failed to calculate swap amount'
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const { swapAmount, sqrtPrice } = swapAmountResult.data;
|
|
70
|
+
const zeroForOne = (0, simulateSwap_1.determineSwapDirection)(params.isToken0);
|
|
71
|
+
// Get token addresses from the pool contract
|
|
72
|
+
const [token0, token1] = await Promise.all([
|
|
73
|
+
this.publicClient.readContract({
|
|
74
|
+
address: poolAddress,
|
|
75
|
+
abi: UniswapPool_1.UniswapV3PoolABI,
|
|
76
|
+
functionName: 'token0'
|
|
77
|
+
}),
|
|
78
|
+
this.publicClient.readContract({
|
|
79
|
+
address: poolAddress,
|
|
80
|
+
abi: UniswapPool_1.UniswapV3PoolABI,
|
|
81
|
+
functionName: 'token1'
|
|
82
|
+
})
|
|
83
|
+
]);
|
|
84
|
+
// Step 2: Calculate limit price
|
|
85
|
+
const limitPriceParams = {
|
|
86
|
+
pool: poolAddress,
|
|
87
|
+
slippageBP: params.swapSlippageBP,
|
|
88
|
+
zeroForOne,
|
|
89
|
+
ammType: params.ammType,
|
|
90
|
+
token0,
|
|
91
|
+
token1
|
|
92
|
+
};
|
|
93
|
+
const limitPriceResult = await (0, calculateLimitPrice_1.calculateLimitPrice)(this.publicClient, limitPriceParams);
|
|
94
|
+
if (!limitPriceResult.success || limitPriceResult.data === null) {
|
|
95
|
+
return {
|
|
96
|
+
data: null,
|
|
97
|
+
status: limitPriceResult.status,
|
|
98
|
+
success: false,
|
|
99
|
+
error: limitPriceResult.error || 'Failed to calculate limit price'
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const sqrtPriceLimitX96 = limitPriceResult.data;
|
|
103
|
+
// Get pool fee from the contract
|
|
104
|
+
const fee = await this.publicClient.readContract({
|
|
105
|
+
address: poolAddress,
|
|
106
|
+
abi: UniswapPool_1.UniswapV3PoolABI,
|
|
107
|
+
functionName: 'fee'
|
|
108
|
+
});
|
|
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 (0, simulateSwap_1.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 (0, estimateLpTokens_1.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 || (0, const_1.getContractAddressByChainIdAndContractName)(this.publicClient.chain?.id || 1, 'SingleAssetDeposit');
|
|
202
|
+
// Prepare the transaction
|
|
203
|
+
const { request } = await this.publicClient.simulateContract({
|
|
204
|
+
address: singleAssentDeposit,
|
|
205
|
+
abi: singleTokenDeposit_1.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 || (0, const_1.getContractAddressByChainIdAndContractName)(chainId, 'SingleAssetDeposit');
|
|
250
|
+
await this.publicClient.simulateContract({
|
|
251
|
+
address: singleAssentDeposit,
|
|
252
|
+
abi: singleTokenDeposit_1.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: singleTokenDeposit_1.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(types_1.AMMType).includes(params.ammType)) {
|
|
319
|
+
throw new Error('Invalid AMM type');
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
exports.SingleAssetDepositClient = SingleAssetDepositClient;
|
|
324
|
+
//# sourceMappingURL=singleAssetDeposit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleAssetDeposit.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/singleAssetDeposit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AMMType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* AMM Types supported by single-asset deposits
|
|
6
|
+
*/
|
|
7
|
+
var AMMType;
|
|
8
|
+
(function (AMMType) {
|
|
9
|
+
AMMType[AMMType["UniswapV3"] = 0] = "UniswapV3";
|
|
10
|
+
AMMType[AMMType["Algebra"] = 1] = "Algebra";
|
|
11
|
+
AMMType[AMMType["AlgebraDirectional"] = 2] = "AlgebraDirectional";
|
|
12
|
+
AMMType[AMMType["AlgebraVE33"] = 3] = "AlgebraVE33";
|
|
13
|
+
AMMType[AMMType["AlgebraIntegral"] = 4] = "AlgebraIntegral";
|
|
14
|
+
})(AMMType || (exports.AMMType = AMMType = {}));
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/types.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,+CAAa,CAAA;IACb,2CAAW,CAAA;IACX,iEAAsB,CAAA;IACtB,mDAAe,CAAA;IACf,2DAAmB,CAAA;AACrB,CAAC,EANW,OAAO,uBAAP,OAAO,QAMlB"}
|
|
@@ -4,23 +4,26 @@ exports.getSlot0 = getSlot0;
|
|
|
4
4
|
exports.getGlobalState = getGlobalState;
|
|
5
5
|
exports.getGlobalStatePoolShark = getGlobalStatePoolShark;
|
|
6
6
|
exports.getGlobalStateAlgebraIntegral = getGlobalStateAlgebraIntegral;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
7
|
+
exports.getPoolState = getPoolState;
|
|
8
|
+
exports.getPoolPrice = getPoolPrice;
|
|
9
|
+
exports.getPoolStateWithPrice = getPoolStateWithPrice;
|
|
10
|
+
// const SLOT0_ABI: any = [
|
|
11
|
+
// {
|
|
12
|
+
// inputs: [],
|
|
13
|
+
// name: 'slot0',
|
|
14
|
+
// outputs: [
|
|
15
|
+
// { internalType: 'uint160', name: 'sqrtPriceX96', type: 'uint160' },
|
|
16
|
+
// { internalType: 'int24', name: 'tick', type: 'int24' },
|
|
17
|
+
// { internalType: 'uint16', name: 'observationIndex', type: 'uint16' },
|
|
18
|
+
// { internalType: 'uint16', name: 'observationCardinality', type: 'uint16' },
|
|
19
|
+
// { internalType: 'uint16', name: 'observationCardinalityNext', type: 'uint16' },
|
|
20
|
+
// { internalType: 'uint8', name: 'feeProtocol', type: 'uint8' },
|
|
21
|
+
// { internalType: 'bool', name: 'unlocked', type: 'bool' },
|
|
22
|
+
// ],
|
|
23
|
+
// stateMutability: 'view',
|
|
24
|
+
// type: 'function',
|
|
25
|
+
// },
|
|
26
|
+
// ] as const;
|
|
24
27
|
const GLOBAL_STATE_ABI = [
|
|
25
28
|
{
|
|
26
29
|
inputs: [],
|
|
@@ -128,7 +131,23 @@ async function getSlot0(publicClient, poolAddress) {
|
|
|
128
131
|
try {
|
|
129
132
|
const slot0 = await publicClient.readContract({
|
|
130
133
|
address: poolAddress,
|
|
131
|
-
abi:
|
|
134
|
+
abi: [
|
|
135
|
+
{
|
|
136
|
+
inputs: [],
|
|
137
|
+
name: 'slot0',
|
|
138
|
+
outputs: [
|
|
139
|
+
{ internalType: 'uint160', name: 'sqrtPriceX96', type: 'uint160' },
|
|
140
|
+
{ internalType: 'int24', name: 'tick', type: 'int24' },
|
|
141
|
+
{ internalType: 'uint16', name: 'observationIndex', type: 'uint16' },
|
|
142
|
+
{ internalType: 'uint16', name: 'observationCardinality', type: 'uint16' },
|
|
143
|
+
{ internalType: 'uint16', name: 'observationCardinalityNext', type: 'uint16' },
|
|
144
|
+
{ internalType: 'uint8', name: 'feeProtocol', type: 'uint8' },
|
|
145
|
+
{ internalType: 'bool', name: 'unlocked', type: 'bool' },
|
|
146
|
+
],
|
|
147
|
+
stateMutability: 'view',
|
|
148
|
+
type: 'function',
|
|
149
|
+
},
|
|
150
|
+
],
|
|
132
151
|
functionName: 'slot0',
|
|
133
152
|
});
|
|
134
153
|
return {
|
|
@@ -285,4 +304,196 @@ async function getGlobalStateAlgebraIntegral(publicClient, poolAddress, isDirect
|
|
|
285
304
|
};
|
|
286
305
|
}
|
|
287
306
|
}
|
|
307
|
+
/**
|
|
308
|
+
* Unified method to get pool state across different AMM types
|
|
309
|
+
* Automatically calls the correct function based on pool type parameters
|
|
310
|
+
*
|
|
311
|
+
* @param publicClient - The public client for blockchain reads
|
|
312
|
+
* @param params - Parameters specifying the pool and its type
|
|
313
|
+
* @returns Promise resolving to standardized pool state data
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* // For Uniswap V3 pool
|
|
318
|
+
* const uniV3State = await getPoolState(publicClient, {
|
|
319
|
+
* poolAddress: '0x...',
|
|
320
|
+
* });
|
|
321
|
+
*
|
|
322
|
+
* // For Algebra pool
|
|
323
|
+
* const algebraState = await getPoolState(publicClient, {
|
|
324
|
+
* poolAddress: '0x...',
|
|
325
|
+
* isAlgebraPool: true,
|
|
326
|
+
* isAlgebraDirectionPool: false
|
|
327
|
+
* });
|
|
328
|
+
*
|
|
329
|
+
* // For PoolShark pool
|
|
330
|
+
* const poolSharkState = await getPoolState(publicClient, {
|
|
331
|
+
* poolAddress: '0x...',
|
|
332
|
+
* isPoolSharkPool: true
|
|
333
|
+
* });
|
|
334
|
+
* ```
|
|
335
|
+
*/
|
|
336
|
+
async function getPoolState(publicClient, params) {
|
|
337
|
+
try {
|
|
338
|
+
let stateResponse;
|
|
339
|
+
// Handle different protocol types following the same logic as getPoolInstance
|
|
340
|
+
if (params.isAlgebraIntegralPool) {
|
|
341
|
+
// For Algebra Integral pools
|
|
342
|
+
stateResponse = await getGlobalStateAlgebraIntegral(publicClient, params.poolAddress, params.isAlgebraDirectionPool || false);
|
|
343
|
+
}
|
|
344
|
+
else if (params.isPoolSharkPool) {
|
|
345
|
+
// For PoolShark pools - convert to standardized format
|
|
346
|
+
const poolSharkResponse = await getGlobalStatePoolShark(publicClient, params.poolAddress);
|
|
347
|
+
if (poolSharkResponse.success && poolSharkResponse.data) {
|
|
348
|
+
stateResponse = {
|
|
349
|
+
success: true,
|
|
350
|
+
status: 200,
|
|
351
|
+
data: {
|
|
352
|
+
sqrtPriceX96: poolSharkResponse.data.pool.price,
|
|
353
|
+
tick: poolSharkResponse.data.pool.tickAtPrice,
|
|
354
|
+
observationIndex: 0,
|
|
355
|
+
observationCardinality: 0,
|
|
356
|
+
observationCardinalityNext: 0,
|
|
357
|
+
feeProtocol: 0,
|
|
358
|
+
unlocked: poolSharkResponse.data.unlocked === 1,
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
stateResponse = {
|
|
364
|
+
data: null,
|
|
365
|
+
status: poolSharkResponse.status,
|
|
366
|
+
success: false,
|
|
367
|
+
error: poolSharkResponse.error
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else if (params.isAlgebraPool) {
|
|
372
|
+
// For Algebra pools
|
|
373
|
+
stateResponse = await getGlobalState(publicClient, params.poolAddress, params.isAlgebraDirectionPool || false);
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
// For standard Uniswap V3 pools
|
|
377
|
+
stateResponse = await getSlot0(publicClient, params.poolAddress);
|
|
378
|
+
}
|
|
379
|
+
if (!stateResponse.success || !stateResponse.data) {
|
|
380
|
+
throw new Error(stateResponse.error || 'Failed to read pool state');
|
|
381
|
+
}
|
|
382
|
+
return {
|
|
383
|
+
data: stateResponse.data,
|
|
384
|
+
status: 200,
|
|
385
|
+
success: true
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
return {
|
|
390
|
+
data: null,
|
|
391
|
+
status: 500,
|
|
392
|
+
success: false,
|
|
393
|
+
error: error instanceof Error ? error.message : 'Failed to get pool state'
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Extracts the appropriate price value from pool state based on AMM type
|
|
399
|
+
* Different AMM protocols store price information in different fields
|
|
400
|
+
*
|
|
401
|
+
* @param poolStateData - The pool state data returned from getPoolState
|
|
402
|
+
* @param params - Pool type parameters to determine which price field to use
|
|
403
|
+
* @returns The price as bigint, or null if price cannot be extracted
|
|
404
|
+
*
|
|
405
|
+
* @example
|
|
406
|
+
* ```typescript
|
|
407
|
+
* const stateResponse = await getPoolState(publicClient, {
|
|
408
|
+
* poolAddress: '0x...',
|
|
409
|
+
* isAlgebraPool: true
|
|
410
|
+
* });
|
|
411
|
+
*
|
|
412
|
+
* if (stateResponse.success && stateResponse.data) {
|
|
413
|
+
* const price = getPoolPrice(stateResponse.data, {
|
|
414
|
+
* isAlgebraPool: true,
|
|
415
|
+
* isAlgebraDirectionPool: false
|
|
416
|
+
* });
|
|
417
|
+
* console.log('Pool price:', price);
|
|
418
|
+
* }
|
|
419
|
+
* ```
|
|
420
|
+
*/
|
|
421
|
+
function getPoolPrice(poolStateData, params) {
|
|
422
|
+
try {
|
|
423
|
+
let price;
|
|
424
|
+
// Extract price based on AMM type - following the same logic as getPoolInstance
|
|
425
|
+
if (params.isAlgebraPool && !params.isAlgebraIntegralPool) {
|
|
426
|
+
// For Algebra pools (non-integral)
|
|
427
|
+
price = (poolStateData)?.price;
|
|
428
|
+
}
|
|
429
|
+
else if (params.isAlgebraIntegralPool) {
|
|
430
|
+
// For Algebra Integral pools
|
|
431
|
+
price = (poolStateData)?.price;
|
|
432
|
+
}
|
|
433
|
+
else if (params.isPoolSharkPool) {
|
|
434
|
+
// For PoolShark pools - price is stored in a nested structure
|
|
435
|
+
price = poolStateData.tick?.price;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
// For standard Uniswap V3 pools
|
|
439
|
+
price = poolStateData.sqrtPriceX96;
|
|
440
|
+
}
|
|
441
|
+
return price || null;
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
console.error('Error extracting pool price:', error);
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Combined method to get both pool state and extract price in one call
|
|
450
|
+
* Convenience method that combines getPoolState and getPoolPrice
|
|
451
|
+
*
|
|
452
|
+
* @param publicClient - The public client for blockchain reads
|
|
453
|
+
* @param params - Parameters specifying the pool and its type
|
|
454
|
+
* @returns Promise resolving to object containing both state and price
|
|
455
|
+
*
|
|
456
|
+
* @example
|
|
457
|
+
* ```typescript
|
|
458
|
+
* const result = await getPoolStateWithPrice(publicClient, {
|
|
459
|
+
* poolAddress: '0x...',
|
|
460
|
+
* isAlgebraPool: true
|
|
461
|
+
* });
|
|
462
|
+
*
|
|
463
|
+
* if (result.success && result.data) {
|
|
464
|
+
* console.log('Pool state:', result.data.state);
|
|
465
|
+
* console.log('Pool price:', result.data.price);
|
|
466
|
+
* }
|
|
467
|
+
* ```
|
|
468
|
+
*/
|
|
469
|
+
async function getPoolStateWithPrice(publicClient, params) {
|
|
470
|
+
try {
|
|
471
|
+
const stateResponse = await getPoolState(publicClient, params);
|
|
472
|
+
if (!stateResponse.success || !stateResponse.data) {
|
|
473
|
+
return {
|
|
474
|
+
data: null,
|
|
475
|
+
status: stateResponse.status,
|
|
476
|
+
success: false,
|
|
477
|
+
error: stateResponse.error || 'Failed to get pool state'
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
const price = getPoolPrice(stateResponse.data, params);
|
|
481
|
+
return {
|
|
482
|
+
data: {
|
|
483
|
+
state: stateResponse.data,
|
|
484
|
+
price
|
|
485
|
+
},
|
|
486
|
+
status: 200,
|
|
487
|
+
success: true
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
return {
|
|
492
|
+
data: null,
|
|
493
|
+
status: 500,
|
|
494
|
+
success: false,
|
|
495
|
+
error: error instanceof Error ? error.message : 'Failed to get pool state with price'
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
}
|
|
288
499
|
//# sourceMappingURL=utils.js.map
|