@paxoslabs/amplify-sdk 0.4.0 → 0.4.1

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 (42) hide show
  1. package/CHANGELOG.md +44 -55
  2. package/dist/{chain-utils-C1TU1yHZ.d.mts → chain-utils-CRMbWzu7.d.mts} +4 -0
  3. package/dist/{chain-utils-C1TU1yHZ.d.ts → chain-utils-CRMbWzu7.d.ts} +4 -0
  4. package/dist/{chunk-G5O3XKFN.mjs → chunk-5FVJVJXC.mjs} +4 -4
  5. package/dist/{chunk-G5O3XKFN.mjs.map → chunk-5FVJVJXC.mjs.map} +1 -1
  6. package/dist/{chunk-5VVP4RVO.mjs → chunk-PLWWBYSM.mjs} +4 -4
  7. package/dist/{chunk-5VVP4RVO.mjs.map → chunk-PLWWBYSM.mjs.map} +1 -1
  8. package/dist/{chunk-NYRRIERP.js → chunk-QKU5APOV.js} +120 -120
  9. package/dist/{chunk-NYRRIERP.js.map → chunk-QKU5APOV.js.map} +1 -1
  10. package/dist/{chunk-NAIDMXT5.mjs → chunk-SQ3YW6UK.mjs} +207 -14
  11. package/dist/chunk-SQ3YW6UK.mjs.map +1 -0
  12. package/dist/{chunk-DGUDYJGO.js → chunk-VDNXXONH.js} +59 -59
  13. package/dist/{chunk-DGUDYJGO.js.map → chunk-VDNXXONH.js.map} +1 -1
  14. package/dist/{chunk-LT7H3XK2.mjs → chunk-Y55F4I3A.mjs} +3 -3
  15. package/dist/{chunk-LT7H3XK2.mjs.map → chunk-Y55F4I3A.mjs.map} +1 -1
  16. package/dist/{chunk-KEFKVE5B.js → chunk-YTCO5BHT.js} +9 -9
  17. package/dist/{chunk-KEFKVE5B.js.map → chunk-YTCO5BHT.js.map} +1 -1
  18. package/dist/{chunk-BHOW2UNG.js → chunk-ZPIVBZLP.js} +207 -14
  19. package/dist/chunk-ZPIVBZLP.js.map +1 -0
  20. package/dist/core.d.mts +2 -2
  21. package/dist/core.d.ts +2 -2
  22. package/dist/core.js +16 -16
  23. package/dist/core.mjs +4 -4
  24. package/dist/display.d.mts +1 -1
  25. package/dist/display.d.ts +1 -1
  26. package/dist/display.js +9 -9
  27. package/dist/display.mjs +3 -3
  28. package/dist/index.d.mts +2 -2
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.js +52 -52
  31. package/dist/index.mjs +4 -4
  32. package/dist/utils.d.mts +1 -1
  33. package/dist/utils.d.ts +1 -1
  34. package/dist/utils.js +7 -7
  35. package/dist/utils.mjs +2 -2
  36. package/dist/vaults.d.mts +1 -1
  37. package/dist/vaults.d.ts +1 -1
  38. package/dist/vaults.js +24 -24
  39. package/dist/vaults.mjs +3 -3
  40. package/package.json +4 -2
  41. package/dist/chunk-BHOW2UNG.js.map +0 -1
  42. package/dist/chunk-NAIDMXT5.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -8,94 +8,83 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  <!-- auto-changelog-above -->
9
9
 
10
10
 
11
- ## [0.4.0](///compare/v0.2.4...v0.4.0) (2026-02-18)
12
-
13
- ### ⚠ BREAKING CHANGES
14
-
15
- * **core:** Minimum Node.js version increased from 20 to 22.
11
+ ## [0.4.1](///compare/v0.4.0...v0.4.1) (2026-02-20)
16
12
 
17
13
  ### Features
18
14
 
