@paxoslabs/amplify-sdk 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +7 -45
  2. package/README.md +22 -22
  3. package/dist/{chain-utils-D_b2LEEi.d.mts → chain-utils-5r2UnCDS.d.mts} +57 -1
  4. package/dist/{chain-utils-D_b2LEEi.d.ts → chain-utils-5r2UnCDS.d.ts} +57 -1
  5. package/dist/{chunk-L5XT67QZ.js → chunk-4NQPS3JC.js} +813 -147
  6. package/dist/chunk-4NQPS3JC.js.map +1 -0
  7. package/dist/{chunk-7RWWVUHP.mjs → chunk-6CU533DM.mjs} +2 -2
  8. package/dist/chunk-6CU533DM.mjs.map +1 -0
  9. package/dist/chunk-6JLKHV6O.js +128 -0
  10. package/dist/chunk-6JLKHV6O.js.map +1 -0
  11. package/dist/{chunk-YAYUSBC6.js → chunk-FHE43NKY.js} +12 -12
  12. package/dist/chunk-FHE43NKY.js.map +1 -0
  13. package/dist/chunk-GOJQYEJQ.js +3212 -0
  14. package/dist/chunk-GOJQYEJQ.js.map +1 -0
  15. package/dist/{chunk-3D6EDR3Z.mjs → chunk-LMNADWTH.mjs} +703 -41
  16. package/dist/chunk-LMNADWTH.mjs.map +1 -0
  17. package/dist/chunk-ODXJYXUH.mjs +3168 -0
  18. package/dist/chunk-ODXJYXUH.mjs.map +1 -0
  19. package/dist/{chunk-WJGSTAPB.mjs → chunk-QMFYPHX5.mjs} +300 -87
  20. package/dist/chunk-QMFYPHX5.mjs.map +1 -0
  21. package/dist/{chunk-3I3PYX2F.js → chunk-TNL23CO2.js} +2 -2
  22. package/dist/chunk-TNL23CO2.js.map +1 -0
  23. package/dist/{chunk-E6SBQNDA.mjs → chunk-UY2WD7MF.mjs} +3 -3
  24. package/dist/chunk-UY2WD7MF.mjs.map +1 -0
  25. package/dist/chunk-WD6QFSXZ.js +701 -0
  26. package/dist/chunk-WD6QFSXZ.js.map +1 -0
  27. package/dist/chunk-Y5LBT2WT.mjs +118 -0
  28. package/dist/chunk-Y5LBT2WT.mjs.map +1 -0
  29. package/dist/core.d.mts +50 -7
  30. package/dist/core.d.ts +50 -7
  31. package/dist/core.js +32 -16
  32. package/dist/core.js.map +1 -1
  33. package/dist/core.mjs +4 -4
  34. package/dist/core.mjs.map +1 -1
  35. package/dist/display.d.mts +212 -3
  36. package/dist/display.d.ts +212 -3
  37. package/dist/display.js +27 -11
  38. package/dist/display.mjs +5 -5
  39. package/dist/index-D8RtV9cB.d.mts +5114 -0
  40. package/dist/index-ev_V5sjt.d.ts +5114 -0
  41. package/dist/index.d.mts +41 -6
  42. package/dist/index.d.ts +41 -6
  43. package/dist/index.js +90 -58
  44. package/dist/index.mjs +6 -6
  45. package/dist/utils.d.mts +1 -1
  46. package/dist/utils.d.ts +1 -1
  47. package/dist/utils.js +13 -13
  48. package/dist/utils.js.map +1 -1
  49. package/dist/utils.mjs +3 -3
  50. package/dist/utils.mjs.map +1 -1
  51. package/dist/vaults.d.mts +3 -3817
  52. package/dist/vaults.d.ts +3 -3817
  53. package/dist/vaults.js +26 -26
  54. package/dist/vaults.mjs +5 -5
  55. package/package.json +30 -65
  56. package/dist/chunk-3D6EDR3Z.mjs.map +0 -1
  57. package/dist/chunk-3I3PYX2F.js.map +0 -1
  58. package/dist/chunk-7RWWVUHP.mjs.map +0 -1
  59. package/dist/chunk-AUDMOT6F.js +0 -1230
  60. package/dist/chunk-AUDMOT6F.js.map +0 -1
  61. package/dist/chunk-E5DH5YEE.js +0 -1485
  62. package/dist/chunk-E5DH5YEE.js.map +0 -1
  63. package/dist/chunk-E6SBQNDA.mjs.map +0 -1
  64. package/dist/chunk-JLZL25CY.mjs +0 -1450
  65. package/dist/chunk-JLZL25CY.mjs.map +0 -1
  66. package/dist/chunk-L5XT67QZ.js.map +0 -1
  67. package/dist/chunk-WJGSTAPB.mjs.map +0 -1
  68. package/dist/chunk-XVDK6J72.js +0 -484
  69. package/dist/chunk-XVDK6J72.js.map +0 -1
  70. package/dist/chunk-Y6RXVDQN.mjs +0 -1222
  71. package/dist/chunk-Y6RXVDQN.mjs.map +0 -1
  72. package/dist/chunk-YAYUSBC6.js.map +0 -1