19
- * **client:** migrate vault data fetching from REST v1 to GraphQL b71bbd6
20
- * **config:** add PRIME yield type support 7b7e60d
21
- * **core:** bump minimum Node.js requirement from 20 to 22 d96f256
22
- * **deposit:** improve TypeScript inference and add eth_signTypedData_v4 helper 7feb7b6
23
- * **display:** add display module with UI helper functions 868d722
24
- * **init:** make SDK initialization fully non-blocking 3cfb510
25
- * **wallets:** add smart contract wallet detection for deposit and withdrawal flows 1547072
26
- * **withdraw:** add prepareWithdrawal wrapper and forceMethod authorization overrides 1deef81
27
- * **withdraw:** add prepareWithdrawalAuthorization and fix approval bugs 88baaaf
28
- * **withdraw:** add WithdrawQueue contract integration 901bb5e
15
+ * **api:** integrate /v2/amplify/vaultAssets REST endpoint 9bb5b10
29
16
 
30
17
  ### Bug Fixes
31
18
 
32
- * address CodeRabbit PR review findings 299cc64
33
- * address CodeRabbit review findings across withdraw, deposit, and display modules 8b52868
34
- * align stale API references with current naming (PR review) d2a2655
35
- * **auth:** remove redundant allowance fields from approval authorization results f6236a4
36
- * **ci:** restrict dry-run job permissions to read-only af546e1
37
- * **ci:** separate dry-run job to skip environment approval 7c88088
38
- * **deposit:** verify asset is supported on target chain d4a6eae
39
- * **display:** add multicall error handling in getMinimumMint 2fe41d5
40
- * **display:** use AND separator in v2 API filter query strings 46bdec5
41
- * **errors:** ensure instanceof checks work in transpiled code 9167032
42
- * reset version to 0.3.0 for release-it minor bump to 0.4.0 79d7b6d
43
- * **withdraw:** remove legacy AtomicQueue utils and update tests 67f6703
44
-
45
- ## [0.4.0] - 2026-02-18
19
+ * address CodeRabbit PR review findings b268261
20
+ * **ci:** allow prerelease builds from main branch and revert manual version bump 8a927cd
21
+ * **client:** only trigger pagination safety limit when more pages remain 71dbf06
22
+ * **security:** resolve minimatch and ajv audit vulnerabilities 1449156
46
23
 
47
- ### BREAKING CHANGES
24
+ ## [0.4.0](///compare/v0.2.4...v0.4.0) (2026-02-18)
25
+
26
+ ### ⚠ BREAKING CHANGES
48
27
 
49
- - **withdraw:** Replace AtomicQueue with WithdrawQueue contract ([7c521f4](https://github.com/Ion-Protocol/amplify-sdk/commit/7c521f4))
28
+ * **withdraw:** Replace AtomicQueue with WithdrawQueue contract ([7c521f4](https://github.com/Ion-Protocol/amplify-sdk/commit/7c521f4))
50
29
  - `prepareWithdrawTransactionData()` → `prepareWithdrawOrderTxData()`
51
30
  - `prepareApproveWithdrawToken()` → `prepareApproveWithdrawOrderTxData()`
52
31
  - Added `prepareCancelWithdrawOrderTxData()` for order cancellation
53
32
  - Slippage params no longer required for withdrawals
54
- - **withdraw:** Rename WithdrawQueue functions for API clarity ([6b287de](https://github.com/Ion-Protocol/amplify-sdk/commit/6b287de))
55
- - **auth:** Remove redundant allowance fields from approval authorization results ([f6236a4](https://github.com/Ion-Protocol/amplify-sdk/commit/f6236a4))
56
- - **client:** Migrate vault data fetching from REST v1 to GraphQL ([b71bbd6](https://github.com/Ion-Protocol/amplify-sdk/commit/b71bbd6))
33
+ * **withdraw:** Rename WithdrawQueue functions for API clarity ([6b287de](https://github.com/Ion-Protocol/amplify-sdk/commit/6b287de))
34
+ * **auth:** Remove redundant allowance fields from approval authorization results ([f6236a4](https://github.com/Ion-Protocol/amplify-sdk/commit/f6236a4))
35
+ * **client:** Migrate vault data fetching from REST v1 to GraphQL ([b71bbd6](https://github.com/Ion-Protocol/amplify-sdk/commit/b71bbd6))
36
+ * **core:** Minimum Node.js version increased from 20 to 22 ([d96f256](https://github.com/Ion-Protocol/amplify-sdk/commit/d96f256))
57
37
 
58
38
  ### Features
59
39
 
60
- - **withdraw:** add `prepareWithdrawal` unified wrapper and `forceMethod` authorization overrides ([1deef81](https://github.com/Ion-Protocol/amplify-sdk/commit/1deef81))
40
+ * **withdraw:** add `prepareWithdrawal` unified wrapper and `forceMethod` authorization overrides ([1deef81](https://github.com/Ion-Protocol/amplify-sdk/commit/1deef81))
61
41
  - `prepareWithdrawal()` provides a stable high-level API wrapping `prepareWithdrawOrderTxData()`
62
42
  - `forceMethod` parameter on both deposit and withdrawal authorization for explicit routing control
63
43
  - Auth logic reordered: force override → smart wallet heuristic → auto-detect
64
- - **withdraw:** add WithdrawQueue contract integration ([901bb5e](https://github.com/Ion-Protocol/amplify-sdk/commit/901bb5e))
65
- - **withdraw:** add `prepareWithdrawalAuthorization` unified wrapper and fix approval bugs ([88baaaf](https://github.com/Ion-Protocol/amplify-sdk/commit/88baaaf))
66
- - **display:** add display module with UI helper functions (`getVaultAPY`, `getVaultTVL`, `getMinimumMint`, `getMinimumWithdrawalOrderSize`, `getWithdrawalFee`, `getWithdrawalRequests`) ([868d722](https://github.com/Ion-Protocol/amplify-sdk/commit/868d722))
67
- - **init:** make SDK initialization fully non-blocking ([3cfb510](https://github.com/Ion-Protocol/amplify-sdk/commit/3cfb510))
68
- - **wallets:** add smart contract wallet detection for deposit and withdrawal flows ([1547072](https://github.com/Ion-Protocol/amplify-sdk/commit/1547072))
44
+ * **withdraw:** add WithdrawQueue contract integration ([901bb5e](https://github.com/Ion-Protocol/amplify-sdk/commit/901bb5e))
45
+ * **withdraw:** add `prepareWithdrawalAuthorization` unified wrapper and fix approval bugs ([88baaaf](https://github.com/Ion-Protocol/amplify-sdk/commit/88baaaf))
46
+ * **display:** add display module with UI helper functions (`getVaultAPY`, `getVaultTVL`, `getMinimumMint`, `getMinimumWithdrawalOrderSize`, `getWithdrawalFee`, `getWithdrawalRequests`) ([868d722](https://github.com/Ion-Protocol/amplify-sdk/commit/868d722))
47
+ * **init:** make SDK initialization fully non-blocking ([3cfb510](https://github.com/Ion-Protocol/amplify-sdk/commit/3cfb510))
48
+ * **wallets:** add smart contract wallet detection for deposit and withdrawal flows ([1547072](https://github.com/Ion-Protocol/amplify-sdk/commit/1547072))
49
+ * **config:** add PRIME yield type support ([7b7e60d](https://github.com/Ion-Protocol/amplify-sdk/commit/7b7e60d))
50
+ * **deposit:** improve TypeScript inference and add eth_signTypedData_v4 helper ([7feb7b6](https://github.com/Ion-Protocol/amplify-sdk/commit/7feb7b6))
69
51
 
70
52
  ### Bug Fixes
71
53
 
72
- - **withdraw:** remove legacy AtomicQueue utils and update tests ([67f6703](https://github.com/Ion-Protocol/amplify-sdk/commit/67f6703))
73
- - **display:** use AND separator in v2 API filter query strings ([46bdec5](https://github.com/Ion-Protocol/amplify-sdk/commit/46bdec5))
74
- - **display:** add multicall error handling in `getMinimumMint` ([2fe41d5](https://github.com/Ion-Protocol/amplify-sdk/commit/2fe41d5))
75
- - **auth:** remove redundant allowance fields from approval authorization results ([f6236a4](https://github.com/Ion-Protocol/amplify-sdk/commit/f6236a4))
76
- - address CodeRabbit review findings across withdraw, deposit, and display modules ([8b52868](https://github.com/Ion-Protocol/amplify-sdk/commit/8b52868))
54
+ * **withdraw:** remove legacy AtomicQueue utils and update tests ([67f6703](https://github.com/Ion-Protocol/amplify-sdk/commit/67f6703))
55
+ * **display:** use AND separator in v2 API filter query strings ([46bdec5](https://github.com/Ion-Protocol/amplify-sdk/commit/46bdec5))
56
+ * **display:** add multicall error handling in `getMinimumMint` ([2fe41d5](https://github.com/Ion-Protocol/amplify-sdk/commit/2fe41d5))
57
+ * **auth:** remove redundant allowance fields from approval authorization results ([f6236a4](https://github.com/Ion-Protocol/amplify-sdk/commit/f6236a4))
58
+ * **deposit:** verify asset is supported on target chain ([d4a6eae](https://github.com/Ion-Protocol/amplify-sdk/commit/d4a6eae))
59
+ * **errors:** ensure instanceof checks work in transpiled code ([9167032](https://github.com/Ion-Protocol/amplify-sdk/commit/9167032))
60
+ * **ci:** restrict dry-run job permissions to read-only ([af546e1](https://github.com/Ion-Protocol/amplify-sdk/commit/af546e1))
61
+ * **ci:** separate dry-run job to skip environment approval ([7c88088](https://github.com/Ion-Protocol/amplify-sdk/commit/7c88088))
62
+ * address CodeRabbit review findings across withdraw, deposit, and display modules ([8b52868](https://github.com/Ion-Protocol/amplify-sdk/commit/8b52868))
63
+ * address CodeRabbit PR review findings ([299cc64](https://github.com/Ion-Protocol/amplify-sdk/commit/299cc64))
64
+ * align stale API references with current naming (PR review) ([d2a2655](https://github.com/Ion-Protocol/amplify-sdk/commit/d2a2655))
65
+ * reset version to 0.3.0 for release-it minor bump to 0.4.0 ([79d7b6d](https://github.com/Ion-Protocol/amplify-sdk/commit/79d7b6d))
77
66
 
78
67
  ### Code Refactoring
79
68
 
80
- - **withdraw:** add ApprovalMethod enum for signature params ([21e0ae9](https://github.com/Ion-Protocol/amplify-sdk/commit/21e0ae9))
81
- - **client:** make `fetchVaults` and `fetchSupportedAssets` cache-aware ([a50a345](https://github.com/Ion-Protocol/amplify-sdk/commit/a50a345))
82
- - **client:** move API client from `api/` to `client/` folder ([a6523db](https://github.com/Ion-Protocol/amplify-sdk/commit/a6523db))
69
+ * **withdraw:** add ApprovalMethod enum for signature params ([21e0ae9](https://github.com/Ion-Protocol/amplify-sdk/commit/21e0ae9))
70
+ * **client:** make `fetchVaults` and `fetchSupportedAssets` cache-aware ([a50a345](https://github.com/Ion-Protocol/amplify-sdk/commit/a50a345))
71
+ * **client:** move API client from `api/` to `client/` folder ([a6523db](https://github.com/Ion-Protocol/amplify-sdk/commit/a6523db))
83
72
 
84
73
  ### Styles
85
74
 
86
- - apply biome formatting to codebase ([d034237](https://github.com/Ion-Protocol/amplify-sdk/commit/d034237))
75
+ * apply biome formatting to codebase ([d034237](https://github.com/Ion-Protocol/amplify-sdk/commit/d034237))
87
76
 
88
77
  ### Documentation
89
78
 
90
- - update API reference and guides for new withdrawal API ([623fbf0](https://github.com/Ion-Protocol/amplify-sdk/commit/623fbf0))
91
- - align Mintlify docs with current SDK state ([df67147](https://github.com/Ion-Protocol/amplify-sdk/commit/df67147))
92
- - update withdrawal docs from AtomicQueue to WithdrawQueue terminology ([4ff639d](https://github.com/Ion-Protocol/amplify-sdk/commit/4ff639d))
93
- - fix withdrawal examples and smart wallet guide per code review ([bacca7c](https://github.com/Ion-Protocol/amplify-sdk/commit/bacca7c))
79
+ * update API reference and guides for new withdrawal API ([623fbf0](https://github.com/Ion-Protocol/amplify-sdk/commit/623fbf0))
80
+ * align Mintlify docs with current SDK state ([df67147](https://github.com/Ion-Protocol/amplify-sdk/commit/df67147))
81
+ * update withdrawal docs from AtomicQueue to WithdrawQueue terminology ([4ff639d](https://github.com/Ion-Protocol/amplify-sdk/commit/4ff639d))
82
+ * fix withdrawal examples and smart wallet guide per code review ([bacca7c](https://github.com/Ion-Protocol/amplify-sdk/commit/bacca7c))
94
83
 
95
84
  ### Chores
96
85
 
97
- - **deps:** add version overrides for brace-expansion and lodash ([4dba204](https://github.com/Ion-Protocol/amplify-sdk/commit/4dba204))
98
- - **test:** remove unused getMockAssets import ([b3e9bd0](https://github.com/Ion-Protocol/amplify-sdk/commit/b3e9bd0))
86
+ * **deps:** add version overrides for brace-expansion and lodash ([4dba204](https://github.com/Ion-Protocol/amplify-sdk/commit/4dba204))
87
+ * **test:** remove unused getMockAssets import ([b3e9bd0](https://github.com/Ion-Protocol/amplify-sdk/commit/b3e9bd0))
99
88
 
100
89
 
101
90
  ## [0.3.0-beta.0] - 2025-01-30
@@ -105,6 +105,10 @@ interface AmplifyVault {
105
105
  decimals: number;
106
106
  /** CoinGecko token identifier for price lookups */
107
107
  coinGeckoTokenId?: string;
108
+ /** Whether deposits are currently enabled for this vault-asset pair */
109
+ depositable?: boolean;
110
+ /** Whether withdrawals are currently enabled for this vault-asset pair */
111
+ withdrawable?: boolean;
108
112
  };
109
113
  }
110
114
  /**
@@ -105,6 +105,10 @@ interface AmplifyVault {
105
105
  decimals: number;
106
106
  /** CoinGecko token identifier for price lookups */
107
107
  coinGeckoTokenId?: string;
108
+ /** Whether deposits are currently enabled for this vault-asset pair */
109
+ depositable?: boolean;
110
+ /** Whether withdrawals are currently enabled for this vault-asset pair */
111
+ withdrawable?: boolean;
108
112
  };
109
113
  }
110
114
  /**
@@ -1,7 +1,7 @@
1
1
  import { WithdrawQueueAbi } from './chunk-CQZCGPZK.mjs';
2
- import { getRateInQuoteWithAssetDecimals, getErc20Decimals, getClient } from './chunk-LT7H3XK2.mjs';
2
+ import { getRateInQuoteWithAssetDecimals, getErc20Decimals, getClient } from './chunk-Y55F4I3A.mjs';
3
3
  import { calculateExpectedSharesMinted } from './chunk-7RWWVUHP.mjs';
4
- import { toChainId, findVaultByConfig, APIError, isValidAddress, getRestV2BaseURL, getEnvironment, DEFAULT_TIMEOUT, getRequestHeaders } from './chunk-NAIDMXT5.mjs';
4
+ import { toChainId, findVaultByConfig, APIError, isValidAddress, getRestV2BaseURL, getEnvironment, DEFAULT_TIMEOUT, getRequestHeaders } from './chunk-SQ3YW6UK.mjs';
5
5
  import { parseUnits } from 'viem';
6
6
 
7
7
  async function getMinimumMint(params) {
@@ -448,5 +448,5 @@ async function getMinimumWithdrawalOrderSize(params) {
448
448
  }
449
449
 
450
450
  export { getMinimumMint, getMinimumWithdrawalOrderSize, getVaultAPY, getVaultTVL, getWithdrawalFee, getWithdrawalRequests };
451
- //# sourceMappingURL=chunk-G5O3XKFN.mjs.map
452
- //# sourceMappingURL=chunk-G5O3XKFN.mjs.map
451
+ //# sourceMappingURL=chunk-5FVJVJXC.mjs.map
452
+ //# sourceMappingURL=chunk-5FVJVJXC.mjs.map
@@ -1 +1 @@
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":["parseUnits"],"mappings":"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","file":"chunk-G5O3XKFN.mjs","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 { findVaultByConfig } from \"../client/amplify-sdk-client\";\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 * yieldType: \"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 findVaultByConfig({\n assetAddress: params.depositAssetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.depositAssetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getMinimumMint\" }\n );\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 { getRestV2BaseURL } from \"../constants/environment\";\nimport { getEnvironment, getRequestHeaders } from \"../lib/sdk-config\";\nimport { APIError, isValidAddress } from \"../types/amplify-sdk-api\";\nimport { DEFAULT_TIMEOUT } from \"../utils/fetch\";\nimport type {\n GetVaultAPYParams,\n GetVaultTVLParams,\n VaultAPYResult,\n VaultTVLResult,\n} from \"./types\";\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\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 if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getVaultAPY\" }\n );\n }\n\n const queryParams = new URLSearchParams({\n filter: `vaultAddress=${params.vaultAddress}`,\n orderByTimestamp: \"desc\",\n pageSize: \"1\",\n });\n\n const url = `${getRestV2BaseURL(getEnvironment())}/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 ${params.vaultAddress}`,\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\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 if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getVaultTVL\" }\n );\n }\n\n const filterParts = [\n `vaultAddress=${params.vaultAddress}`,\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(getEnvironment())}/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 ${params.vaultAddress}`,\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 { findVaultByConfig } from \"../client/amplify-sdk-client\";\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getEnvironment, 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 { 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 const filter = buildFilterString({\n userAddress: params.userAddress,\n chainId: params.chainId,\n vaultAddress: params.vaultAddress,\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(getEnvironment())}/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 * yieldType: \"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 findVaultByConfig({\n assetAddress: params.assetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.assetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getWithdrawalFee\" }\n );\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 * yieldType: \"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 findVaultByConfig({\n assetAddress: params.assetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.assetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\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"]}
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":["parseUnits"],"mappings":"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","file":"chunk-5FVJVJXC.mjs","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 { findVaultByConfig } from \"../client/amplify-sdk-client\";\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 * yieldType: \"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 findVaultByConfig({\n assetAddress: params.depositAssetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.depositAssetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getMinimumMint\" }\n );\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 { getRestV2BaseURL } from \"../constants/environment\";\nimport { getEnvironment, getRequestHeaders } from \"../lib/sdk-config\";\nimport { APIError, isValidAddress } from \"../types/amplify-sdk-api\";\nimport { DEFAULT_TIMEOUT } from \"../utils/fetch\";\nimport type {\n GetVaultAPYParams,\n GetVaultTVLParams,\n VaultAPYResult,\n VaultTVLResult,\n} from \"./types\";\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\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 if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getVaultAPY\" }\n );\n }\n\n const queryParams = new URLSearchParams({\n filter: `vaultAddress=${params.vaultAddress}`,\n orderByTimestamp: \"desc\",\n pageSize: \"1\",\n });\n\n const url = `${getRestV2BaseURL(getEnvironment())}/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 ${params.vaultAddress}`,\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\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 if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getVaultTVL\" }\n );\n }\n\n const filterParts = [\n `vaultAddress=${params.vaultAddress}`,\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(getEnvironment())}/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 ${params.vaultAddress}`,\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 { findVaultByConfig } from \"../client/amplify-sdk-client\";\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getEnvironment, 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 { 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 const filter = buildFilterString({\n userAddress: params.userAddress,\n chainId: params.chainId,\n vaultAddress: params.vaultAddress,\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(getEnvironment())}/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 * yieldType: \"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 findVaultByConfig({\n assetAddress: params.assetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.assetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getWithdrawalFee\" }\n );\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 * yieldType: \"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 findVaultByConfig({\n assetAddress: params.assetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.assetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\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"]}
@@ -1,7 +1,7 @@
1
1
  import { WithdrawQueueAbi } from './chunk-CQZCGPZK.mjs';
2
- import { getTokenPermitInfoWithAllowance, getErc20AllowanceWithDecimals, getRateInQuoteWithAssetDecimals, getClient, erc2612Abi, getErc20Decimals, BoringVaultAbi } from './chunk-LT7H3XK2.mjs';
2
+ import { getTokenPermitInfoWithAllowance, getErc20AllowanceWithDecimals, getRateInQuoteWithAssetDecimals, getClient, erc2612Abi, getErc20Decimals, BoringVaultAbi } from './chunk-Y55F4I3A.mjs';
3
3
  import { WAD } from './chunk-7RWWVUHP.mjs';
4
- import { toChainId, findVaultByConfig, APIError, getAssetsFromCache, DEFAULT_APPROVAL_AMOUNT, DEFAULT_SLIPPAGE_BPS } from './chunk-NAIDMXT5.mjs';
4
+ import { toChainId, findVaultByConfig, APIError, getAssetsFromCache, DEFAULT_APPROVAL_AMOUNT, DEFAULT_SLIPPAGE_BPS } from './chunk-SQ3YW6UK.mjs';
5
5
  import { formatUnits, parseUnits, erc20Abi, stringToHex, hexToSignature } from 'viem';
6
6
 
7
7
  var isDepositSpendApproved = async ({
@@ -1490,5 +1490,5 @@ async function prepareWithdrawalAuthorization(params) {
1490
1490
  }
1491
1491
 
1492
1492
  export { DepositAuthMethod, PERMIT_TYPES, WithdrawAuthMethod, isAlreadyApprovedAuth, isApprovalAuth, isDepositSpendApproved, isPermitAuth, isWithdrawAlreadyApprovedAuth, isWithdrawApprovalAuth, isWithdrawalSpendApproved, parsePermitSignature, prepareApproveDepositTokenTxData, prepareApproveWithdrawOrderTxData, prepareCancelWithdrawOrderTxData, prepareDeposit, prepareDepositAuthorization, prepareDepositPermitSignature, prepareDepositTxData, prepareDepositWithPermitTxData, prepareWithdrawOrderTxData, prepareWithdrawal, prepareWithdrawalAuthorization, toEthSignTypedDataV4 };
1493
- //# sourceMappingURL=chunk-5VVP4RVO.mjs.map
1494
- //# sourceMappingURL=chunk-5VVP4RVO.mjs.map
1493
+ //# sourceMappingURL=chunk-PLWWBYSM.mjs.map
1494
+ //# sourceMappingURL=chunk-PLWWBYSM.mjs.map