@@ -1,484 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkAUDMOT6F_js = require('./chunk-AUDMOT6F.js');
4
- var chunkYAYUSBC6_js = require('./chunk-YAYUSBC6.js');
5
- var chunk3I3PYX2F_js = require('./chunk-3I3PYX2F.js');
6
- var chunkE5DH5YEE_js = require('./chunk-E5DH5YEE.js');
7
- var viem = require('viem');
8
-
9
- async function getMinimumMint(params) {
10
- try {
11
- const normalizedChainId = chunkE5DH5YEE_js.toChainId(params.chainId);
12
- const config = await chunkAUDMOT6F_js.resolveVault({
13
- vaultName: params.vaultName,
14
- assetAddress: params.depositAssetAddress,
15
- chainId: normalizedChainId,
16
- callerEndpoint: "getMinimumMint"
17
- });
18
- if (!config.vault.accountantAddress) {
19
- throw new chunkE5DH5YEE_js.APIError(
20
- `Accountant contract address not configured for vault ${config.id}`,
21
- { endpoint: "getMinimumMint" }
22
- );
23
- }
24
- if (!config.vault.boringVaultAddress) {
25
- throw new chunkE5DH5YEE_js.APIError(
26
- `BoringVault contract address not configured for vault ${config.id}`,
27
- { endpoint: "getMinimumMint" }
28
- );
29
- }
30
- const rateResults = await chunkYAYUSBC6_js.getRateInQuoteWithAssetDecimals({
31
- assetAddress: params.depositAssetAddress,
32
- accountantAddress: config.vault.accountantAddress,
33
- chainId: normalizedChainId
34
- });
35
- const [assetDecimalsResult, exchangeRateResult] = rateResults;
36
- if (assetDecimalsResult.status === "failure" || exchangeRateResult.status === "failure") {
37
- throw new chunkE5DH5YEE_js.APIError(
38
- `Failed to get exchange rate or asset decimals: ${assetDecimalsResult.error?.message || exchangeRateResult.error?.message}`,
39
- { endpoint: "getMinimumMint" }
40
- );
41
- }
42
- const assetDecimals = assetDecimalsResult.result;
43
- const exchangeRate = exchangeRateResult.result;
44
- const shareDecimals = await chunkYAYUSBC6_js.getErc20Decimals({
45
- tokenAddress: config.vault.boringVaultAddress,
46
- chainId: normalizedChainId
47
- });
48
- const depositAmountBigInt = viem.parseUnits(
49
- params.depositAmount,
50
- assetDecimals
51
- );
52
- const expectedShares = chunk3I3PYX2F_js.calculateExpectedSharesMinted(
53
- depositAmountBigInt,
54
- exchangeRate,
55
- shareDecimals
56
- );
57
- return {
58
- expectedShares,
59
- exchangeRate,
60
- shareDecimals,
61
- assetDecimals
62
- };
63
- } catch (error) {
64
- if (error instanceof chunkE5DH5YEE_js.APIError) {
65
- throw error;
66
- }
67
- throw new chunkE5DH5YEE_js.APIError(
68
- `Failed to calculate minimum mint: ${error instanceof Error ? error.message : String(error)}`,
69
- { endpoint: "getMinimumMint", cause: error }
70
- );
71
- }
72
- }
73
-
74
- // src/display/vault-display.ts
75
- async function resolveVaultAddressForDisplay(params, callerEndpoint) {
76
- if (params.vaultAddress) {
77
- if (!chunkE5DH5YEE_js.isValidAddress(params.vaultAddress)) {
78
- throw new chunkE5DH5YEE_js.APIError(
79
- `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,
80
- { endpoint: callerEndpoint }
81
- );
82
- }
83
- return params.vaultAddress;
84
- }
85
- if (params.vaultName) {
86
- const cache = chunkE5DH5YEE_js.getCache();
87
- if (cache.isEmpty() || cache.isExpired()) {
88
- await cache.refresh();
89
- }
90
- const vault = cache.getVaultByName(params.vaultName);
91
- if (!vault) {
92
- throw new chunkAUDMOT6F_js.VaultNotFoundByNameError(
93
- `No vault found with name "${params.vaultName}". The vault may not exist or may not be available for your organization.`,
94
- { vaultName: params.vaultName, endpoint: callerEndpoint }
95
- );
96
- }
97
- return vault.vault.boringVaultAddress;
98
- }
99
- throw new chunkE5DH5YEE_js.APIError(
100
- "Either vaultAddress or vaultName must be provided.",
101
- { endpoint: callerEndpoint }
102
- );
103
- }
104
- async function getVaultAPY(params) {
105
- try {
106
- const resolvedAddress = await resolveVaultAddressForDisplay(
107
- params,
108
- "getVaultAPY"
109
- );
110
- const queryParams = new URLSearchParams({
111
- filter: `vaultAddress=${resolvedAddress}`,
112
- orderByTimestamp: "desc",
113
- pageSize: "1"
114
- });
115
- const url = `${chunkE5DH5YEE_js.getRestV2BaseURL()}/amplify/vaultApys?${queryParams.toString()}`;
116
- const controller = new AbortController();
117
- const timeout = setTimeout(
118
- () => controller.abort(),
119
- chunkE5DH5YEE_js.DEFAULT_TIMEOUT
120
- );
121
- const response = await fetch(url, {
122
- method: "GET",
123
- headers: chunkE5DH5YEE_js.getRequestHeaders(),
124
- signal: controller.signal
125
- });
126
- clearTimeout(timeout);
127
- if (!response.ok) {
128
- throw new chunkE5DH5YEE_js.APIError(
129
- `Failed to fetch vault APY: ${response.status} ${response.statusText}`,
130
- { endpoint: "getVaultAPY", statusCode: response.status }
131
- );
132
- }
133
- const data = await response.json();
134
- if (!data.vaultApys || data.vaultApys.length === 0) {
135
- throw new chunkE5DH5YEE_js.APIError(
136
- `No APY data found for vault ${resolvedAddress}`,
137
- { endpoint: "getVaultAPY" }
138
- );
139
- }
140
- const latest = data.vaultApys[0];
141
- const apyNumber = Number.parseFloat(latest.apy);
142
- return {
143
- apy: apyNumber,
144
- apyFormatted: `${apyNumber.toFixed(2)}%`,
145
- vaultAddress: latest.vaultAddress,
146
- timestamp: latest.timestamp
147
- };
148
- } catch (error) {
149
- if (error instanceof chunkE5DH5YEE_js.APIError) {
150
- throw error;
151
- }
152
- throw new chunkE5DH5YEE_js.APIError(
153
- `Failed to fetch vault APY: ${error instanceof Error ? error.message : String(error)}`,
154
- { endpoint: "getVaultAPY", cause: error }
155
- );
156
- }
157
- }
158
- async function getVaultTVL(params) {
159
- try {
160
- const resolvedAddress = await resolveVaultAddressForDisplay(
161
- params,
162
- "getVaultTVL"
163
- );
164
- const filterParts = [
165
- `vaultAddress=${resolvedAddress}`
166
- ];
167
- if (params.chainId !== void 0) {
168
- filterParts.push(`chainId=${params.chainId}`);
169
- }
170
- const queryParams = new URLSearchParams({
171
- filter: filterParts.join(" AND "),
172
- includeCurrent: "true",
173
- orderByTimestamp: "desc",
174
- pageSize: "1"
175
- });
176
- const url = `${chunkE5DH5YEE_js.getRestV2BaseURL()}/amplify/vaultTvls?${queryParams.toString()}`;
177
- const controller = new AbortController();
178
- const timeout = setTimeout(
179
- () => controller.abort(),
180
- chunkE5DH5YEE_js.DEFAULT_TIMEOUT
181
- );
182
- const response = await fetch(url, {
183
- method: "GET",
184
- headers: chunkE5DH5YEE_js.getRequestHeaders(),
185
- signal: controller.signal
186
- });
187
- clearTimeout(timeout);
188
- if (!response.ok) {
189
- throw new chunkE5DH5YEE_js.APIError(
190
- `Failed to fetch vault TVL: ${response.status} ${response.statusText}`,
191
- { endpoint: "getVaultTVL", statusCode: response.status }
192
- );
193
- }
194
- const data = await response.json();
195
- if (!data.vaultTvls || data.vaultTvls.length === 0) {
196
- throw new chunkE5DH5YEE_js.APIError(
197
- `No TVL data found for vault ${resolvedAddress}`,
198
- { endpoint: "getVaultTVL" }
199
- );
200
- }
201
- const latest = data.vaultTvls[0];
202
- return {
203
- tvl: latest.tvl,
204
- tvlAsset: latest.tvlAsset,
205
- vaultAddress: latest.vaultAddress,
206
- chainId: latest.chainId,
207
- timestamp: latest.timestamp
208
- };
209
- } catch (error) {
210
- if (error instanceof chunkE5DH5YEE_js.APIError) {
211
- throw error;
212
- }
213
- throw new chunkE5DH5YEE_js.APIError(
214
- `Failed to fetch vault TVL: ${error instanceof Error ? error.message : String(error)}`,
215
- { endpoint: "getVaultTVL", cause: error }
216
- );
217
- }
218
- }
219
-
220
- // src/abi/fee-module-abi.ts
221
- var FeeModuleAbi = [
222
- {
223
- inputs: [
224
- { internalType: "uint256", name: "_offerFeePercentage", type: "uint256" }
225
- ],
226
- stateMutability: "nonpayable",
227
- type: "constructor"
228
- },
229
- {
230
- inputs: [
231
- { internalType: "uint256", name: "feePercentage", type: "uint256" },
232
- { internalType: "uint256", name: "maxAllowed", type: "uint256" }
233
- ],
234
- name: "FeePercentageTooHigh",
235
- type: "error"
236
- },
237
- {
238
- inputs: [
239
- { internalType: "uint256", name: "amount", type: "uint256" },
240
- { internalType: "contract IERC20", name: "offerAsset", type: "address" },
241
- { internalType: "contract IERC20", name: "wantAsset", type: "address" },
242
- { internalType: "address", name: "receiver", type: "address" }
243
- ],
244
- name: "calculateOfferFees",
245
- outputs: [{ internalType: "uint256", name: "feeAmount", type: "uint256" }],
246
- stateMutability: "view",
247
- type: "function"
248
- },
249
- {
250
- inputs: [],
251
- name: "offerFeePercentage",
252
- outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
253
- stateMutability: "view",
254
- type: "function"
255
- }
256
- ];
257
-
258
- // src/display/withdrawal-display.ts
259
- function buildFilterString(params) {
260
- return Object.entries(params).filter(([, v]) => v !== void 0).map(([k, v]) => `${k}=${v}`).join(" AND ");
261
- }
262
- async function getWithdrawalRequests(params) {
263
- try {
264
- if (!chunkE5DH5YEE_js.isValidAddress(params.userAddress)) {
265
- throw new chunkE5DH5YEE_js.APIError(
266
- `Invalid userAddress: ${params.userAddress}. Must be a valid Ethereum address.`,
267
- { endpoint: "getWithdrawalRequests" }
268
- );
269
- }
270
- let resolvedVaultAddress = params.vaultAddress;
271
- if (!resolvedVaultAddress && params.vaultName) {
272
- const cache = chunkE5DH5YEE_js.getCache();
273
- if (cache.isEmpty() || cache.isExpired()) {
274
- await cache.refresh();
275
- }
276
- const vault = cache.getVaultByName(params.vaultName);
277
- if (!vault) {
278
- throw new chunkAUDMOT6F_js.VaultNotFoundByNameError(
279
- `No vault found with name "${params.vaultName}". The vault may not exist or may not be available for your organization.`,
280
- { vaultName: params.vaultName, endpoint: "getWithdrawalRequests" }
281
- );
282
- }
283
- resolvedVaultAddress = vault.vault.boringVaultAddress;
284
- }
285
- const filter = buildFilterString({
286
- userAddress: params.userAddress,
287
- chainId: params.chainId,
288
- vaultAddress: resolvedVaultAddress,
289
- status: params.status
290
- });
291
- const queryParams = new URLSearchParams();
292
- if (filter) queryParams.set("filter", filter);
293
- if (params.pageSize)
294
- queryParams.set("pageSize", String(params.pageSize));
295
- if (params.pageToken)
296
- queryParams.set("pageToken", params.pageToken);
297
- const url = `${chunkE5DH5YEE_js.getRestV2BaseURL()}/amplify/withdrawalRequests?${queryParams.toString()}`;
298
- const controller = new AbortController();
299
- const timeout = setTimeout(
300
- () => controller.abort(),
301
- chunkE5DH5YEE_js.DEFAULT_TIMEOUT
302
- );
303
- const response = await fetch(url, {
304
- method: "GET",
305
- headers: chunkE5DH5YEE_js.getRequestHeaders(),
306
- signal: controller.signal
307
- });
308
- clearTimeout(timeout);
309
- if (!response.ok) {
310
- throw new chunkE5DH5YEE_js.APIError(
311
- `Failed to fetch withdrawal requests: ${response.status} ${response.statusText}`,
312
- {
313
- endpoint: "getWithdrawalRequests",
314
- statusCode: response.status
315
- }
316
- );
317
- }
318
- const data = await response.json();
319
- return {
320
- withdrawalRequests: data.withdrawalRequests ?? [],
321
- nextPageToken: data.nextPageToken ?? null
322
- };
323
- } catch (error) {
324
- if (error instanceof chunkE5DH5YEE_js.APIError) {
325
- throw error;
326
- }
327
- throw new chunkE5DH5YEE_js.APIError(
328
- `Failed to fetch withdrawal requests: ${error instanceof Error ? error.message : String(error)}`,
329
- { endpoint: "getWithdrawalRequests", cause: error }
330
- );
331
- }
332
- }
333
- async function getWithdrawalFee(params) {
334
- try {
335
- const normalizedChainId = chunkE5DH5YEE_js.toChainId(params.chainId);
336
- const config = await chunkAUDMOT6F_js.resolveVault({
337
- vaultName: params.vaultName,
338
- assetAddress: params.assetAddress,
339
- chainId: normalizedChainId,
340
- callerEndpoint: "getWithdrawalFee"
341
- });
342
- if (!config.vault.withdrawQueueAddress) {
343
- throw new chunkE5DH5YEE_js.APIError(
344
- `WithdrawQueue contract address not configured for vault ${config.id}`,
345
- { endpoint: "getWithdrawalFee" }
346
- );
347
- }
348
- if (!config.vault.boringVaultAddress) {
349
- throw new chunkE5DH5YEE_js.APIError(
350
- `BoringVault contract address not configured for vault ${config.id}`,
351
- { endpoint: "getWithdrawalFee" }
352
- );
353
- }
354
- const client = await chunkE5DH5YEE_js.getClient(normalizedChainId);
355
- const feeModuleAddress = await client.readContract({
356
- abi: chunkAUDMOT6F_js.WithdrawQueueAbi,
357
- address: config.vault.withdrawQueueAddress,
358
- functionName: "feeModule"
359
- });
360
- const shareDecimals = await chunkYAYUSBC6_js.getErc20Decimals({
361
- tokenAddress: config.vault.boringVaultAddress,
362
- chainId: normalizedChainId
363
- });
364
- const amountBigInt = viem.parseUnits(params.amount, shareDecimals);
365
- const results = await client.multicall({
366
- contracts: [
367
- {
368
- abi: FeeModuleAbi,
369
- address: feeModuleAddress,
370
- functionName: "calculateOfferFees",
371
- args: [
372
- amountBigInt,
373
- params.offerAsset,
374
- params.wantAsset,
375
- params.receiver
376
- ]
377
- },
378
- {
379
- abi: FeeModuleAbi,
380
- address: feeModuleAddress,
381
- functionName: "offerFeePercentage"
382
- }
383
- ]
384
- });
385
- const [feeAmountResult, feePercentageResult] = results;
386
- if (feeAmountResult.status === "failure" || feePercentageResult.status === "failure") {
387
- throw new chunkE5DH5YEE_js.APIError(
388
- "Failed to read fee data from FeeModule contract",
389
- { endpoint: "getWithdrawalFee" }
390
- );
391
- }
392
- return {
393
- feeAmount: feeAmountResult.result,
394
- feePercentage: feePercentageResult.result
395
- };
396
- } catch (error) {
397
- if (error instanceof chunkE5DH5YEE_js.APIError) {
398
- throw error;
399
- }
400
- throw new chunkE5DH5YEE_js.APIError(
401
- `Failed to get withdrawal fee: ${error instanceof Error ? error.message : String(error)}`,
402
- { endpoint: "getWithdrawalFee", cause: error }
403
- );
404
- }
405
- }
406
- async function getMinimumWithdrawalOrderSize(params) {
407
- try {
408
- const normalizedChainId = chunkE5DH5YEE_js.toChainId(params.chainId);
409
- const config = await chunkAUDMOT6F_js.resolveVault({
410
- vaultName: params.vaultName,
411
- assetAddress: params.assetAddress,
412
- chainId: normalizedChainId,
413
- callerEndpoint: "getMinimumWithdrawalOrderSize"
414
- });
415
- if (!config.vault.withdrawQueueAddress) {
416
- throw new chunkE5DH5YEE_js.APIError(
417
- `WithdrawQueue contract address not configured for vault ${config.id}`,
418
- { endpoint: "getMinimumWithdrawalOrderSize" }
419
- );
420
- }
421
- if (!config.vault.boringVaultAddress) {
422
- throw new chunkE5DH5YEE_js.APIError(
423
- `BoringVault contract address not configured for vault ${config.id}`,
424
- { endpoint: "getMinimumWithdrawalOrderSize" }
425
- );
426
- }
427
- const client = await chunkE5DH5YEE_js.getClient(normalizedChainId);
428
- const [minOrderResult, shareDecimalsResult] = await client.multicall({
429
- contracts: [
430
- {
431
- abi: chunkAUDMOT6F_js.WithdrawQueueAbi,
432
- address: config.vault.withdrawQueueAddress,
433
- functionName: "minimumOrderSize"
434
- },
435
- {
436
- abi: [
437
- {
438
- inputs: [],
439
- name: "decimals",
440
- outputs: [
441
- {
442
- internalType: "uint8",
443
- name: "",
444
- type: "uint8"
445
- }
446
- ],
447
- stateMutability: "view",
448
- type: "function"
449
- }
450
- ],
451
- address: config.vault.boringVaultAddress,
452
- functionName: "decimals"
453
- }
454
- ]
455
- });
456
- if (minOrderResult.status === "failure" || shareDecimalsResult.status === "failure") {
457
- throw new chunkE5DH5YEE_js.APIError(
458
- "Failed to read minimum order size from WithdrawQueue contract",
459
- { endpoint: "getMinimumWithdrawalOrderSize" }
460
- );
461
- }
462
- return {
463
- minimumOrderSize: minOrderResult.result,
464
- shareDecimals: shareDecimalsResult.result
465
- };
466
- } catch (error) {
467
- if (error instanceof chunkE5DH5YEE_js.APIError) {
468
- throw error;
469
- }
470
- throw new chunkE5DH5YEE_js.APIError(
471
- `Failed to get minimum withdrawal order size: ${error instanceof Error ? error.message : String(error)}`,
472
- { endpoint: "getMinimumWithdrawalOrderSize", cause: error }
473
- );
474
- }
475
- }
476
-
477
- exports.getMinimumMint = getMinimumMint;
478
- exports.getMinimumWithdrawalOrderSize = getMinimumWithdrawalOrderSize;
479
- exports.getVaultAPY = getVaultAPY;
480
- exports.getVaultTVL = getVaultTVL;
481
- exports.getWithdrawalFee = getWithdrawalFee;
482
- exports.getWithdrawalRequests = getWithdrawalRequests;
483
- //# sourceMappingURL=chunk-XVDK6J72.js.map
484
- //# sourceMappingURL=chunk-XVDK6J72.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/display/deposit-display.ts","../src/display/vault-display.ts","../src/abi/fee-module-abi.ts","../src/display/withdrawal-display.ts"],"names":["toChainId","resolveVault","APIError","getRateInQuoteWithAssetDecimals","getErc20Decimals","parseUnits","calculateExpectedSharesMinted","isValidAddress","getCache","VaultNotFoundByNameError","getRestV2BaseURL","DEFAULT_TIMEOUT","getRequestHeaders","getClient","WithdrawQueueAbi"],"mappings":"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","file":"chunk-XVDK6J72.js","sourcesContent":["/**\n * @file Deposit display helpers\n * @module display/deposit-display\n */\n\nimport { parseUnits } from \"viem\";\nimport { getRateInQuoteWithAssetDecimals } from \"../api/accountant\";\nimport { getErc20Decimals } from \"../api/erc20\";\nimport { resolveVault } from \"../client/resolve-vault\";\nimport { APIError } from \"../types/amplify-sdk-api\";\nimport { calculateExpectedSharesMinted } from \"../utils/bigint\";\nimport { toChainId } from \"../utils/chain-utils\";\nimport type { GetMinimumMintParams, MinimumMintResult } from \"./types\";\n\n/**\n * Calculates the expected vault shares a user will receive for a deposit\n *\n * Uses the on-chain exchange rate from the Accountant contract to calculate\n * how many vault shares will be minted for a given deposit amount.\n *\n * @param params - Deposit parameters\n * @returns Expected shares, exchange rate, and decimal info\n * @throws {APIError} If vault not found or contract read fails\n *\n * @example\n * ```typescript\n * const result = await getMinimumMint({\n * vaultName: \"Amplify USDC Core\",\n * chainId: 1,\n * depositAssetAddress: \"0xA0b8...\", // USDC\n * depositAmount: \"1000.0\",\n * });\n * console.log(result.expectedShares);\n * ```\n */\nexport async function getMinimumMint(\n params: GetMinimumMintParams\n): Promise<MinimumMintResult> {\n try {\n const normalizedChainId = toChainId(params.chainId);\n\n const config = await resolveVault({\n vaultName: params.vaultName,\n assetAddress: params.depositAssetAddress,\n chainId: normalizedChainId,\n callerEndpoint: \"getMinimumMint\",\n });\n\n if (!config.vault.accountantAddress) {\n throw new APIError(\n `Accountant contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n // Get exchange rate and asset decimals via multicall\n const rateResults = await getRateInQuoteWithAssetDecimals({\n assetAddress: params.depositAssetAddress,\n accountantAddress: config.vault.accountantAddress,\n chainId: normalizedChainId,\n });\n const [assetDecimalsResult, exchangeRateResult] = rateResults;\n if (assetDecimalsResult.status === \"failure\" || exchangeRateResult.status === \"failure\") {\n throw new APIError(\n `Failed to get exchange rate or asset decimals: ${assetDecimalsResult.error?.message || exchangeRateResult.error?.message\n }`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n const assetDecimals = assetDecimalsResult.result;\n const exchangeRate = exchangeRateResult.result;\n\n // Get vault share decimals\n const shareDecimals = await getErc20Decimals({\n tokenAddress: config.vault.boringVaultAddress,\n chainId: normalizedChainId,\n });\n\n // Parse deposit amount using asset decimals\n const depositAmountBigInt = parseUnits(\n params.depositAmount,\n assetDecimals\n );\n\n // Calculate expected shares\n const expectedShares = calculateExpectedSharesMinted(\n depositAmountBigInt,\n exchangeRate,\n shareDecimals\n );\n\n return {\n expectedShares,\n exchangeRate,\n shareDecimals,\n assetDecimals,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to calculate minimum mint: ${error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getMinimumMint\", cause: error }\n );\n }\n}\n","/**\n * @file Vault display helpers\n * @module display/vault-display\n */\n\nimport type { Address } from \"viem\";\nimport { getCache } from \"../client/amplify-sdk-client\";\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\nimport { APIError, isValidAddress } from \"../types/amplify-sdk-api\";\nimport { VaultNotFoundByNameError } from \"../types/withdraw-errors\";\nimport { DEFAULT_TIMEOUT } from \"../utils/fetch\";\nimport type {\n GetVaultAPYParams,\n GetVaultTVLParams,\n VaultAPYResult,\n VaultTVLResult,\n} from \"./types\";\n\n/**\n * Resolves a vault's on-chain BoringVault address for REST API display queries\n * (APY, TVL). Accepts either a direct `vaultAddress` or a `vaultName` lookup\n * via the local cache. No asset validation is performed since these are\n * informational queries, not transaction-prep.\n */\nasync function resolveVaultAddressForDisplay(\n params: { vaultAddress?: Address; vaultName?: string; chainId?: number },\n callerEndpoint: string\n): Promise<Address> {\n if (params.vaultAddress) {\n if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: callerEndpoint }\n );\n }\n return params.vaultAddress;\n }\n\n if (params.vaultName) {\n const cache = getCache();\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n const vault = cache.getVaultByName(params.vaultName);\n if (!vault) {\n throw new VaultNotFoundByNameError(\n `No vault found with name \"${params.vaultName}\". The vault may not exist or may not be available for your organization.`,\n { vaultName: params.vaultName, endpoint: callerEndpoint }\n );\n }\n return vault.vault.boringVaultAddress;\n }\n\n throw new APIError(\n \"Either vaultAddress or vaultName must be provided.\",\n { endpoint: callerEndpoint }\n );\n}\n\n/**\n * Fetches the latest APY for a vault from the backend API\n *\n * Requests the most recent APY data point by using\n * orderByTimestamp=desc with pageSize=1.\n *\n * @param params - Vault identifier parameters (vaultAddress, vaultName, or both)\n * @returns Latest APY value and metadata\n * @throws {APIError} If the API request fails or no data found\n *\n * @example\n * ```typescript\n * const result = await getVaultAPY({\n * vaultAddress: \"0x1234...\",\n * });\n * console.log(result.apyFormatted); // \"4.50%\"\n * ```\n */\nexport async function getVaultAPY(\n params: GetVaultAPYParams\n): Promise<VaultAPYResult> {\n try {\n const resolvedAddress = await resolveVaultAddressForDisplay(\n params,\n \"getVaultAPY\"\n );\n\n const queryParams = new URLSearchParams({\n filter: `vaultAddress=${resolvedAddress}`,\n orderByTimestamp: \"desc\",\n pageSize: \"1\",\n });\n\n const url = `${getRestV2BaseURL()}/amplify/vaultApys?${queryParams.toString()}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n DEFAULT_TIMEOUT\n );\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new APIError(\n `Failed to fetch vault APY: ${response.status} ${response.statusText}`,\n { endpoint: \"getVaultAPY\", statusCode: response.status }\n );\n }\n\n const data = (await response.json()) as {\n vaultApys: Array<{\n vaultAddress: string;\n timestamp: string;\n interval: string;\n apy: string;\n }>;\n nextPageToken: string | null;\n };\n\n if (!data.vaultApys || data.vaultApys.length === 0) {\n throw new APIError(\n `No APY data found for vault ${resolvedAddress}`,\n { endpoint: \"getVaultAPY\" }\n );\n }\n\n const latest = data.vaultApys[0];\n const apyNumber = Number.parseFloat(latest.apy);\n\n return {\n apy: apyNumber,\n apyFormatted: `${apyNumber.toFixed(2)}%`,\n vaultAddress: latest.vaultAddress as Address,\n timestamp: latest.timestamp,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to fetch vault APY: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getVaultAPY\", cause: error }\n );\n }\n}\n\n/**\n * Fetches the current TVL for a vault from the backend API\n *\n * Requests the most recent TVL data point by using\n * includeCurrent=true, orderByTimestamp=desc with pageSize=1.\n *\n * @param params - Vault identifier parameters (vaultAddress, vaultName, or both)\n * @returns Current TVL value and metadata\n * @throws {APIError} If the API request fails or no data found\n *\n * @example\n * ```typescript\n * const result = await getVaultTVL({\n * vaultAddress: \"0x1234...\",\n * });\n * console.log(result.tvl, result.tvlAsset);\n * ```\n */\nexport async function getVaultTVL(\n params: GetVaultTVLParams\n): Promise<VaultTVLResult> {\n try {\n const resolvedAddress = await resolveVaultAddressForDisplay(\n params,\n \"getVaultTVL\"\n );\n\n const filterParts = [\n `vaultAddress=${resolvedAddress}`,\n ];\n if (params.chainId !== undefined) {\n filterParts.push(`chainId=${params.chainId}`);\n }\n\n const queryParams = new URLSearchParams({\n filter: filterParts.join(\" AND \"),\n includeCurrent: \"true\",\n orderByTimestamp: \"desc\",\n pageSize: \"1\",\n });\n\n const url = `${getRestV2BaseURL()}/amplify/vaultTvls?${queryParams.toString()}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n DEFAULT_TIMEOUT\n );\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new APIError(\n `Failed to fetch vault TVL: ${response.status} ${response.statusText}`,\n { endpoint: \"getVaultTVL\", statusCode: response.status }\n );\n }\n\n const data = (await response.json()) as {\n vaultTvls: Array<{\n vaultAddress: string;\n chainId: number;\n timestamp: string;\n interval: string;\n tvl: string;\n tvlAsset: string;\n }>;\n nextPageToken: string | null;\n };\n\n if (!data.vaultTvls || data.vaultTvls.length === 0) {\n throw new APIError(\n `No TVL data found for vault ${resolvedAddress}`,\n { endpoint: \"getVaultTVL\" }\n );\n }\n\n const latest = data.vaultTvls[0];\n\n return {\n tvl: latest.tvl,\n tvlAsset: latest.tvlAsset,\n vaultAddress: latest.vaultAddress as Address,\n chainId: latest.chainId,\n timestamp: latest.timestamp,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to fetch vault TVL: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getVaultTVL\", cause: error }\n );\n }\n}\n","export const FeeModuleAbi = [\n {\n inputs: [\n { internalType: \"uint256\", name: \"_offerFeePercentage\", type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [\n { internalType: \"uint256\", name: \"feePercentage\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"maxAllowed\", type: \"uint256\" },\n ],\n name: \"FeePercentageTooHigh\",\n type: \"error\",\n },\n {\n inputs: [\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n { internalType: \"contract IERC20\", name: \"offerAsset\", type: \"address\" },\n { internalType: \"contract IERC20\", name: \"wantAsset\", type: \"address\" },\n { internalType: \"address\", name: \"receiver\", type: \"address\" },\n ],\n name: \"calculateOfferFees\",\n outputs: [{ internalType: \"uint256\", name: \"feeAmount\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"offerFeePercentage\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","/**\n * @file Withdrawal display helpers\n * @module display/withdrawal-display\n */\n\nimport { type Address, parseUnits } from \"viem\";\nimport { FeeModuleAbi } from \"../abi/fee-module-abi\";\nimport { WithdrawQueueAbi } from \"../abi/withdraw-queue-abi\";\nimport { getErc20Decimals } from \"../api/erc20\";\nimport { getCache } from \"../client/amplify-sdk-client\";\nimport { resolveVault } from \"../client/resolve-vault\";\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\nimport { getClient } from \"../lib/viem/client\";\nimport { APIError } from \"../types/amplify-sdk-api\";\nimport { isValidAddress } from \"../types/amplify-sdk-api\";\nimport { VaultNotFoundByNameError } from \"../types/withdraw-errors\";\nimport { DEFAULT_TIMEOUT } from \"../utils/fetch\";\nimport { toChainId } from \"../utils/chain-utils\";\nimport type {\n GetMinimumWithdrawalOrderSizeParams,\n GetWithdrawalFeeParams,\n GetWithdrawalRequestsParams,\n MinimumWithdrawalOrderSizeResult,\n WithdrawalFeeResult,\n WithdrawalRequest,\n WithdrawalRequestsResult,\n} from \"./types\";\n\n/**\n * Builds a filter string from typed params for the v2 API\n */\nfunction buildFilterString(\n params: Record<string, string | number | boolean | undefined>\n): string {\n return Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${k}=${v}`)\n .join(\" AND \");\n}\n\n/**\n * Fetches a user's withdrawal requests from the backend API\n *\n * @param params - Filter parameters for withdrawal requests\n * @returns Paginated list of withdrawal requests\n * @throws {APIError} If the API request fails or parameters are invalid\n *\n * @example\n * ```typescript\n * const result = await getWithdrawalRequests({\n * userAddress: \"0x1234...\",\n * status: \"PENDING\",\n * chainId: 1,\n * });\n * console.log(result.withdrawalRequests);\n * ```\n */\nexport async function getWithdrawalRequests(\n params: GetWithdrawalRequestsParams\n): Promise<WithdrawalRequestsResult> {\n try {\n if (!isValidAddress(params.userAddress)) {\n throw new APIError(\n `Invalid userAddress: ${params.userAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getWithdrawalRequests\" }\n );\n }\n\n let resolvedVaultAddress = params.vaultAddress;\n if (!resolvedVaultAddress && params.vaultName) {\n const cache = getCache();\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n const vault = cache.getVaultByName(params.vaultName);\n if (!vault) {\n throw new VaultNotFoundByNameError(\n `No vault found with name \"${params.vaultName}\". The vault may not exist or may not be available for your organization.`,\n { vaultName: params.vaultName, endpoint: \"getWithdrawalRequests\" }\n );\n }\n resolvedVaultAddress = vault.vault.boringVaultAddress;\n }\n\n const filter = buildFilterString({\n userAddress: params.userAddress,\n chainId: params.chainId,\n vaultAddress: resolvedVaultAddress,\n status: params.status,\n });\n\n const queryParams = new URLSearchParams();\n if (filter) queryParams.set(\"filter\", filter);\n if (params.pageSize)\n queryParams.set(\"pageSize\", String(params.pageSize));\n if (params.pageToken)\n queryParams.set(\"pageToken\", params.pageToken);\n\n const url = `${getRestV2BaseURL()}/amplify/withdrawalRequests?${queryParams.toString()}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n DEFAULT_TIMEOUT\n );\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new APIError(\n `Failed to fetch withdrawal requests: ${response.status} ${response.statusText}`,\n {\n endpoint: \"getWithdrawalRequests\",\n statusCode: response.status,\n }\n );\n }\n\n const data = (await response.json()) as {\n withdrawalRequests: WithdrawalRequest[];\n nextPageToken: string | null;\n };\n\n return {\n withdrawalRequests: data.withdrawalRequests ?? [],\n nextPageToken: data.nextPageToken ?? null,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to fetch withdrawal requests: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getWithdrawalRequests\", cause: error }\n );\n }\n}\n\n/**\n * Reads the withdrawal fee from the on-chain FeeModule contract\n *\n * Performs two sequential RPC calls:\n * 1. Reads the FeeModule address from WithdrawQueue.feeModule()\n * 2. Multicalls calculateOfferFees + offerFeePercentage on the FeeModule\n *\n * @param params - Parameters for fee calculation\n * @returns Fee amount and fee percentage\n * @throws {APIError} If vault not found or contract read fails\n *\n * @example\n * ```typescript\n * const fee = await getWithdrawalFee({\n * vaultName: \"Amplify USDC Core\",\n * chainId: 1,\n * assetAddress: \"0xA0b8...\", // USDC\n * amount: \"1.0\",\n * offerAsset: \"0x1234...\", // vault shares\n * wantAsset: \"0xA0b8...\", // USDC\n * receiver: \"0x5678...\",\n * });\n * console.log(fee.feeAmount, fee.feePercentage);\n * ```\n */\nexport async function getWithdrawalFee(\n params: GetWithdrawalFeeParams\n): Promise<WithdrawalFeeResult> {\n try {\n const normalizedChainId = toChainId(params.chainId);\n\n const config = await resolveVault({\n vaultName: params.vaultName,\n assetAddress: params.assetAddress,\n chainId: normalizedChainId,\n callerEndpoint: \"getWithdrawalFee\",\n });\n\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n const client = await getClient(normalizedChainId);\n\n // Step 1: Read the FeeModule address from WithdrawQueue\n const feeModuleAddress = (await client.readContract({\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: \"feeModule\",\n })) as Address;\n\n // Get share decimals to parse the amount\n const shareDecimals = await getErc20Decimals({\n tokenAddress: config.vault.boringVaultAddress,\n chainId: normalizedChainId,\n });\n\n const amountBigInt = parseUnits(params.amount, shareDecimals);\n\n // Step 2: Multicall calculateOfferFees + offerFeePercentage\n const results = await client.multicall({\n contracts: [\n {\n abi: FeeModuleAbi,\n address: feeModuleAddress,\n functionName: \"calculateOfferFees\",\n args: [\n amountBigInt,\n params.offerAsset,\n params.wantAsset,\n params.receiver,\n ],\n },\n {\n abi: FeeModuleAbi,\n address: feeModuleAddress,\n functionName: \"offerFeePercentage\",\n },\n ],\n });\n\n const [feeAmountResult, feePercentageResult] = results;\n\n if (\n feeAmountResult.status === \"failure\" ||\n feePercentageResult.status === \"failure\"\n ) {\n throw new APIError(\n \"Failed to read fee data from FeeModule contract\",\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n return {\n feeAmount: feeAmountResult.result,\n feePercentage: feePercentageResult.result,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to get withdrawal fee: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getWithdrawalFee\", cause: error }\n );\n }\n}\n\n/**\n * Reads the minimum withdrawal order size from the WithdrawQueue contract\n *\n * @param params - Parameters to identify the vault\n * @returns Minimum order size in vault shares and share decimals\n * @throws {APIError} If vault not found or contract read fails\n *\n * @example\n * ```typescript\n * const result = await getMinimumWithdrawalOrderSize({\n * vaultName: \"Amplify USDC Core\",\n * chainId: 1,\n * assetAddress: \"0xA0b8...\",\n * });\n * console.log(result.minimumOrderSize, result.shareDecimals);\n * ```\n */\nexport async function getMinimumWithdrawalOrderSize(\n params: GetMinimumWithdrawalOrderSizeParams\n): Promise<MinimumWithdrawalOrderSizeResult> {\n try {\n const normalizedChainId = toChainId(params.chainId);\n\n const config = await resolveVault({\n vaultName: params.vaultName,\n assetAddress: params.assetAddress,\n chainId: normalizedChainId,\n callerEndpoint: \"getMinimumWithdrawalOrderSize\",\n });\n\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n const client = await getClient(normalizedChainId);\n\n const [minOrderResult, shareDecimalsResult] =\n await client.multicall({\n contracts: [\n {\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: \"minimumOrderSize\",\n },\n {\n abi: [\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ] as const,\n address: config.vault.boringVaultAddress,\n functionName: \"decimals\",\n },\n ],\n });\n\n if (\n minOrderResult.status === \"failure\" ||\n shareDecimalsResult.status === \"failure\"\n ) {\n throw new APIError(\n \"Failed to read minimum order size from WithdrawQueue contract\",\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n return {\n minimumOrderSize: minOrderResult.result,\n shareDecimals: shareDecimalsResult.result,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to get minimum withdrawal order size: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getMinimumWithdrawalOrderSize\", cause: error }\n );\n }\n}\n"]}