@paxoslabs/amplify-sdk 0.4.3-alpha.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -0
- package/dist/{chunk-PKGFLHZA.js → chunk-2ZJWWK6D.js} +10 -10
- package/dist/chunk-2ZJWWK6D.js.map +1 -0
- package/dist/{chunk-HV2LE2M6.mjs → chunk-B5BII2XH.mjs} +8 -8
- package/dist/{chunk-HV2LE2M6.mjs.map → chunk-B5BII2XH.mjs.map} +1 -1
- package/dist/{chunk-JTURYJHV.js → chunk-D7EMZAOQ.js} +12 -12
- package/dist/{chunk-JTURYJHV.js.map → chunk-D7EMZAOQ.js.map} +1 -1
- package/dist/{chunk-UM7S7U45.mjs → chunk-GJPTAY5T.mjs} +5 -5
- package/dist/{chunk-UM7S7U45.mjs.map → chunk-GJPTAY5T.mjs.map} +1 -1
- package/dist/{chunk-R35K46S5.js → chunk-KTLGSVD6.js} +111 -111
- package/dist/{chunk-R35K46S5.js.map → chunk-KTLGSVD6.js.map} +1 -1
- package/dist/{chunk-7JMQWERX.mjs → chunk-MPCRFKSD.mjs} +9 -9
- package/dist/chunk-MPCRFKSD.mjs.map +1 -0
- package/dist/{chunk-YEAWQB72.js → chunk-N5UKVLSS.js} +62 -62
- package/dist/{chunk-YEAWQB72.js.map → chunk-N5UKVLSS.js.map} +1 -1
- package/dist/{chunk-USF4CU2K.mjs → chunk-SXIBMN7X.mjs} +3 -3
- package/dist/{chunk-USF4CU2K.mjs.map → chunk-SXIBMN7X.mjs.map} +1 -1
- package/dist/{chunk-KXU3GSF4.mjs → chunk-XA653JS3.mjs} +3 -3
- package/dist/{chunk-KXU3GSF4.mjs.map → chunk-XA653JS3.mjs.map} +1 -1
- package/dist/{chunk-MB6HYA7R.js → chunk-XS4SELWC.js} +10 -10
- package/dist/{chunk-MB6HYA7R.js.map → chunk-XS4SELWC.js.map} +1 -1
- package/dist/core.js +16 -16
- package/dist/core.mjs +4 -4
- package/dist/display.js +10 -10
- package/dist/display.mjs +4 -4
- package/dist/index.d.mts +19 -18
- package/dist/index.d.ts +19 -18
- package/dist/index.js +63 -63
- package/dist/index.mjs +5 -5
- package/dist/utils.js +7 -7
- package/dist/utils.mjs +2 -2
- package/dist/vaults.js +25 -25
- package/dist/vaults.mjs +4 -4
- package/package.json +1 -1
- package/dist/chunk-7JMQWERX.mjs.map +0 -1
- package/dist/chunk-PKGFLHZA.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- auto-changelog-above -->
|
|
9
9
|
|
|
10
|
+
|
|
11
|
+
## [0.5.0](https://github.com/paxoslabs/paxos-labs-monorepo/compare/v0.4.3-alpha.1...v0.5.0) (2026-03-19)
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* Add Amplify SDK config management UI ([ce383ce](https://github.com/paxoslabs/paxos-labs-monorepo/commit/ce383cedcf1e0f7f520a0fa92b6573eb0ad0aa7c))
|
|
16
|
+
* adding initial docs changes for new SDK version and changes ([be45fa6](https://github.com/paxoslabs/paxos-labs-monorepo/commit/be45fa6a6be4013ea4a7c58be40b9b130b3d5e69))
|
|
17
|
+
* integrate TanStack Form with client-side validation and fix shadcn audit issues ([a5ec00c](https://github.com/paxoslabs/paxos-labs-monorepo/commit/a5ec00c5db1b5afb4a4e2b6c5601dbe4ed4ad47f))
|
|
18
|
+
* Parametrize BASE_URL in SDK using env var replaced at build time by tsup ([#41](https://github.com/paxoslabs/paxos-labs-monorepo/issues/41)) ([a20e3a6](https://github.com/paxoslabs/paxos-labs-monorepo/commit/a20e3a69d76c30fef2e7f53d543ab47b323c77c4))
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* address PR review feedback — server errors, select a11y, startBlock validation ([d28669b](https://github.com/paxoslabs/paxos-labs-monorepo/commit/d28669b7d6d45743aef558a93364a45fc975d410))
|
|
23
|
+
* address PR review feedback from CodeRabbit ([1567716](https://github.com/paxoslabs/paxos-labs-monorepo/commit/156771673510fa3bbd9f3e57f8dcdf401b777c5c))
|
|
24
|
+
* **address-book-admin:** fix content overflow when sidebar is open ([61f3e61](https://github.com/paxoslabs/paxos-labs-monorepo/commit/61f3e61fe09b96bc80aed493867c269a69efb7c2))
|
|
25
|
+
* **address-book-admin:** handle organizations query error explicitly ([a0e2163](https://github.com/paxoslabs/paxos-labs-monorepo/commit/a0e216393f314cb7abb627c1986b17d254205482))
|
|
26
|
+
* **address-book-admin:** resolve tables not rendering due to client/server boundary violation ([c9b0006](https://github.com/paxoslabs/paxos-labs-monorepo/commit/c9b00062f833edd5f9d401fae038167eef15a1d1))
|
|
27
|
+
* **backend-v2:** query org member by record id instead of userId in remove/update ([26bb1d0](https://github.com/paxoslabs/paxos-labs-monorepo/commit/26bb1d0fd72e1492e36b25015d57c4fbf547dcf0))
|
|
28
|
+
* bound socket.io-parser override to ^4.2.6 to prevent unintended major upgrades ([c0f94ce](https://github.com/paxoslabs/paxos-labs-monorepo/commit/c0f94cefd24b0d1e1a11b2d372f971dcd063c390))
|
|
29
|
+
* optimistic update to continue showing new role after update succeeds ([d174c41](https://github.com/paxoslabs/paxos-labs-monorepo/commit/d174c419941d95f858d75d20aab7f9ac362374a1))
|
|
30
|
+
* override socket.io-parser to >=4.2.6 to resolve GHSA-677m-j7p3-52f9 ([47406ea](https://github.com/paxoslabs/paxos-labs-monorepo/commit/47406ea41690428f91d72a723145c9d5d0190893))
|
|
31
|
+
* Prevent adding deleted vault ([#35](https://github.com/paxoslabs/paxos-labs-monorepo/issues/35)) ([34b8b20](https://github.com/paxoslabs/paxos-labs-monorepo/commit/34b8b202a1b058b35ef70e8832ad751c30d4794b))
|
|
32
|
+
* remove duplicate toast ([93fb035](https://github.com/paxoslabs/paxos-labs-monorepo/commit/93fb035ae98cc6db96c2b67fafe70975f61ee528))
|
|
33
|
+
* use viem isAddress for validation and fix TanStack Form error handling ([177bc3f](https://github.com/paxoslabs/paxos-labs-monorepo/commit/177bc3f264daddb955187c873d9f408fff30514b))
|
|
34
|
+
* Vault deletion not working from the UI ([#34](https://github.com/paxoslabs/paxos-labs-monorepo/issues/34)) ([3328cca](https://github.com/paxoslabs/paxos-labs-monorepo/commit/3328cca120299ff256f358303a86295b5a4c0ea0))
|
|
35
|
+
|
|
36
|
+
### Documentation
|
|
37
|
+
|
|
38
|
+
* **sdk:** replace deprecated getAssetsFromCache with getSupportedAssets in troubleshooting snippet ([6616961](https://github.com/paxoslabs/paxos-labs-monorepo/commit/66169611affd73f5807d66e0580c57df13d5c7bf))
|
|
39
|
+
|
|
40
|
+
### Code Refactoring
|
|
41
|
+
|
|
42
|
+
* **address-book-admin:** replace Chain select with number input for Chain ID ([45fce7b](https://github.com/paxoslabs/paxos-labs-monorepo/commit/45fce7b71c1ffd97400f09573491d78577bf389f))
|
|
43
|
+
* Extract shared utilities and simplify SDK config state ([ae23b66](https://github.com/paxoslabs/paxos-labs-monorepo/commit/ae23b6686cbd261ffef2cb7f5835e1974d59a03f))
|
|
44
|
+
* **sdk:** rename fetchVaults/fetchSupportedAssets to getVaults/getSupportedAssets ([8e65846](https://github.com/paxoslabs/paxos-labs-monorepo/commit/8e6584609eb0a184c6ffe9d4a42d36fe63f81b5a))
|
|
45
|
+
|
|
10
46
|
## [0.4.3-alpha.1] (2026-03-13)
|
|
11
47
|
|
|
12
48
|
### ⚠ BREAKING CHANGES
|
|
@@ -89,7 +89,7 @@ function setLogLevel(level) {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// src/constants/environment.ts
|
|
92
|
-
var BASE_URL = "https://
|
|
92
|
+
var BASE_URL = "https://api.paxoslabs.com";
|
|
93
93
|
function getGraphQLEndpoint() {
|
|
94
94
|
return `${BASE_URL}/graphql`;
|
|
95
95
|
}
|
|
@@ -923,7 +923,7 @@ function applyAssetFilters(assets, options) {
|
|
|
923
923
|
}
|
|
924
924
|
return filtered;
|
|
925
925
|
}
|
|
926
|
-
async function
|
|
926
|
+
async function getVaults(options) {
|
|
927
927
|
validateVaultFilterOptions(options);
|
|
928
928
|
const cache = getCache();
|
|
929
929
|
if (cache.isEmpty() || cache.isExpired()) {
|
|
@@ -931,7 +931,7 @@ async function fetchVaults(options) {
|
|
|
931
931
|
}
|
|
932
932
|
return applyVaultFilters(cache.getAllVaults(), options);
|
|
933
933
|
}
|
|
934
|
-
async function
|
|
934
|
+
async function getSupportedAssets(options) {
|
|
935
935
|
validateAssetFilterOptions(options);
|
|
936
936
|
const cache = getCache();
|
|
937
937
|
if (cache.isEmpty() || cache.isExpired()) {
|
|
@@ -959,7 +959,7 @@ function clearCache() {
|
|
|
959
959
|
cache.clear();
|
|
960
960
|
}
|
|
961
961
|
async function getAssetsFromCache(options) {
|
|
962
|
-
return
|
|
962
|
+
return getSupportedAssets(options);
|
|
963
963
|
}
|
|
964
964
|
async function findVaultByConfig(params) {
|
|
965
965
|
if (!isValidAddress(params.assetAddress)) {
|
|
@@ -1181,7 +1181,7 @@ async function getChainFromConfig(chainId, config) {
|
|
|
1181
1181
|
return chain2;
|
|
1182
1182
|
}
|
|
1183
1183
|
}
|
|
1184
|
-
const vaults = config ?? await
|
|
1184
|
+
const vaults = config ?? await getVaults();
|
|
1185
1185
|
const vault = vaults.find((v) => v.chainId === chainId);
|
|
1186
1186
|
if (!vault) {
|
|
1187
1187
|
throw new Error(`Vault not found for ID: ${chainId}`);
|
|
@@ -1224,7 +1224,7 @@ var getClient = async (chainId) => {
|
|
|
1224
1224
|
if (!clients.has(numericChainId)) {
|
|
1225
1225
|
const chain = await getChainFromConfig(
|
|
1226
1226
|
numericChainId,
|
|
1227
|
-
await
|
|
1227
|
+
await getVaults()
|
|
1228
1228
|
);
|
|
1229
1229
|
const customRpcUrl = getRpcUrls()[numericChainId];
|
|
1230
1230
|
if (!customRpcUrl && !warnedChains.has(numericChainId)) {
|
|
@@ -1442,8 +1442,6 @@ exports.LogLevel = LogLevel;
|
|
|
1442
1442
|
exports.YieldType = YieldType;
|
|
1443
1443
|
exports.clearChainsCache = clearChainsCache;
|
|
1444
1444
|
exports.createTimeoutSignal = createTimeoutSignal;
|
|
1445
|
-
exports.fetchSupportedAssets = fetchSupportedAssets;
|
|
1446
|
-
exports.fetchVaults = fetchVaults;
|
|
1447
1445
|
exports.findVaultByConfig = findVaultByConfig;
|
|
1448
1446
|
exports.getAssetsFromCache = getAssetsFromCache;
|
|
1449
1447
|
exports.getCache = getCache;
|
|
@@ -1452,6 +1450,8 @@ exports.getClient = getClient;
|
|
|
1452
1450
|
exports.getLogger = getLogger;
|
|
1453
1451
|
exports.getRequestHeaders = getRequestHeaders;
|
|
1454
1452
|
exports.getRestV2BaseURL = getRestV2BaseURL;
|
|
1453
|
+
exports.getSupportedAssets = getSupportedAssets;
|
|
1454
|
+
exports.getVaults = getVaults;
|
|
1455
1455
|
exports.getVaultsByConfig = getVaultsByConfig;
|
|
1456
1456
|
exports.getWithdrawSupportedAssets = getWithdrawSupportedAssets;
|
|
1457
1457
|
exports.initAmplifySDK = initAmplifySDK;
|
|
@@ -1464,5 +1464,5 @@ exports.setLogLevel = setLogLevel;
|
|
|
1464
1464
|
exports.setLogger = setLogger;
|
|
1465
1465
|
exports.toChainId = toChainId;
|
|
1466
1466
|
exports.waitForCacheReady = waitForCacheReady;
|
|
1467
|
-
//# sourceMappingURL=chunk-
|
|
1468
|
-
//# sourceMappingURL=chunk-
|
|
1467
|
+
//# sourceMappingURL=chunk-2ZJWWK6D.js.map
|
|
1468
|
+
//# sourceMappingURL=chunk-2ZJWWK6D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/fetch.ts","../src/types/telemetry.ts","../src/lib/logger.ts","../src/constants/environment.ts","../src/lib/vault-cache.ts","../src/constants/index.ts","../src/lib/telemetry.ts","../src/types/amplify-sdk-api.ts","../src/client/graphql-client.ts","../src/constants/config.ts","../src/client/graphql-mapper.ts","../src/client/amplify-sdk-client.ts","../src/lib/viem/chains.ts","../src/utils/chain-utils.ts","../src/lib/viem/client.ts","../src/lib/sdk-config.ts"],"names":["defineChain","mainnet","sepolia","chain","client","createPublicClient","http"],"mappings":"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","file":"chunk-2ZJWWK6D.js","sourcesContent":["/**\n * Shared fetch utilities\n *\n * Common helpers for network requests across the SDK.\n */\n\n/**\n * Default timeout for network requests (10 seconds)\n */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/**\n * Creates an AbortSignal that times out after the specified duration\n */\nexport function createTimeoutSignal(timeoutMs: number): AbortSignal {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeoutMs);\n return controller.signal;\n}\n","/**\n * Telemetry Type Definitions\n *\n * Types for SDK telemetry, logging, and PostHog integration.\n */\n\n/**\n * Log levels for controlling console output\n *\n * @example\n * ```typescript\n * import { LogLevel } from \"@paxoslabs/amplify-sdk\";\n *\n * // Only show errors (default)\n * await initAmplifySDK(apiKey, { logLevel: LogLevel.ERROR });\n *\n * // Show all logs including debug\n * await initAmplifySDK(apiKey, { logLevel: LogLevel.DEBUG });\n * ```\n */\nexport const LogLevel = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n NONE: 4,\n} as const;\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n/**\n * Logger interface for consumer use\n *\n * Implement this interface to provide a custom logger.\n * All methods receive a message and optional context object.\n *\n * @example\n * ```typescript\n * import { setLogger, Logger } from \"@paxoslabs/amplify-sdk\";\n *\n * const customLogger: Logger = {\n * debug: (msg, ctx) => console.debug(`[MyApp] ${msg}`, ctx),\n * info: (msg, ctx) => console.info(`[MyApp] ${msg}`, ctx),\n * warn: (msg, ctx) => console.warn(`[MyApp] ${msg}`, ctx),\n * error: (msg, ctx) => console.error(`[MyApp] ${msg}`, ctx),\n * };\n *\n * setLogger(customLogger);\n * ```\n */\nexport interface Logger {\n /**\n * Log debug message (verbose, development only)\n */\n debug(message: string, context?: Record<string, unknown>): void;\n\n /**\n * Log informational message\n */\n info(message: string, context?: Record<string, unknown>): void;\n\n /**\n * Log warning message\n */\n warn(message: string, context?: Record<string, unknown>): void;\n\n /**\n * Log error message\n */\n error(message: string, context?: Record<string, unknown>): void;\n}\n\n/**\n * PostHog configuration returned from API\n *\n * Fetched from /v1/earn-sdk/config endpoint after SDK initialization.\n */\nexport interface PostHogConfig {\n /**\n * PostHog API key for this organization\n */\n posthogApiKey: string;\n\n /**\n * PostHog host URL\n * @default \"https://us.i.posthog.com\"\n */\n posthogHost?: string;\n}\n\n/**\n * Internal telemetry state\n *\n * Module-level state for telemetry management.\n */\nexport interface TelemetryState {\n /**\n * Whether telemetry is enabled\n */\n enabled: boolean;\n\n /**\n * Whether telemetry has been initialized\n */\n isInitialized: boolean;\n\n /**\n * Whether telemetry initialization is in progress\n */\n isInitializing: boolean;\n\n /**\n * Promise for ongoing initialization (concurrent safety)\n */\n initPromise: Promise<void> | null;\n\n /**\n * PostHog configuration from API\n */\n config: PostHogConfig | null;\n\n /**\n * SDK API key (for error grouping)\n */\n apiKey: string | null;\n}\n\n/**\n * Buffered error for pre-initialization tracking\n *\n * Errors that occur before PostHog is initialized are buffered\n * and flushed once initialization completes.\n */\nexport interface BufferedError {\n /**\n * Error name (class name)\n */\n name: string;\n\n /**\n * Error message\n */\n message: string;\n\n /**\n * Error code (if available)\n */\n code?: string;\n\n /**\n * Additional context\n */\n context: Record<string, unknown>;\n\n /**\n * Timestamp when error occurred\n */\n timestamp: number;\n}\n\n/**\n * Error event payload for PostHog\n */\nexport interface ErrorEventPayload {\n /**\n * Error type/class name\n */\n error_type: string;\n\n /**\n * Error message\n */\n error_message: string;\n\n /**\n * Error code (if available)\n */\n error_code?: string;\n\n /**\n * API endpoint where error occurred (if applicable)\n */\n endpoint?: string;\n\n /**\n * HTTP status code (if applicable)\n */\n status_code?: number;\n\n /**\n * SDK version\n */\n sdk_version: string;\n\n /**\n * Whether this error was buffered before PostHog init\n */\n buffered?: boolean;\n\n /**\n * Additional context\n */\n [key: string]: unknown;\n}\n","/**\n * Logger Module\n *\n * Provides a consumer-facing logger interface with configurable log levels.\n * Default implementation logs errors only to console.\n */\n\nimport { type Logger, LogLevel } from \"../types/telemetry.js\";\n\n/**\n * Default console logger implementation\n *\n * Logs to console with SDK prefix. Respects log level setting.\n * By default, only errors are logged.\n */\nclass ConsoleLogger implements Logger {\n private level: LogLevel;\n\n constructor(level: LogLevel = LogLevel.ERROR) {\n this.level = level;\n }\n\n /**\n * Update log level\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Get current log level\n */\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n if (this.level <= LogLevel.DEBUG) {\n if (context) {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.debug(\"[Amplify SDK]\", message, context);\n } else {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.debug(\"[Amplify SDK]\", message);\n }\n }\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n if (this.level <= LogLevel.INFO) {\n if (context) {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.info(\"[Amplify SDK]\", message, context);\n } else {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.info(\"[Amplify SDK]\", message);\n }\n }\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n if (this.level <= LogLevel.WARN) {\n if (context) {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.warn(\"[Amplify SDK]\", message, context);\n } else {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.warn(\"[Amplify SDK]\", message);\n }\n }\n }\n\n error(message: string, context?: Record<string, unknown>): void {\n if (this.level <= LogLevel.ERROR) {\n if (context) {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.error(\"[Amplify SDK]\", message, context);\n } else {\n // biome-ignore lint/suspicious/noConsole: Logger requires console\n console.error(\"[Amplify SDK]\", message);\n }\n }\n }\n}\n\n/**\n * Module-level logger state\n */\nlet currentLogger: Logger = new ConsoleLogger(LogLevel.ERROR);\nlet defaultLogger: ConsoleLogger = currentLogger as ConsoleLogger;\n\n/**\n * Set a custom logger implementation\n *\n * Replace the default console logger with a custom implementation.\n * Useful for integrating with existing logging infrastructure.\n *\n * @param logger - Custom logger implementing the Logger interface\n *\n * @example\n * ```typescript\n * import { setLogger } from \"@paxoslabs/amplify-sdk\";\n *\n * // Use a custom logger\n * setLogger({\n * debug: (msg, ctx) => winston.debug(msg, ctx),\n * info: (msg, ctx) => winston.info(msg, ctx),\n * warn: (msg, ctx) => winston.warn(msg, ctx),\n * error: (msg, ctx) => winston.error(msg, ctx),\n * });\n * ```\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Get the current logger instance\n *\n * Returns the custom logger if set, otherwise the default console logger.\n *\n * @returns Current logger instance\n *\n * @example\n * ```typescript\n * import { getLogger } from \"@paxoslabs/amplify-sdk\";\n *\n * const logger = getLogger();\n * logger.info(\"Processing deposit\", { amount: \"100\" });\n * ```\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set the log level for the default console logger\n *\n * Controls which log messages are output to the console.\n * Has no effect if a custom logger is set.\n *\n * @param level - Minimum log level to output\n *\n * @example\n * ```typescript\n * import { setLogLevel, LogLevel } from \"@paxoslabs/amplify-sdk\";\n *\n * // Show all logs including debug\n * setLogLevel(LogLevel.DEBUG);\n *\n * // Only show errors (default)\n * setLogLevel(LogLevel.ERROR);\n *\n * // Disable all logging\n * setLogLevel(LogLevel.NONE);\n * ```\n */\nexport function setLogLevel(level: LogLevel): void {\n if (defaultLogger && typeof defaultLogger.setLevel === \"function\") {\n defaultLogger.setLevel(level);\n }\n}\n\n/**\n * Reset logger to default console logger\n *\n * Restores the default console logger. Useful for testing.\n *\n * @internal\n */\nexport function resetLogger(): void {\n defaultLogger = new ConsoleLogger(LogLevel.ERROR);\n currentLogger = defaultLogger;\n}\n\n// Re-export LogLevel for convenience\nexport { LogLevel } from \"../types/telemetry.js\";\n","/**\n * Environment Configuration\n *\n * BASE_URL is injected at build time via the AMPLIFY_SDK_BASE_URL env var\n * using tsup's support for compile time environment variables\n * so no runtime env lookup is needed.\n *\n */\n\nconst BASE_URL: string =\n process.env.AMPLIFY_SDK_BASE_URL ?? \"https://api.paxoslabs.com\";\n\n/**\n * Get the GraphQL endpoint URL\n */\nexport function getGraphQLEndpoint(): string {\n return `${BASE_URL}/graphql`;\n}\n\n/**\n * Get the REST v2 base URL (includes /v2)\n */\nexport function getRestV2BaseURL(): string {\n return `${BASE_URL}/v2`;\n}\n\n/**\n * Get the raw base URL\n */\nexport function getBaseURL(): string {\n return BASE_URL;\n}\n","/**\n * Vault Cache Layer\n *\n * In-memory cache for vault and asset data with TTL-based expiration.\n * Provides fast lookups and automatic refresh on expiry.\n *\n * @module lib/vault-cache\n */\n\nimport { fetchVaultDataFromGraphQL } from \"../client/amplify-sdk-client\";\nimport type { AmplifyVault, SupportedAsset } from \"../types/amplify-sdk-api\";\n\n/**\n * Default cache TTL: 10 minutes (600000 milliseconds)\n */\nconst DEFAULT_TTL = 600000;\n\n/**\n * VaultCache class\n *\n * Manages in-memory cache for vault and asset data with TTL-based expiration.\n * Automatically refreshes expired cache on queries.\n *\n * @example\n * ```typescript\n * // Initialize cache with default 10-minute TTL\n * const cache = new VaultCache();\n *\n * // Initialize cache with custom TTL (5 minutes)\n * const customCache = new VaultCache(300000);\n *\n * // Get vaults by deposit token address\n * const vaults = cache.getVault(\"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\");\n *\n * // Get asset by token address\n * const asset = cache.getAsset(\"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\");\n *\n * // Get all cached vaults\n * const allVaults = cache.getAllVaults();\n *\n * // Check if cache is expired\n * const expired = cache.isExpired();\n *\n * // Manually refresh cache\n * await cache.refresh();\n * ```\n */\nexport class VaultCache {\n /**\n * Vaults keyed by baseTokenAddress\n * One key can map to multiple vaults (different chains/yield types)\n */\n private vaults: Map<string, AmplifyVault[]>;\n\n /**\n * Assets keyed by token address\n */\n private assets: Map<string, SupportedAsset>;\n\n /**\n * Vaults keyed by boringVaultAddress (lowercase, for case-insensitive lookup)\n */\n private vaultsByAddress: Map<string, AmplifyVault>;\n\n /**\n * Vaults keyed by vault name (lowercase, for case-insensitive lookup)\n */\n private vaultsByName: Map<string, AmplifyVault>;\n\n /**\n * Unix timestamp (milliseconds) of last successful fetch\n */\n private lastFetch: number;\n\n /**\n * Time-to-live in milliseconds\n */\n private readonly ttl: number;\n\n /**\n * Current refresh promise (prevents duplicate concurrent refreshes)\n * When non-null, a refresh is in progress and callers should await this promise\n */\n private refreshPromise: Promise<void> | null;\n\n /**\n * Creates a new VaultCache instance\n *\n * @param ttl - Time-to-live in milliseconds (default: 600000 = 10 minutes)\n */\n constructor(ttl: number = DEFAULT_TTL) {\n this.vaults = new Map<string, AmplifyVault[]>();\n this.assets = new Map<string, SupportedAsset>();\n this.vaultsByAddress = new Map<string, AmplifyVault>();\n this.vaultsByName = new Map<string, AmplifyVault>();\n this.lastFetch = 0;\n this.ttl = ttl;\n this.refreshPromise = null;\n }\n\n /**\n * Gets vaults by deposit token address\n *\n * Returns undefined if no vaults found for the given token address.\n * Does NOT automatically refresh if cache is expired; use refresh() for that.\n *\n * @param tokenAddress - Deposit token address (baseTokenAddress)\n * @returns Array of AmplifyVault objects, or undefined if not found\n */\n getVault(tokenAddress: string): AmplifyVault[] | undefined {\n return this.vaults.get(tokenAddress);\n }\n\n /**\n * Gets a vault by its boringVaultAddress (on-chain vault contract).\n * Case-insensitive lookup.\n */\n getVaultByAddress(address: string): AmplifyVault | undefined {\n return this.vaultsByAddress.get(address.toLowerCase());\n }\n\n /**\n * Gets a vault by its human-readable name.\n * Case-insensitive lookup.\n */\n getVaultByName(name: string): AmplifyVault | undefined {\n return this.vaultsByName.get(name.toLowerCase());\n }\n\n /**\n * Gets asset by token address\n *\n * Returns undefined if asset not found.\n * Does NOT automatically refresh if cache is expired; use refresh() for that.\n *\n * @param tokenAddress - Token address\n * @returns SupportedAsset object, or undefined if not found\n */\n getAsset(tokenAddress: string): SupportedAsset | undefined {\n return this.assets.get(tokenAddress);\n }\n\n /**\n * Gets all cached vaults\n *\n * Returns an array of all vaults across all deposit tokens.\n * Does NOT automatically refresh if cache is expired; use refresh() for that.\n *\n * @returns Array of all AmplifyVault objects\n */\n getAllVaults(): AmplifyVault[] {\n const seen = new Set<string>();\n const allVaults: AmplifyVault[] = [];\n for (const vaultArray of this.vaults.values()) {\n for (const vault of vaultArray) {\n if (!seen.has(vault.id)) {\n seen.add(vault.id);\n allVaults.push(vault);\n }\n }\n }\n return allVaults;\n }\n\n /**\n * Gets all cached assets\n *\n * Returns an array of all assets.\n * Does NOT automatically refresh if cache is expired; use refresh() for that.\n *\n * @returns Array of all SupportedAsset objects\n */\n getAllAssets(): SupportedAsset[] {\n return Array.from(this.assets.values());\n }\n\n /**\n * Checks if cache is expired\n *\n * Cache is considered expired if current time exceeds lastFetch + ttl.\n *\n * @returns true if cache is expired, false otherwise\n */\n isExpired(): boolean {\n return Date.now() > this.lastFetch + this.ttl;\n }\n\n /**\n * Gets the time until cache expires\n *\n * @returns Milliseconds until expiry, or 0 if already expired\n */\n getTimeUntilExpiry(): number {\n const expiryTime = this.lastFetch + this.ttl;\n const now = Date.now();\n return Math.max(0, expiryTime - now);\n }\n\n /**\n * Checks if cache is empty (never populated)\n *\n * @returns true if cache has never been populated, false otherwise\n */\n isEmpty(): boolean {\n return this.lastFetch === 0;\n }\n\n /**\n * Manually refreshes the cache\n *\n * Fetches fresh data from the API and updates both vaults and assets maps.\n * Updates lastFetch timestamp on success.\n *\n * If a refresh is already in progress, this method returns the existing\n * promise instead of starting a concurrent refresh. This is more efficient\n * than polling and ensures all callers wait for the same refresh operation.\n *\n * @throws {APIError} If the API request fails\n */\n async refresh(): Promise<void> {\n // If already refreshing, return the existing promise\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n // Create and store the refresh promise\n this.refreshPromise = this._doRefresh();\n\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n /**\n * Internal refresh implementation\n * Separated to allow promise reuse in refresh()\n *\n * Fetches data via GraphQL and derives both vaults and assets\n * from the same response.\n */\n private async _doRefresh(): Promise<void> {\n const { vaults, assets } = await fetchVaultDataFromGraphQL();\n\n this.vaults.clear();\n this.assets.clear();\n this.vaultsByAddress.clear();\n this.vaultsByName.clear();\n\n for (const vault of vaults) {\n for (const asset of vault.supportedAssets) {\n const tokenAddress = asset.address;\n const existing = this.vaults.get(tokenAddress);\n if (existing) {\n if (!existing.includes(vault)) {\n existing.push(vault);\n }\n } else {\n this.vaults.set(tokenAddress, [vault]);\n }\n }\n\n this.vaultsByAddress.set(\n vault.vault.boringVaultAddress.toLowerCase(),\n vault\n );\n\n if (vault.name) {\n this.vaultsByName.set(vault.name.toLowerCase(), vault);\n }\n }\n\n for (const asset of assets) {\n this.assets.set(asset.address, asset);\n }\n\n this.lastFetch = Date.now();\n }\n\n /**\n * Check if a refresh is currently in progress\n *\n * @returns true if cache is being refreshed, false otherwise\n */\n isRefreshing(): boolean {\n return this.refreshPromise !== null;\n }\n\n /**\n * Clears the cache\n *\n * Removes all cached data and resets lastFetch timestamp.\n * Does not affect TTL setting.\n */\n clear(): void {\n this.vaults.clear();\n this.assets.clear();\n this.vaultsByAddress.clear();\n this.vaultsByName.clear();\n this.lastFetch = 0;\n }\n\n /**\n * Gets cache statistics\n *\n * @returns Object with cache statistics\n */\n getStats(): {\n vaultCount: number;\n assetCount: number;\n tokenCount: number;\n lastFetch: number;\n ttl: number;\n isExpired: boolean;\n isEmpty: boolean;\n timeUntilExpiry: number;\n } {\n return {\n vaultCount: this.getAllVaults().length,\n assetCount: this.assets.size,\n tokenCount: this.vaults.size,\n lastFetch: this.lastFetch,\n ttl: this.ttl,\n isExpired: this.isExpired(),\n isEmpty: this.isEmpty(),\n timeUntilExpiry: this.getTimeUntilExpiry(),\n };\n }\n}\n","import type { Address } from \"viem\";\n\nexport const DEFAULT_DEADLINE = 3; // 3 days\n\nexport const NATIVE_TOKEN_FOR_BRIDGE_FEE =\n \"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\" as Address;\n\nexport const CHAINLINK_ADDRESS =\n \"0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419\" as Address; // usd per eth\n\nexport const DEFAULT_APPROVAL_AMOUNT = BigInt(2) ** BigInt(256) - BigInt(1);\n\n// Kept for withdraw-assets.ts and telemetry.ts (v1 endpoints, migrated separately)\nexport const API_BASE_URL = \"https://api.paxoslabs.com\";\n\n","/**\n * Telemetry Module\n *\n * Manages PostHog integration for error tracking and analytics.\n * Fetches configuration from API and initializes PostHog client.\n * Buffers errors that occur before PostHog initialization.\n */\n\nimport type { PostHog } from \"posthog-js\";\nimport { API_BASE_URL } from \"../constants\";\nimport type {\n BufferedError,\n ErrorEventPayload,\n PostHogConfig,\n TelemetryState,\n} from \"../types/telemetry.js\";\nimport { createTimeoutSignal } from \"../utils/fetch\";\nimport { getLogger } from \"./logger.js\";\nimport { getRequestHeaders } from \"./sdk-config.js\";\n\n/**\n * SDK version for telemetry events\n */\nconst SDK_VERSION = \"0.1.1-beta.1\";\n\n/**\n * Maximum number of errors to buffer before PostHog initialization\n */\nconst MAX_ERROR_BUFFER_SIZE = 10;\n\n/**\n * Timeout for config fetch (5 seconds)\n */\nconst CONFIG_FETCH_TIMEOUT = 5000;\n\n/**\n * Module-level telemetry state\n */\nconst telemetryState: TelemetryState = {\n enabled: false,\n isInitialized: false,\n isInitializing: false,\n initPromise: null,\n config: null,\n apiKey: null,\n};\n\n/**\n * PostHog client instance (lazy loaded)\n */\nlet posthogClient: PostHog | null = null;\n\n/**\n * Error buffer for pre-initialization errors\n */\nconst errorBuffer: BufferedError[] = [];\n\n/**\n * Flag to track if buffer full warning has been logged\n */\nlet bufferFullWarningLogged = false;\n\n/**\n * Hash API key for PostHog distinct ID\n *\n * Uses FNV-1a hash (64-bit) for better distribution than simple 32-bit hash.\n * This reduces collision probability significantly while staying synchronous.\n *\n * @param apiKey - SDK API key\n * @returns Hashed identifier (12 hex chars for ~48 bits of entropy)\n */\nfunction hashApiKey(apiKey: string): string {\n // FNV-1a 64-bit hash (using BigInt for precision)\n // FNV offset basis and prime for 64-bit\n const FNV_OFFSET = BigInt(\"0xcbf29ce484222325\");\n const FNV_PRIME = BigInt(\"0x100000001b3\");\n\n let hash = FNV_OFFSET;\n for (let i = 0; i < apiKey.length; i++) {\n hash ^= BigInt(apiKey.charCodeAt(i));\n hash = (hash * FNV_PRIME) & BigInt(\"0xffffffffffffffff\"); // Keep 64-bit\n }\n\n // Return 12 hex chars (48 bits) for good uniqueness with reasonable length\n return `sdk_${hash.toString(16).slice(0, 12)}`;\n}\n\n/**\n * Fetch telemetry configuration from API\n *\n * @param apiKey - SDK API key for authentication\n * @returns PostHog configuration or null if unavailable\n */\nasync function fetchTelemetryConfig(\n apiKey: string\n): Promise<PostHogConfig | null> {\n const endpoint = \"/v1/earn-sdk/config\";\n const url = `${API_BASE_URL}${endpoint}`;\n\n try {\n const headers = getRequestHeaders();\n // Ensure API key is in headers\n if (!headers[\"x-api-key\"]) {\n headers[\"x-api-key\"] = apiKey;\n }\n\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: createTimeoutSignal(CONFIG_FETCH_TIMEOUT),\n });\n\n if (!response.ok) {\n // Silent failure - telemetry is optional\n return null;\n }\n\n const data = await response.json();\n\n // Validate required fields\n if (!data || typeof data.posthogApiKey !== \"string\") {\n return null;\n }\n\n return {\n posthogApiKey: data.posthogApiKey,\n posthogHost: data.posthogHost || \"https://us.i.posthog.com\",\n };\n } catch {\n // Silent failure - telemetry is optional\n return null;\n }\n}\n\n/**\n * Flush buffered errors to PostHog\n *\n * Sends any errors that occurred before PostHog initialization.\n */\nasync function flushErrorBuffer(): Promise<void> {\n if (errorBuffer.length === 0 || !posthogClient) {\n return;\n }\n\n // PostHog client already has identity set during initialization\n for (const bufferedError of errorBuffer) {\n const payload: ErrorEventPayload = {\n error_type: bufferedError.name,\n error_message: bufferedError.message,\n error_code: bufferedError.code,\n sdk_version: SDK_VERSION,\n buffered: true,\n ...bufferedError.context,\n };\n\n posthogClient.capture(\"sdk_error\", payload);\n }\n\n // Clear buffer\n errorBuffer.length = 0;\n}\n\n/**\n * Initialize telemetry\n *\n * Fetches PostHog configuration from API and initializes the client.\n * This function is idempotent and concurrent-safe.\n *\n * @param apiKey - SDK API key\n * @returns Promise that resolves when telemetry is initialized\n *\n * @internal\n */\nexport async function initTelemetry(apiKey: string): Promise<void> {\n // Idempotent: skip if already initialized\n if (telemetryState.isInitialized) {\n return;\n }\n\n // Concurrent-safe: wait for in-progress initialization\n if (telemetryState.isInitializing && telemetryState.initPromise) {\n await telemetryState.initPromise;\n return;\n }\n\n telemetryState.isInitializing = true;\n telemetryState.apiKey = apiKey;\n\n telemetryState.initPromise = (async () => {\n try {\n // Fetch PostHog config from API\n const config = await fetchTelemetryConfig(apiKey);\n\n if (!config) {\n // No config available - disable telemetry silently\n telemetryState.enabled = false;\n telemetryState.isInitialized = true;\n return;\n }\n\n telemetryState.config = config;\n\n // Dynamically import PostHog (reduces initial bundle if not used)\n const posthogModule = await import(\"posthog-js\");\n const posthog = posthogModule.default;\n\n // Initialize PostHog\n posthog.init(config.posthogApiKey, {\n api_host: config.posthogHost,\n autocapture: false,\n capture_pageview: false,\n capture_pageleave: false,\n disable_session_recording: true,\n persistence: \"memory\", // Don't persist to localStorage\n loaded: (ph) => {\n // Identify by hashed API key for grouping\n ph.identify(hashApiKey(apiKey));\n },\n });\n\n posthogClient = posthog;\n telemetryState.enabled = true;\n telemetryState.isInitialized = true;\n\n // Flush any buffered errors\n await flushErrorBuffer();\n\n // Track successful initialization\n posthog.capture(\"sdk_initialized\", {\n sdk_version: SDK_VERSION,\n });\n } catch (error) {\n // Silent failure - log warning but don't throw\n const logger = getLogger();\n logger.warn(\"Telemetry initialization failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n\n telemetryState.enabled = false;\n telemetryState.isInitialized = true;\n } finally {\n telemetryState.isInitializing = false;\n telemetryState.initPromise = null;\n }\n })();\n\n await telemetryState.initPromise;\n}\n\n/**\n * Track an error event\n *\n * Logs to consumer logger and sends to PostHog (if enabled).\n * If PostHog is not yet initialized, buffers the error.\n *\n * @param error - Error to track\n * @param context - Additional context for the error\n *\n * @example\n * ```typescript\n * try {\n * await riskyOperation();\n * } catch (error) {\n * trackError(error, { operation: \"deposit\", chainId: 1 });\n * throw error;\n * }\n * ```\n */\nexport function trackError(\n error: Error,\n context?: Record<string, unknown>\n): void {\n const logger = getLogger();\n\n // Always log to consumer logger\n logger.error(error.message, {\n name: error.name,\n stack: error.stack,\n ...context,\n });\n\n // Extract error details\n const errorDetails: BufferedError = {\n name: error.name,\n message: error.message,\n code: (error as { code?: string }).code,\n context: context || {},\n timestamp: Date.now(),\n };\n\n // If PostHog not ready, buffer the error\n if (!posthogClient || !telemetryState.enabled) {\n if (errorBuffer.length < MAX_ERROR_BUFFER_SIZE) {\n errorBuffer.push(errorDetails);\n } else if (!bufferFullWarningLogged) {\n // Log warning once when buffer is full\n logger.warn(\n `Telemetry error buffer full (${MAX_ERROR_BUFFER_SIZE} errors). ` +\n \"Additional errors will not be tracked until telemetry initializes.\"\n );\n bufferFullWarningLogged = true;\n }\n // When buffer is full, silently drop additional errors\n return;\n }\n\n // Send to PostHog\n const payload: ErrorEventPayload = {\n error_type: error.name,\n error_message: error.message,\n error_code: (error as { code?: string }).code,\n endpoint: (error as { endpoint?: string }).endpoint,\n status_code: (error as { statusCode?: number }).statusCode,\n sdk_version: SDK_VERSION,\n ...context,\n };\n\n posthogClient.capture(\"sdk_error\", payload);\n}\n\n/**\n * Check if telemetry is enabled\n *\n * @returns true if PostHog is initialized and enabled\n */\nexport function isTelemetryEnabled(): boolean {\n return telemetryState.enabled && telemetryState.isInitialized;\n}\n\n/**\n * Check if telemetry is initialized\n *\n * @returns true if telemetry initialization is complete\n */\nexport function isTelemetryInitialized(): boolean {\n return telemetryState.isInitialized;\n}\n\n/**\n * Disable telemetry\n *\n * Prevents further error tracking. Useful for testing or opt-out.\n *\n * @internal\n */\nexport function disableTelemetry(): void {\n telemetryState.enabled = false;\n if (posthogClient) {\n posthogClient.opt_out_capturing();\n }\n}\n\n/**\n * Reset telemetry state\n *\n * Clears all telemetry state. Used for testing.\n *\n * @internal\n */\nexport function resetTelemetry(): void {\n telemetryState.enabled = false;\n telemetryState.isInitialized = false;\n telemetryState.isInitializing = false;\n telemetryState.initPromise = null;\n telemetryState.config = null;\n telemetryState.apiKey = null;\n posthogClient = null;\n errorBuffer.length = 0;\n bufferFullWarningLogged = false;\n}\n\n/**\n * Get telemetry state for debugging\n *\n * @returns Current telemetry state\n * @internal\n */\nexport function getTelemetryState(): Readonly<TelemetryState> {\n return { ...telemetryState };\n}\n","/**\n * Type definitions for Amplify SDK API integration\n *\n * These types define the data structures returned by the Earn SDK backend API\n * and internal cache structures used by the SDK.\n *\n * @module types/amplify-sdk-api\n */\n\nimport type { Address } from \"viem\";\nimport type { YieldType } from \"../constants/config\";\nimport { trackError } from \"../lib/telemetry.js\";\n\n// Re-export YieldType for convenience\nexport type { YieldType };\n\n/**\n * Vault smart contract configuration\n *\n * Contains all contract addresses required for vault operations:\n * - boringVaultAddress: Main vault contract\n * - tellerAddress: Handles deposits and withdrawals\n * - accountantAddress: Manages accounting logic\n * - managerAddress: Controls strategy execution\n * - rolesAuthorityAddress: Enforces role-based access\n * - baseTokenAddress: Primary deposit token address\n * - baseTokenStandIn: Optional stand-in token\n * - communityCodeDepositorAddress: Optional community depositor contract\n */\nexport interface VaultContracts {\n boringVaultAddress: Address;\n tellerAddress: Address;\n accountantAddress: Address;\n managerAddress: Address;\n rolesAuthorityAddress: Address;\n baseTokenAddress: Address;\n baseTokenStandIn?: Address;\n communityCodeDepositorAddress?: Address;\n withdrawQueueAddress?: Address;\n}\n\n/**\n * A single depositable/withdrawable asset supported by a vault.\n */\nexport interface VaultSupportedAsset {\n /** Token contract address */\n address: Address;\n /** Token symbol (e.g., USDC, USDT) */\n symbol: string;\n /** Full token name (e.g., USD Coin) */\n name: string;\n /** Number of decimal places (e.g., 6 for USDC, 18 for DAI) */\n decimals: number;\n /** CoinGecko token identifier for price lookups */\n coinGeckoTokenId?: string;\n /** Whether deposits are currently enabled for this vault-asset pair */\n depositable?: boolean;\n /** Whether withdrawals are currently enabled for this vault-asset pair */\n withdrawable?: boolean;\n}\n\n/**\n * Amplify vault configuration\n *\n * Represents a single vault with contract addresses, yield type, and supported deposit assets.\n * Multiple vaults can share the same baseTokenAddress (different chains/yield types).\n * A single vault can support multiple depositable assets.\n *\n * @example\n * ```typescript\n * const vault: AmplifyVault = {\n * id: \"config-eth-core-001\",\n * chainId: 1,\n * yieldType: \"CORE\",\n * vault: {\n * boringVaultAddress: \"0x8a5Fb0Eb3E1a90AF81C5DFF9f2e5D0e7b8D4E5F6\",\n * tellerAddress: \"0x7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C\",\n * accountantAddress: \"0x6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B\",\n * managerAddress: \"0x5A6B7C8D9E0F1A2B3C4D5E6F7A8B9C0D1E2F3A4B\",\n * rolesAuthorityAddress: \"0x4A5B6C7D8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B\",\n * baseTokenAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * },\n * supportedAssets: [\n * {\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * symbol: \"USDC\",\n * name: \"USD Coin\",\n * decimals: 6,\n * coinGeckoTokenId: \"usd-coin\"\n * }\n * ]\n * };\n * ```\n */\nexport interface VaultSLA {\n externalWithdrawalQueueDelaySLA: number;\n externalAccountantRateUpdateSLA: number;\n}\n\nexport interface AmplifyVault {\n /** Unique identifier for the vault configuration */\n id: string;\n /** Chain ID where the vault is deployed (e.g., 1 for Ethereum) */\n chainId: number;\n /** Yield strategy type */\n yieldType: YieldType;\n /** Human-readable vault name */\n name: string;\n /** Vault smart contract addresses */\n vault: VaultContracts;\n /** SLA data from VaultSLAs table */\n sla?: VaultSLA;\n /** Supported deposit assets for this vault */\n supportedAssets: VaultSupportedAsset[];\n}\n\n/**\n * Supported asset (token) metadata\n *\n * Represents a cryptocurrency token with metadata and chain support.\n * Can be correlated with AmplifyVault via the vault's supportedAssets array.\n *\n * @example\n * ```typescript\n * const asset: SupportedAsset = {\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * symbol: \"USDC\",\n * name: \"USD Coin\",\n * decimals: 6,\n * coinGeckoTokenId: \"usd-coin\",\n * chains: [1, 137, 8453, 42161]\n * };\n * ```\n */\nexport interface SupportedAsset {\n /** Token contract address */\n address: Address;\n /** Token symbol (e.g., USDC, USDT) */\n symbol: string;\n /** Full token name (e.g., USD Coin) */\n name: string;\n /** Number of decimal places (e.g., 6 for USDC, 18 for DAI) */\n decimals: number;\n /** CoinGecko token identifier for price lookups */\n coinGeckoTokenId?: string;\n /** Array of chain IDs where this token is supported */\n chains: number[];\n}\n\n/**\n * Filter options for vault queries\n *\n * Used to filter vaults by chain, yield type, or deposit token.\n * All filters are optional and can be combined.\n *\n * @example\n * ```typescript\n * // Get all CORE vaults on Ethereum\n * const options: VaultFilterOptions = {\n * chainId: 1,\n * yieldType: \"CORE\"\n * };\n *\n * // Get all vaults accepting USDC\n * const usdcOptions: VaultFilterOptions = {\n * depositTokenAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * };\n * ```\n */\nexport interface VaultFilterOptions {\n /** Filter by chain ID */\n chainId?: number;\n /** Filter by yield type */\n yieldType?: YieldType;\n /** Filter by deposit token address */\n depositTokenAddress?: Address;\n /** Filter by withdraw asset address */\n withdrawAssetAddress?: Address;\n /** Filter by settlement asset address */\n settlementAssetAddress?: Address;\n}\n\n/**\n * Filter options for asset queries\n *\n * Used to filter supported assets by chain IDs, yield type, address, or symbol.\n * All filters are optional and can be combined.\n *\n * Note: API endpoints only support `chains` and `yieldType` parameters.\n * The `address` and `symbol` filters are only applied in cache-layer filtering.\n *\n * @example\n * ```typescript\n * // Get all assets supported on Ethereum and Base (API call)\n * const options: AssetFilterOptions = {\n * chains: [1, 8453]\n * };\n *\n * // Get CORE yield type assets (API call)\n * const coreOptions: AssetFilterOptions = {\n * yieldType: \"CORE\"\n * };\n *\n * // Filter by address (cache-only)\n * const usdcOptions: AssetFilterOptions = {\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * };\n *\n * // Filter by symbol (cache-only)\n * const symbolOptions: AssetFilterOptions = {\n * symbol: \"USDC\"\n * };\n * ```\n */\nexport interface AssetFilterOptions {\n /** Filter by chain IDs (API + cache: assets with these chains in chains array) */\n chains?: number[];\n /** Filter by yield type (API + cache: CORE, TREASURY, or FRONTIER) */\n yieldType?: YieldType;\n /** Filter by token address (cache-only: exact address match) */\n address?: string;\n /** Filter by token symbol (cache-only: exact symbol match) */\n symbol?: string;\n}\n\n/**\n * API error with descriptive messages\n *\n * Thrown when API requests fail due to network errors, server errors,\n * or malformed responses.\n *\n * @example\n * ```typescript\n * throw new APIError(\"Failed to fetch vaults: Network timeout\", {\n * statusCode: 408,\n * endpoint: \"/v1/earn-sdk/vaults\"\n * });\n * ```\n */\nexport class APIError extends Error {\n /**\n * HTTP status code (if available)\n */\n statusCode?: number;\n\n /**\n * API endpoint that failed\n */\n endpoint?: string;\n\n /**\n * Original error cause\n */\n cause?: unknown;\n\n constructor(\n message: string,\n options?: {\n statusCode?: number;\n endpoint?: string;\n cause?: unknown;\n }\n ) {\n super(message);\n this.name = \"APIError\";\n this.statusCode = options?.statusCode;\n this.endpoint = options?.endpoint;\n this.cause = options?.cause;\n\n // Fix prototype chain for instanceof checks when transpiled to ES5/ES3\n // This ensures `error instanceof APIError` works correctly across all environments\n Object.setPrototypeOf(this, APIError.prototype);\n\n // Maintain proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, APIError);\n }\n\n // Track error in telemetry (synchronous, non-blocking)\n // Uses try-catch to prevent telemetry failures from affecting error throwing\n try {\n trackError(this, {\n endpoint: this.endpoint,\n statusCode: this.statusCode,\n });\n } catch {\n // Silent failure - telemetry should never break error handling\n }\n }\n}\n\n/**\n * Validates if a value is a valid yield type\n */\nexport function isValidYieldType(value: unknown): value is YieldType {\n return (\n typeof value === \"string\" &&\n (value === \"CORE\" ||\n value === \"TREASURY\" ||\n value === \"FRONTIER\")\n );\n}\n\n/**\n * Validates if a value is a valid Ethereum address\n */\nexport function isValidAddress(value: unknown): boolean {\n return typeof value === \"string\" && /^0x[a-fA-F0-9]{40}$/.test(value);\n}\n\n/**\n * Validates if a value is a valid chain ID\n */\nexport function isValidChainId(value: unknown): boolean {\n return typeof value === \"number\" && value > 0 && Number.isInteger(value);\n}\n\n/**\n * Parameters required to prepare a withdrawal transaction\n *\n * Used to prepare a transaction for withdrawing assets from a vault using the Teller contract.\n *\n * @example\n * ```typescript\n * const params: PrepareWithdrawTransactionDataParams = {\n * yieldType: \"CORE\",\n * recipientAddress: \"0x1234...\",\n * wantToken: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * shareAmount: \"1.5\",\n * chainId: 1,\n * slippage: 50, // 0.5% (basis points, DEFAULT_SLIPPAGE_BPS)\n * };\n * ```\n */\nexport interface PrepareWithdrawTransactionDataParams {\n /** Yield strategy type (e.g., \"CORE\") */\n yieldType: YieldType;\n /** Recipient wallet address (where withdrawn assets will be sent) */\n recipientAddress: Address;\n /** Token address to withdraw (asset to receive) */\n wantToken: Address;\n /** Amount of vault shares to redeem (decimal string, e.g., \"1.5\") */\n shareAmount: string;\n /** Blockchain network ID (e.g., 1 for Ethereum) */\n chainId: number;\n /** Maximum acceptable slippage in basis points (50 = 0.5%, default: 50) */\n slippage?: number;\n}\n\n/**\n * Transaction data for bulk withdrawal from Teller contract\n *\n * Ready-to-use transaction data that can be passed directly to wagmi's useWriteContract hook.\n *\n * @example\n * ```typescript\n * const txData: BulkWithdrawTransactionData = {\n * abi: TellerAbi,\n * address: \"0x...\",\n * functionName: \"bulkWithdraw\",\n * args: [\"0xA0b86991...\", 1500000000000000000n, 1485000000000000000n, \"0x1234...\"],\n * chainId: 1,\n * };\n *\n * const { writeContract } = useWriteContract();\n * await writeContract(txData);\n * ```\n */\nexport interface BulkWithdrawTransactionData {\n /** Teller contract ABI for type safety */\n abi: unknown; // typeof TellerAbi (imported dynamically)\n /** Teller contract address on the target chain */\n address: Address;\n /** Function name to call on Teller contract */\n functionName: \"bulkWithdraw\";\n /** Function arguments: [withdrawAsset, shareAmount, minimumAssets, to] */\n args: [\n withdrawAsset: Address,\n shareAmount: bigint,\n minimumAssets: bigint,\n to: Address,\n ];\n /** Blockchain network ID where transaction will execute */\n chainId: number;\n}\n\n/**\n * Withdrawal error details\n *\n * Thrown when withdrawal preparation fails due to validation errors, missing vaults, or other issues.\n *\n * @example\n * ```typescript\n * throw new WithdrawError(\"No vault found for CORE yield type\", {\n * code: \"VAULT_NOT_FOUND\",\n * yieldType: \"CORE\",\n * chainId: 1,\n * });\n * ```\n */\nexport class WithdrawError extends Error {\n /** Error code for programmatic error handling */\n code: string;\n /** Yield type that caused the error (if applicable) */\n yieldType?: string;\n /** Chain ID that caused the error (if applicable) */\n chainId?: number;\n /** Token address that caused the error (if applicable) */\n tokenAddress?: string;\n\n constructor(\n message: string,\n options?: {\n code?: string;\n yieldType?: string;\n chainId?: number;\n tokenAddress?: string;\n }\n ) {\n super(message);\n this.name = \"WithdrawError\";\n this.code = options?.code || \"UNKNOWN_ERROR\";\n this.yieldType = options?.yieldType;\n this.chainId = options?.chainId;\n this.tokenAddress = options?.tokenAddress;\n\n // Fix prototype chain for instanceof checks when transpiled to ES5/ES3\n // This ensures `error instanceof WithdrawError` works correctly across all environments\n Object.setPrototypeOf(this, WithdrawError.prototype);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, WithdrawError);\n }\n }\n}\n\n/**\n * Supported asset information for withdrawal\n *\n * Asset grouped with available vaults that support withdrawal of that asset.\n *\n * @example\n * ```typescript\n * const asset: WithdrawSupportedAsset = {\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * symbol: \"USDC\",\n * decimals: 6,\n * vaults: [\n * { id: \"core-usdc-eth\", yieldType: \"CORE\", chainId: 1, vaultId: \"...\" },\n * { id: \"core-usdc-boba\", yieldType: \"CORE\", chainId: 288, vaultId: \"...\" },\n * ],\n * };\n * ```\n */\nexport interface WithdrawSupportedAsset {\n /** Token contract address */\n address: Address;\n /** Token symbol (e.g., \"USDC\", \"ETH\") */\n symbol: string;\n /** Number of decimal places for this token */\n decimals: number;\n /** Array of vaults that support withdrawals of this asset */\n vaults: Array<{\n id: string;\n yieldType: YieldType;\n chainId: number;\n vaultId: string;\n }>;\n}\n","/**\n * GraphQL Client\n *\n * Native fetch-based GraphQL client with composable query builder.\n * All exports are SDK-internal (not exported from src/index.ts).\n *\n * @module client/graphql-client\n * @internal\n */\n\nimport { getRequestHeaders } from \"../lib/sdk-config\";\nimport { APIError } from \"../types/amplify-sdk-api\";\nimport type {\n AmplifySdkConfigsResponse,\n AmplifySdkConfigsVariables,\n GraphQLResponse,\n} from \"../types/graphql-types\";\nimport {\n DEFAULT_TIMEOUT,\n createTimeoutSignal,\n} from \"../utils/fetch\";\n\n// ============================================================================\n// FIELD FRAGMENTS\n// ============================================================================\n\nconst VAULT_FIELDS = `\n id\n name\n chainId\n isDeleted\n boringVaultModuleId\n boringVaultAddress\n rolesAuthorityModuleId\n tellerModuleId\n accountantModuleId\n managerModuleId\n withdrawQueueModuleId\n communityCodeDepositorModuleId\n baseTokenAddressId\n baseTokenStandInId\n baseTokenStandIn {\n decimals\n symbol\n coinGeckoApiId\n }\n withdrawalSla {\n withdrawAssetAddress\n externalWithdrawalQueueDelaySLA\n externalAccountantRateUpdateSLA\n }\n supportedAssets {\n address\n chainId\n depositable\n withdrawable\n symbol\n tokenName\n decimals\n }\n`;\n\nconst DEPOSIT_TOKEN_FIELDS = `\n id\n address\n chainId\n name\n`;\n\nconst TOKEN_METADATA_FIELDS = `\n address\n chainId\n symbol\n tokenName\n decimals\n coinGeckoTokenId\n tokenStandard\n source\n firstSeenAt\n metadataRefreshedAt\n`;\n\nconst VAULT_ASSET_FLAGS_FIELDS = `\n depositable\n withdrawable\n`;\n\nconst SDK_CONFIG_CORE_FIELDS = `\n id\n chainId\n environment\n yieldType\n vaultId\n depositTokenAddressId\n`;\n\n// ============================================================================\n// QUERY BUILDER\n// ============================================================================\n\ninterface BuildSdkConfigsQueryOptions {\n fields: string[];\n vault?: string;\n depositTokenAddress?: string;\n tokenMetadata?: string;\n vaultAssetFlags?: string;\n}\n\nfunction buildSdkConfigsQuery(\n options: BuildSdkConfigsQueryOptions\n): string {\n const nestedFields: string[] = [];\n if (options.vault) {\n nestedFields.push(`vault { ${options.vault} }`);\n }\n if (options.depositTokenAddress) {\n nestedFields.push(\n `depositTokenAddress { ${options.depositTokenAddress} }`\n );\n }\n if (options.tokenMetadata) {\n nestedFields.push(\n `tokenMetadata { ${options.tokenMetadata} }`\n );\n }\n if (options.vaultAssetFlags) {\n nestedFields.push(\n `vaultAssetFlags { ${options.vaultAssetFlags} }`\n );\n }\n\n const allFields = [\n ...options.fields,\n ...nestedFields,\n ].join(\"\\n \");\n\n return `\n query AmplifySdkConfigs(\n $environment: Environment\n $chainId: Int\n $yieldType: YieldType\n ) {\n amplifySdkConfigs(\n environment: $environment\n chainId: $chainId\n yieldType: $yieldType\n ) {\n ${allFields}\n }\n }\n`;\n}\n\n// ============================================================================\n// CORE EXECUTION\n// ============================================================================\n\nasync function executeGraphQLQuery<T>(\n endpoint: string,\n query: string,\n variables?: Record<string, unknown>\n): Promise<T> {\n const headers = getRequestHeaders();\n\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ query, variables }),\n signal: createTimeoutSignal(DEFAULT_TIMEOUT),\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === \"AbortError\"\n ) {\n throw new APIError(\n \"GraphQL request timed out\",\n { endpoint, cause: error }\n );\n }\n throw new APIError(\n `GraphQL network error: ${error instanceof Error ? error.message : String(error)}`,\n { endpoint, cause: error }\n );\n }\n\n if (!response.ok) {\n throw new APIError(\n `GraphQL HTTP error: ${response.status} ${response.statusText}`,\n { endpoint, statusCode: response.status }\n );\n }\n\n let body: GraphQLResponse<T>;\n try {\n body = await response.json();\n } catch (error) {\n throw new APIError(\n \"GraphQL response is not valid JSON\",\n { endpoint, cause: error }\n );\n }\n\n if (body.errors && body.errors.length > 0) {\n const messages = body.errors\n .map((e) => e.message)\n .join(\"; \");\n throw new APIError(`GraphQL errors: ${messages}`, {\n endpoint,\n cause: body.errors,\n });\n }\n\n if (!body.data) {\n throw new APIError(\n \"GraphQL response missing data field\",\n { endpoint }\n );\n }\n\n return body.data;\n}\n\n// ============================================================================\n// PUBLIC (SDK-INTERNAL) QUERIES\n// ============================================================================\n\n/**\n * Fetch all SDK configs with full vault and deposit token data\n *\n * Used by cache refresh to populate vault and asset caches.\n *\n * @internal\n */\nexport async function fetchAmplifySdkConfigs(\n endpoint: string,\n variables?: AmplifySdkConfigsVariables\n): Promise<AmplifySdkConfigsResponse> {\n const query = buildSdkConfigsQuery({\n fields: SDK_CONFIG_CORE_FIELDS.trim().split(/\\s+/),\n vault: VAULT_FIELDS,\n depositTokenAddress: DEPOSIT_TOKEN_FIELDS,\n tokenMetadata: TOKEN_METADATA_FIELDS,\n vaultAssetFlags: VAULT_ASSET_FLAGS_FIELDS,\n });\n\n return executeGraphQLQuery<AmplifySdkConfigsResponse>(\n endpoint,\n query,\n variables as Record<string, unknown> | undefined\n );\n}\n","/**\n * SDK Configuration Constants\n *\n * Global constants for supported chains, yield types, tokens, and defaults.\n * Centralized configuration for address book integration and permit deposits.\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Yield Type identifiers\n *\n * Use as const values: YieldType.CORE, YieldType.TREASURY, YieldType.FRONTIER\n * Use as type annotation: yieldType: YieldType\n */\nexport const YieldType = {\n CORE: \"CORE\",\n TREASURY: \"TREASURY\",\n FRONTIER: \"FRONTIER\",\n} as const;\n\nexport type YieldType = (typeof YieldType)[keyof typeof YieldType];\n\n/**\n * Supported Yield Types\n *\n * Yield products offered by Nucleus.\n */\nexport const SUPPORTED_YIELD_TYPES: readonly YieldType[] = [\n \"CORE\",\n \"TREASURY\",\n \"FRONTIER\",\n];\n\n/**\n * Token Allow List for Permit Deposits\n *\n * @returns Token allow list for permit deposits\n */\nexport const TOKEN_ALLOW_LIST_BY_CHAIN_FOR_PERMIT_DEPOSITS = {\n 1: [\n {\n symbol: \"USDC\",\n address: \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n supportsPermit: true,\n },\n {\n symbol: \"USDG\",\n address: \"0xe343167631d89b6ffc58b88d6b7fb0228795491d\",\n supportsPermit: true,\n },\n ],\n} as const;\n\n/**\n * Permit Types\n *\n * @returns Permit types\n */\nexport const PERMIT_TYPES = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Default Slippage: 50 basis points (0.5%)\n *\n * Conservative default for deposit transactions.\n * Can be overridden per transaction.\n */\nexport const DEFAULT_SLIPPAGE_BPS = 50; // 0.5%\n\n/**\n * Maximum Slippage: 10000 basis points (100%)\n *\n * Safeguard against accidental extreme slippage.\n */\nexport const MAX_SLIPPAGE_BPS = 10000;\n\n/**\n * Minimum Slippage: 0 basis points (0%)\n *\n * Minimum enforced slippage in basis points.\n */\nexport const MIN_SLIPPAGE_BPS = 0;\n\n/**\n * Permit Configuration Defaults\n *\n * Default settings for ERC2612 permit-based approvals.\n */\nexport const PERMIT_CONFIG = {\n /** Default deadline: 1 hour from signature */\n defaultDeadlineSeconds: 3600,\n /** Minimum deadline: 5 minutes (time to submit transaction) */\n minDeadlineSeconds: 300,\n /** Maximum deadline: 24 hours (limits signature validity) */\n maxDeadlineSeconds: 86400,\n /** Cache permit support checks for 24 hours */\n cachePermitSupport: true,\n /** Permit support cache TTL: 24 hours */\n permitSupportCacheTTL: 86400000,\n} as const;\n\n/**\n * Address Book Cache Configuration\n *\n * Default settings for address book query caching.\n */\nexport const ADDRESS_BOOK_CACHE_CONFIG = {\n /** Cache TTL: 1 hour */\n defaultTTL: 3600000,\n /** Auto-refresh cache on errors */\n autoRefreshOnError: true,\n /** Maximum cache size: 1000 entries */\n maxCacheSize: 1000,\n} as const;\n\n/**\n * Deposit Configuration Defaults\n *\n * Default settings for deposit transaction preparation.\n */\nexport const DEPOSIT_CONFIG = {\n /** Default slippage in basis points */\n defaultSlippageBps: DEFAULT_SLIPPAGE_BPS,\n /** Maximum allowed slippage */\n maxSlippageBps: MAX_SLIPPAGE_BPS,\n /** Require approval check before deposit */\n requireApprovalCheck: true,\n /** Don't auto-approve without user confirmation */\n autoApprove: false,\n} as const;\n\n/**\n * Gas Estimation Defaults\n *\n * Default gas limits for different operations.\n */\nexport const GAS_CONFIG = {\n /** Gas limit for approve transaction */\n approveGasLimit: 100000n,\n /** Gas limit for permit deposit transaction */\n permitDepositGasLimit: 500000n,\n /** Gas limit for standard deposit + approve */\n standardDepositGasLimit: 600000n,\n} as const;\n\n/**\n * Performance Targets\n *\n * Expected performance characteristics for monitoring.\n */\nexport const PERFORMANCE_TARGETS = {\n /** Address book queries should complete in <50ms */\n addressBookQueryMs: 50,\n /** Permit signature generation should complete in <100ms */\n permitSignatureMs: 100,\n /** Transaction preparation should complete in <200ms */\n transactionPreparationMs: 200,\n} as const;\n\n/**\n * Error Codes\n *\n * Standardized error codes for programmatic error handling.\n */\nexport const ERROR_CODES = {\n // Address Book Errors\n VAULT_NOT_FOUND: \"VAULT_NOT_FOUND\",\n CHAIN_NOT_SUPPORTED: \"CHAIN_NOT_SUPPORTED\",\n TOKEN_NOT_SUPPORTED: \"TOKEN_NOT_SUPPORTED\",\n YIELD_TYPE_NOT_SUPPORTED: \"YIELD_TYPE_NOT_SUPPORTED\",\n ADDRESS_BOOK_DATA_ERROR: \"ADDRESS_BOOK_DATA_ERROR\",\n ADDRESS_BOOK_CACHE_ERROR: \"ADDRESS_BOOK_CACHE_ERROR\",\n\n // Permit Errors\n PERMIT_NOT_SUPPORTED: \"PERMIT_NOT_SUPPORTED\",\n PERMIT_SIGNATURE_ERROR: \"PERMIT_SIGNATURE_ERROR\",\n INVALID_DEADLINE: \"INVALID_DEADLINE\",\n NONCE_ERROR: \"NONCE_ERROR\",\n DOMAIN_SEPARATOR_ERROR: \"DOMAIN_SEPARATOR_ERROR\",\n INVALID_PERMIT_SIGNATURE: \"INVALID_PERMIT_SIGNATURE\",\n\n // Deposit Errors\n INVALID_DEPOSIT_AMOUNT: \"INVALID_DEPOSIT_AMOUNT\",\n INVALID_SLIPPAGE: \"INVALID_SLIPPAGE\",\n INSUFFICIENT_APPROVAL: \"INSUFFICIENT_APPROVAL\",\n INVALID_USER_ADDRESS: \"INVALID_USER_ADDRESS\",\n DEPOSIT_VALIDATION_ERROR: \"DEPOSIT_VALIDATION_ERROR\",\n TRANSACTION_PREPARATION_ERROR: \"TRANSACTION_PREPARATION_ERROR\",\n\n // CommunityCodeDepositor Errors\n INVALID_DEPOSITOR_ADDRESS: \"INVALID_DEPOSITOR_ADDRESS\",\n DEPOSITOR_CONTRACT_ERROR: \"DEPOSITOR_CONTRACT_ERROR\",\n\n // Enterprise Vault Errors\n VAULT_NOT_FOUND_BY_ADDRESS: \"VAULT_NOT_FOUND_BY_ADDRESS\",\n VAULT_NOT_FOUND_BY_NAME: \"VAULT_NOT_FOUND_BY_NAME\",\n UNAUTHORIZED_VAULT_ACCESS: \"UNAUTHORIZED_VAULT_ACCESS\",\n} as const;\n\n/**\n * Type for error codes\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Helper: Check if yield type is supported\n *\n * @param yieldType - Yield product type\n * @returns true if yield type is in the supported list\n */\nexport function isSupportedYieldType(\n yieldType: string\n): yieldType is YieldType {\n return SUPPORTED_YIELD_TYPES.includes(yieldType as YieldType);\n}\n\n/**\n * Helper: Get permit version for token\n *\n * @param symbol - Stablecoin symbol\n * @returns Permit version (\"1\" or \"2\") or undefined if not supported\n */\nexport function getTokenAllowListByChainForPermitDeposits(\n chainId: number,\n depositTokenAddress: Address\n) {\n const tokens =\n TOKEN_ALLOW_LIST_BY_CHAIN_FOR_PERMIT_DEPOSITS[\n chainId as keyof typeof TOKEN_ALLOW_LIST_BY_CHAIN_FOR_PERMIT_DEPOSITS\n ];\n if (!tokens) {\n return null;\n }\n\n return tokens.find(\n (t: { address: string; supportsPermit: boolean }) =>\n t.address.toLowerCase() === depositTokenAddress.toLowerCase()\n );\n}\n","/**\n * GraphQL Response Mapper\n *\n * Maps GraphQL amplifySdkConfigs responses to SDK types\n * (AmplifyVault, SupportedAsset).\n *\n * @module client/graphql-mapper\n * @internal\n */\n\nimport type { Address } from \"viem\";\nimport { YieldType } from \"../constants/config\";\nimport { getLogger } from \"../lib/logger\";\nimport type {\n AmplifyVault,\n SupportedAsset,\n VaultSupportedAsset,\n} from \"../types/amplify-sdk-api\";\nimport type {\n GraphQLAmplifySDKConfig,\n GraphQLYieldType,\n} from \"../types/graphql-types\";\n\n/**\n * Maps GraphQL yield types to SDK yield types\n *\n * GraphQL has 6 types, SDK has 3:\n * - CORE / PRIME → CORE\n * - TREASURY / TBILL → TREASURY\n * - FRONTIER / LENDING → FRONTIER\n */\nfunction mapYieldType(\n graphqlYieldType: GraphQLYieldType\n): YieldType | null {\n switch (graphqlYieldType) {\n case \"CORE\":\n case \"PRIME\":\n return YieldType.CORE;\n case \"TREASURY\":\n case \"TBILL\":\n return YieldType.TREASURY;\n case \"FRONTIER\":\n case \"LENDING\":\n return YieldType.FRONTIER;\n default: {\n const logger = getLogger();\n logger.warn(\n `Unknown GraphQL yield type: ${graphqlYieldType}, skipping`\n );\n return null;\n }\n }\n}\n\n/**\n * Maps a single GraphQL SDK config to an AmplifyVault\n *\n * Uses vault.supportedAssets from the indexer when available (contains all\n * deposit tokens for the vault). Falls back to the config's single\n * depositTokenAddress when the field is missing or empty.\n */\nexport function mapGraphQLConfigToVault(\n config: GraphQLAmplifySDKConfig\n): AmplifyVault | null {\n if (!config.vault || !config.depositTokenAddress) {\n return null;\n }\n\n const yieldType = mapYieldType(config.yieldType);\n if (!yieldType) {\n return null;\n }\n\n const { vault, depositTokenAddress } = config;\n\n const indexerAssets: VaultSupportedAsset[] =\n vault.supportedAssets && vault.supportedAssets.length > 0\n ? vault.supportedAssets.map((a) => ({\n address: a.address as Address,\n symbol: a.symbol ?? a.address,\n name: a.tokenName ?? a.symbol ?? a.address,\n decimals: a.decimals ?? 0,\n depositable: a.depositable,\n withdrawable: a.withdrawable,\n }))\n : [\n {\n address: depositTokenAddress.address as Address,\n symbol:\n config.tokenMetadata?.symbol ?? depositTokenAddress.name,\n name:\n config.tokenMetadata?.tokenName ?? depositTokenAddress.name,\n decimals: config.tokenMetadata?.decimals ?? 0,\n ...(config.vaultAssetFlags && {\n depositable: config.vaultAssetFlags.depositable,\n withdrawable: config.vaultAssetFlags.withdrawable,\n }),\n },\n ];\n\n return {\n id: config.id,\n chainId: config.chainId,\n yieldType,\n name: vault.name,\n vault: {\n boringVaultAddress:\n vault.boringVaultAddress as Address,\n tellerAddress: vault.tellerModuleId as Address,\n accountantAddress:\n vault.accountantModuleId as Address,\n managerAddress: vault.managerModuleId as Address,\n rolesAuthorityAddress:\n vault.rolesAuthorityModuleId as Address,\n baseTokenAddress:\n vault.baseTokenAddressId as Address,\n baseTokenStandIn: vault.baseTokenStandInId\n ? (vault.baseTokenStandInId as Address)\n : undefined,\n withdrawQueueAddress: vault.withdrawQueueModuleId\n ? (vault.withdrawQueueModuleId as Address)\n : undefined,\n communityCodeDepositorAddress:\n vault.communityCodeDepositorModuleId\n ? (vault.communityCodeDepositorModuleId as Address)\n : undefined,\n },\n supportedAssets: indexerAssets,\n sla: vault.withdrawalSla && vault.withdrawalSla.length > 0\n ? {\n externalWithdrawalQueueDelaySLA: vault.withdrawalSla[0].externalWithdrawalQueueDelaySLA,\n externalAccountantRateUpdateSLA: vault.withdrawalSla[0].externalAccountantRateUpdateSLA,\n }\n : undefined,\n };\n}\n\n/**\n * Aggregates multiple GraphQL SDK configs into deduplicated AmplifyVaults.\n *\n * Each vault's supportedAssets are now populated from the indexer via the\n * vault.supportedAssets GraphQL field, so aggregation only needs to\n * deduplicate by vaultId (first config wins for vault skeleton).\n */\nexport function aggregateVaultConfigs(\n configs: GraphQLAmplifySDKConfig[]\n): AmplifyVault[] {\n const vaultMap = new Map<string, AmplifyVault>();\n\n for (const config of configs) {\n if (!config.vault || !config.depositTokenAddress) continue;\n if (vaultMap.has(config.vaultId)) continue;\n\n const mapped = mapGraphQLConfigToVault(config);\n if (mapped) {\n vaultMap.set(config.vaultId, mapped);\n }\n }\n\n return Array.from(vaultMap.values());\n}\n\n/**\n * Extracts deduplicated SupportedAsset list from SDK configs\n *\n * Groups by depositTokenAddress.address (lowercase),\n * aggregates chainId into chains array.\n * Decimals set to 0 placeholder (fetched on-demand).\n */\nexport function extractSupportedAssetsFromConfigs(\n configs: GraphQLAmplifySDKConfig[]\n): SupportedAsset[] {\n const assetMap = new Map<\n string,\n {\n address: Address;\n symbol: string;\n name: string;\n decimals: number;\n chains: Set<number>;\n }\n >();\n\n for (const config of configs) {\n if (!config.depositTokenAddress) continue;\n\n const key =\n config.depositTokenAddress.address.toLowerCase();\n const existing = assetMap.get(key);\n\n if (existing) {\n existing.chains.add(config.chainId);\n if (existing.decimals === 0 && config.tokenMetadata?.decimals) {\n existing.decimals = config.tokenMetadata.decimals;\n existing.symbol = config.tokenMetadata.symbol ?? existing.symbol;\n existing.name = config.tokenMetadata.tokenName ?? existing.name;\n }\n } else {\n assetMap.set(key, {\n address:\n config.depositTokenAddress.address as Address,\n symbol: config.tokenMetadata?.symbol ?? config.depositTokenAddress.name,\n name: config.tokenMetadata?.tokenName ?? config.depositTokenAddress.name,\n decimals: config.tokenMetadata?.decimals ?? 0,\n chains: new Set([config.chainId]),\n });\n }\n }\n\n return Array.from(assetMap.values()).map((asset) => ({\n address: asset.address,\n symbol: asset.symbol,\n name: asset.name,\n decimals: asset.decimals,\n chains: Array.from(asset.chains),\n }));\n}\n","/**\n * Amplify SDK API Client\n *\n * Provides functions to fetch vault and asset data from the Amplify SDK backend API.\n * Handles input validation, error handling, and response parsing.\n * Includes cache integration for performance optimization.\n *\n * @module client/amplify-sdk-client\n */\n\nimport type { Address } from \"viem\";\nimport { getGraphQLEndpoint } from \"../constants/environment\";\n\nimport { VaultCache } from \"../lib/vault-cache\";\nimport type {\n AmplifyVault,\n AssetFilterOptions,\n SupportedAsset,\n VaultFilterOptions,\n WithdrawSupportedAsset,\n YieldType,\n} from \"../types/amplify-sdk-api\";\nimport {\n APIError,\n isValidAddress,\n isValidChainId,\n isValidYieldType,\n} from \"../types/amplify-sdk-api\";\nimport { fetchAmplifySdkConfigs } from \"./graphql-client\";\nimport {\n aggregateVaultConfigs,\n extractSupportedAssetsFromConfigs,\n} from \"./graphql-mapper\";\n\n/**\n * Validates vault filter options\n * Throws APIError if validation fails\n */\nfunction validateVaultFilterOptions(options?: VaultFilterOptions): void {\n if (!options) return;\n\n if (options.chainId !== undefined && !isValidChainId(options.chainId)) {\n throw new APIError(\n `Invalid chainId: ${options.chainId}. Must be a positive integer.`,\n { endpoint: \"/v1/earn-sdk/vaults\" },\n );\n }\n\n if (options.yieldType !== undefined && !isValidYieldType(options.yieldType)) {\n throw new APIError(\n `Invalid yieldType: ${options.yieldType}. Must be one of: CORE, TREASURY, FRONTIER.`,\n { endpoint: \"/v1/earn-sdk/vaults\" },\n );\n }\n\n if (\n options.depositTokenAddress !== undefined &&\n !isValidAddress(options.depositTokenAddress)\n ) {\n throw new APIError(\n `Invalid depositTokenAddress: ${options.depositTokenAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"/v1/earn-sdk/vaults\" },\n );\n }\n}\n\n/**\n * Validates asset filter options\n * Throws APIError if validation fails\n */\nfunction validateAssetFilterOptions(options?: AssetFilterOptions): void {\n if (!options) return;\n\n // Validate chains array\n if (options.chains !== undefined) {\n if (!Array.isArray(options.chains) || options.chains.length === 0) {\n throw new APIError(\n \"Invalid chains: Must be a non-empty array of chain IDs.\",\n { endpoint: \"/v1/earn-sdk/supported-assets-by-chains\" },\n );\n }\n\n // Validate each chain ID in the array\n for (const chainId of options.chains) {\n if (!isValidChainId(chainId)) {\n throw new APIError(\n `Invalid chainId in chains array: ${chainId}. Must be a positive integer.`,\n { endpoint: \"/v1/earn-sdk/supported-assets-by-chains\" },\n );\n }\n }\n }\n\n // Validate yieldType\n if (options.yieldType !== undefined && !isValidYieldType(options.yieldType)) {\n throw new APIError(\n `Invalid yieldType: ${options.yieldType}. Must be one of: CORE, TREASURY, FRONTIER.`,\n { endpoint: \"/v1/earn-sdk/supported-assets-by-chains\" },\n );\n }\n\n // Validate address (cache-only filter)\n if (options.address !== undefined && !isValidAddress(options.address)) {\n throw new APIError(\n `Invalid address: ${options.address}. Must be a valid Ethereum address.`,\n { endpoint: \"/v1/earn-sdk/supported-assets-by-chains\" },\n );\n }\n\n // Validate symbol (cache-only filter)\n if (options.symbol !== undefined && typeof options.symbol !== \"string\") {\n throw new APIError(`Invalid symbol: ${options.symbol}. Must be a string.`, {\n endpoint: \"/v1/earn-sdk/supported-assets-by-chains\",\n });\n }\n}\n\n// ============================================================================\n// GRAPHQL DATA FETCHING\n// ============================================================================\n\n/**\n * Fetches vault and asset data from GraphQL (no cache)\n *\n * Internal function used by VaultCache._doRefresh(). Calls\n * fetchAmplifySdkConfigs() once and derives both vaults and assets\n * from the same response.\n *\n * @returns Object containing vaults and assets arrays\n * @throws {APIError} If the GraphQL request fails\n *\n * @internal\n */\nexport async function fetchVaultDataFromGraphQL(): Promise<{\n vaults: AmplifyVault[];\n assets: SupportedAsset[];\n}> {\n const endpoint = getGraphQLEndpoint();\n const response = await fetchAmplifySdkConfigs(endpoint);\n const configs = response.amplifySdkConfigs;\n\n const vaults = aggregateVaultConfigs(configs);\n const assets = extractSupportedAssetsFromConfigs(configs);\n\n return { vaults, assets };\n}\n\n// ============================================================================\n// FILTER HELPERS (module-internal)\n// ============================================================================\n\n/**\n * Applies vault filter options to a vault array\n */\nfunction applyVaultFilters(\n vaults: AmplifyVault[],\n options?: VaultFilterOptions,\n): AmplifyVault[] {\n if (!options) return vaults;\n\n let filtered = vaults;\n\n if (options.chainId !== undefined) {\n filtered = filtered.filter((v) => v.chainId === options.chainId);\n }\n\n if (options.yieldType) {\n filtered = filtered.filter((v) => v.yieldType === options.yieldType);\n }\n\n if (options.depositTokenAddress) {\n const normalized = options.depositTokenAddress.toLowerCase();\n filtered = filtered.filter((v) =>\n v.supportedAssets.some(\n (a) => a.address.toLowerCase() === normalized,\n ),\n );\n }\n\n return filtered;\n}\n\n/**\n * Applies asset filter options to an asset array\n */\nfunction applyAssetFilters(\n assets: SupportedAsset[],\n options?: AssetFilterOptions,\n): SupportedAsset[] {\n if (!options) return assets;\n\n let filtered = assets;\n\n if (options.chains !== undefined && options.chains.length > 0) {\n filtered = filtered.filter((asset) =>\n options.chains?.some((chainId) => asset.chains.includes(chainId)),\n );\n }\n\n if (options.address) {\n const normalizedAddress = options.address.toLowerCase();\n filtered = filtered.filter(\n (asset) => asset.address.toLowerCase() === normalizedAddress,\n );\n }\n\n if (options.symbol) {\n filtered = filtered.filter((asset) => asset.symbol === options.symbol);\n }\n\n return filtered;\n}\n\n// ============================================================================\n// CACHE-AWARE PUBLIC FUNCTIONS\n// ============================================================================\n\n/**\n * Gets vaults with cache-first strategy\n *\n * Checks the cache first and returns cached data if fresh.\n * Falls back to API via cache.refresh() when cache is empty or expired.\n * Filters are applied client-side on the cached data.\n *\n * @param options - Optional filter options for vault queries\n * @returns Promise resolving to array of AmplifyVault objects\n * @throws {APIError} If the request fails, times out, or returns invalid data\n *\n * @example\n * ```typescript\n * // Get all vaults (cache-first)\n * const allVaults = await getVaults();\n *\n * // Get CORE vaults on Ethereum (cache-first)\n * const ethCores = await getVaults({\n * chainId: 1,\n * yieldType: \"CORE\"\n * });\n *\n * // Get vaults accepting USDC (cache-first)\n * const usdcVaults = await getVaults({\n * depositTokenAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * });\n * ```\n */\nexport async function getVaults(\n options?: VaultFilterOptions,\n): Promise<AmplifyVault[]> {\n // Validate filter options (fail-fast, before cache check)\n validateVaultFilterOptions(options);\n\n const cache = getCache();\n\n // Refresh if cache is empty or expired\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n\n return applyVaultFilters(cache.getAllVaults(), options);\n}\n\n/**\n * Gets supported assets with cache-first strategy\n *\n * Checks the cache first and returns cached data if fresh.\n * Falls back to API via cache.refresh() when cache is empty or expired.\n *\n * Note: When `yieldType` filter is specified, bypasses cache and calls the\n * API directly because SupportedAsset objects don't have a yieldType field\n * (server-side filtering is required).\n *\n * @param options - Optional filter options for asset queries\n * @returns Promise resolving to array of SupportedAsset objects\n * @throws {APIError} If the request fails, times out, or returns invalid data\n *\n * @example\n * ```typescript\n * // Get all supported assets (cache-first)\n * const allAssets = await getSupportedAssets();\n *\n * // Get assets supported on Ethereum and Base (cache-first)\n * const ethAssets = await getSupportedAssets({\n * chains: [1, 8453]\n * });\n *\n * // Get CORE yield type assets (API call - yieldType bypass)\n * const coreAssets = await getSupportedAssets({\n * yieldType: \"CORE\"\n * });\n * ```\n */\nexport async function getSupportedAssets(\n options?: AssetFilterOptions,\n): Promise<SupportedAsset[]> {\n // Validate filter options (fail-fast, before cache check)\n validateAssetFilterOptions(options);\n\n const cache = getCache();\n\n // Refresh if cache is empty or expired\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n\n return applyAssetFilters(cache.getAllAssets(), options);\n}\n\n/**\n * Global cache instance\n * Initialized lazily on first use\n */\nlet globalCache: VaultCache | null = null;\n\n/**\n * Initializes the global vault cache\n *\n * Creates a new VaultCache instance with the specified TTL.\n * If a cache already exists, it will be replaced with a new instance.\n *\n * @param ttl - Time-to-live in milliseconds (default: 600000 = 10 minutes)\n * @returns The initialized VaultCache instance\n *\n * @example\n * ```typescript\n * // Initialize cache with default 10-minute TTL\n * const cache = initializeCache();\n *\n * // Initialize cache with custom 5-minute TTL\n * const customCache = initializeCache(300000);\n * ```\n */\nexport function initializeCache(ttl?: number): VaultCache {\n globalCache = new VaultCache(ttl);\n return globalCache;\n}\n\n/**\n * Gets the global vault cache instance\n *\n * If no cache exists, creates one with default TTL.\n *\n * @returns The global VaultCache instance\n */\nexport function getCache(): VaultCache {\n if (!globalCache) {\n globalCache = new VaultCache();\n }\n return globalCache;\n}\n\n/**\n * Manually refreshes the global vault cache\n *\n * Fetches fresh data from the API and updates the cache.\n * This is the public SDK method for cache refresh.\n *\n * @throws {APIError} If the API request fails\n *\n * @example\n * ```typescript\n * // Manually refresh cache\n * await refreshVaultCache();\n * ```\n */\nexport async function refreshVaultCache(): Promise<void> {\n const cache = getCache();\n await cache.refresh();\n}\n\n/**\n * Clears the global vault cache\n *\n * Removes all cached data and resets the cache state.\n * Used internally during SDK re-initialization.\n *\n * @example\n * ```typescript\n * // Clear cache\n * clearCache();\n * ```\n */\nexport function clearCache(): void {\n const cache = getCache();\n cache.clear();\n}\n\n/**\n * Gets vaults from cache with automatic refresh on expiry\n *\n * Delegates to getVaults() which now has cache-first behavior.\n * Retained for backward compatibility.\n *\n * @deprecated Use getVaults instead\n * @param options - Optional filter options for vault queries\n * @returns Promise resolving to array of AmplifyVault objects\n * @throws {APIError} If the request fails or returns invalid data\n */\nexport async function getVaultsFromCache(\n options?: VaultFilterOptions,\n): Promise<AmplifyVault[]> {\n return getVaults(options);\n}\n\n/**\n * Gets supported assets from cache with automatic refresh on expiry\n *\n * Delegates to getSupportedAssets() which now has cache-first behavior.\n * Retained for backward compatibility.\n *\n * @deprecated Use getSupportedAssets instead\n * @param options - Optional filter options for asset queries\n * @returns Promise resolving to array of SupportedAsset objects\n * @throws {APIError} If the request fails or returns invalid data\n */\nexport async function getAssetsFromCache(\n options?: AssetFilterOptions,\n): Promise<SupportedAsset[]> {\n return getSupportedAssets(options);\n}\n\n/**\n * Finds a vault by configuration criteria\n *\n * Resolves the correct vault using multi-criteria filtering based on:\n * - assetAddress: The asset token address (baseTokenAddress)\n * - yieldType: The yield strategy (CORE, TREASURY, FRONTIER)\n * - chainId: The blockchain network\n *\n * Automatically refreshes cache if expired.\n * Returns the first matching vault or null if no match found.\n *\n * @param params - Configuration parameters\n * @param params.assetAddress - Asset token address (viem Address)\n * @param params.yieldType - Yield strategy type (CORE, TREASURY, or FRONTIER)\n * @param params.chainId - Blockchain network ID\n * @returns Promise resolving to AmplifyVault or null if no match found\n * @throws {APIError} If parameters are invalid or API request fails\n *\n * @example\n * ```typescript\n * // Find CORE vault on Ethereum for USDC\n * const vault = await findVaultByConfig({\n * assetAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * yieldType: \"CORE\",\n * chainId: 1\n * });\n *\n * if (vault) {\n * console.log(\"Found vault:\", vault.id);\n * } else {\n * console.log(\"No matching vault found\");\n * }\n * ```\n */\nexport async function findVaultByConfig(params: {\n assetAddress: Address;\n yieldType: string;\n chainId: number;\n}): Promise<AmplifyVault | null> {\n // Validate input parameters\n if (!isValidAddress(params.assetAddress)) {\n throw new APIError(\n `Invalid assetAddress: ${params.assetAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"findVaultByConfig\" },\n );\n }\n\n if (!isValidYieldType(params.yieldType)) {\n throw new APIError(\n `Invalid yieldType: ${params.yieldType}. Must be one of: CORE, TREASURY, FRONTIER.`,\n { endpoint: \"findVaultByConfig\" },\n );\n }\n\n if (!isValidChainId(params.chainId)) {\n throw new APIError(\n `Invalid chainId: ${params.chainId}. Must be a positive integer.`,\n { endpoint: \"findVaultByConfig\" },\n );\n }\n\n const cache = getCache();\n\n // Refresh cache if expired\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n\n const normalizedAddress = params.assetAddress.toLowerCase();\n\n // Try cache lookup by asset address first\n let vaultsByToken = cache.getVault(params.assetAddress);\n if (!vaultsByToken) {\n vaultsByToken = cache.getVault(normalizedAddress);\n }\n\n // Fall back to scanning all vaults and matching against supportedAssets\n if (!vaultsByToken) {\n const allVaults = cache.getAllVaults();\n const matchingVaults = allVaults.filter((vault) =>\n vault.supportedAssets.some(\n (a) => a.address.toLowerCase() === normalizedAddress,\n ),\n );\n vaultsByToken = matchingVaults.length > 0 ? matchingVaults : undefined;\n }\n\n if (!vaultsByToken || vaultsByToken.length === 0) {\n return null;\n }\n\n const matchingVault = vaultsByToken.find(\n (vault) =>\n vault.yieldType === params.yieldType && vault.chainId === params.chainId,\n );\n\n return matchingVault || null;\n}\n\n/**\n * Filter options for getVaultsByConfig\n */\nexport interface GetVaultsByConfigParams {\n yieldType?: YieldType;\n chainId?: number;\n depositAssetAddress?: Address;\n withdrawAssetAddress?: Address;\n settlementAssetAddress?: Address;\n}\n\n/**\n * Returns vaults matching the provided configuration filters.\n *\n * Results are automatically scoped to the organization associated with\n * the API key the SDK was initialized with (enterprise filtering is\n * handled server-side by the amplifySdkConfigs resolver).\n */\nexport async function getVaultsByConfig(\n params?: GetVaultsByConfigParams,\n): Promise<AmplifyVault[]> {\n const cache = getCache();\n\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n\n let vaults = cache.getAllVaults();\n\n if (params?.yieldType) {\n if (!isValidYieldType(params.yieldType)) {\n throw new APIError(\n `Invalid yieldType: ${params.yieldType}. Must be one of: CORE, TREASURY, FRONTIER.`,\n { endpoint: \"getVaultsByConfig\" },\n );\n }\n vaults = vaults.filter((v) => v.yieldType === params.yieldType);\n }\n\n if (params?.chainId !== undefined) {\n if (!isValidChainId(params.chainId)) {\n throw new APIError(\n `Invalid chainId: ${params.chainId}. Must be a positive integer.`,\n { endpoint: \"getVaultsByConfig\" },\n );\n }\n vaults = vaults.filter((v) => v.chainId === params.chainId);\n }\n\n if (params?.depositAssetAddress) {\n if (!isValidAddress(params.depositAssetAddress)) {\n throw new APIError(\n `Invalid depositAssetAddress: ${params.depositAssetAddress}.`,\n { endpoint: \"getVaultsByConfig\" },\n );\n }\n const normalized = params.depositAssetAddress.toLowerCase();\n vaults = vaults.filter((v) =>\n v.supportedAssets.some(\n (a) => a.address.toLowerCase() === normalized,\n ),\n );\n }\n\n if (params?.withdrawAssetAddress) {\n if (!isValidAddress(params.withdrawAssetAddress)) {\n throw new APIError(\n `Invalid withdrawAssetAddress: ${params.withdrawAssetAddress}.`,\n { endpoint: \"getVaultsByConfig\" },\n );\n }\n const normalized = params.withdrawAssetAddress.toLowerCase();\n vaults = vaults.filter((v) =>\n v.supportedAssets.some(\n (a) =>\n a.withdrawable !== false &&\n a.address.toLowerCase() === normalized,\n ),\n );\n }\n\n if (params?.settlementAssetAddress) {\n if (!isValidAddress(params.settlementAssetAddress)) {\n throw new APIError(\n `Invalid settlementAssetAddress: ${params.settlementAssetAddress}.`,\n { endpoint: \"getVaultsByConfig\" },\n );\n }\n const normalized = params.settlementAssetAddress.toLowerCase();\n vaults = vaults.filter((v) =>\n v.supportedAssets.some(\n (a) => a.address.toLowerCase() === normalized,\n ),\n );\n }\n\n return vaults;\n}\n\n/**\n * Gets supported assets grouped by token with available vaults\n *\n * Fetches and caches vault data, then transforms it into WithdrawSupportedAsset objects.\n * Each asset shows all vaults that support withdrawals of that token.\n *\n * Automatically populates cache on first call if empty.\n * Reuses cached data on subsequent calls (if not expired).\n *\n * @returns Promise resolving to array of WithdrawSupportedAsset objects\n * @throws {APIError} If the API request fails or returns invalid data\n *\n * @example\n * ```typescript\n * // Get all supported assets with available vaults\n * const assets = await getWithdrawSupportedAssets();\n *\n * // Display options to user\n * for (const asset of assets) {\n * console.log(`${asset.symbol}: ${asset.vaults.length} vaults available`);\n * for (const vault of asset.vaults) {\n * console.log(` - ${vault.yieldType} on chain ${vault.chainId}`);\n * }\n * }\n * ```\n */\nexport async function getWithdrawSupportedAssets(): Promise<\n WithdrawSupportedAsset[]\n> {\n const cache = getCache();\n\n // Cache is initialized in getCache() if not already present\n\n if (cache.isEmpty() || cache.isExpired()) {\n await cache.refresh();\n }\n\n // Get all vaults and assets from cache\n const vaults = cache.getAllVaults();\n const assets = cache.getAllAssets();\n\n // T050-T051: Transform grouped vaults into WithdrawSupportedAsset objects\n const result: WithdrawSupportedAsset[] = [];\n\n // Create a map of asset addresses to asset data for quick lookup\n const assetMap = new Map<string, SupportedAsset>();\n for (const asset of assets) {\n assetMap.set(asset.address.toLowerCase(), asset);\n }\n\n // Group vaults by each supported asset address\n const assetVaultMap = new Map<\n string,\n Array<{\n id: string;\n yieldType: YieldType;\n chainId: number;\n vaultId: string;\n }>\n >();\n\n for (const vault of vaults) {\n for (const asset of vault.supportedAssets) {\n const assetAddress = asset.address.toLowerCase();\n\n if (!assetVaultMap.has(assetAddress)) {\n assetVaultMap.set(assetAddress, []);\n }\n\n assetVaultMap.get(assetAddress)?.push({\n id: vault.id,\n yieldType: vault.yieldType,\n chainId: vault.chainId,\n vaultId: vault.id,\n });\n }\n }\n\n // Transform to WithdrawSupportedAsset array\n for (const [assetAddress, vaultsData] of assetVaultMap.entries()) {\n const asset = assetMap.get(assetAddress);\n if (asset) {\n // T053: Include token decimals in asset objects\n result.push({\n address: asset.address as `0x${string}`,\n symbol: asset.symbol,\n decimals: asset.decimals,\n vaults: vaultsData,\n });\n }\n }\n\n return result;\n}\n","import { defineChain } from \"viem\";\nimport type { Chain } from \"viem/chains\";\nimport { mainnet, sepolia } from \"viem/chains\";\n\nconst hyperEvm = defineChain({\n id: 999,\n name: \"HyperEVM\",\n nativeCurrency: {\n decimals: 18,\n name: \"Hyperliquid\",\n symbol: \"HYPE\",\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.hyperliquid.xyz/evm\"],\n webSocket: [\"wss://hyperliquid.drpc.org\"],\n },\n },\n blockExplorers: {\n default: { name: \"Explorer\", url: \"https://purrsec.com/\" },\n },\n contracts: {\n multicall3: {\n address: \"0xcA11bde05977b3631167028862bE2a173976CA11\",\n blockCreated: 13051,\n },\n },\n});\n\nconst stableTestnet = defineChain({\n id: 2201,\n name: \"Stable Testnet\",\n nativeCurrency: {\n decimals: 18,\n name: \"Ether\",\n symbol: \"ETH\",\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.testnet.stable.xyz\"],\n },\n },\n blockExplorers: {\n default: { name: \"Stablescan\", url: \"https://testnet.stablescan.xyz\" },\n },\n contracts: {\n multicall3: {\n address: \"0xcA11bde05977b3631167028862bE2a173976CA11\",\n blockCreated: 0,\n },\n },\n testnet: true,\n});\n\n/**\n * Mapping of chain IDs to chain names\n */\nexport const CHAIN_ID_TO_CHAIN_MAP: Record<number, Chain> = {\n [mainnet.id]: mainnet,\n [sepolia.id]: sepolia,\n [hyperEvm.id]: hyperEvm,\n [stableTestnet.id]: stableTestnet,\n} as const;\n\nexport { hyperEvm, mainnet, sepolia, stableTestnet };\nexport type { Chain };\n\n","import type { Chain } from \"viem/chains\";\nimport { getVaults } from \"../client/amplify-sdk-client\";\nimport { CHAIN_ID_TO_CHAIN_MAP } from \"../lib/viem/chains\";\nimport type { AmplifyVault } from \"../types/amplify-sdk-api\";\n\n/**\n * Flexible chain ID type that accepts both number and string\n */\nexport type ChainId = number | `${number}`;\n\n/**\n * Normalizes a ChainId to a number\n */\nexport function toChainId(value: ChainId): number {\n return typeof value === \"number\" ? value : Number(value);\n}\n\n// Cache to store PublicClient instances for different chains\nlet chainsCache: Map<number, Chain> | null = null;\n\n/**\n * Gets a chain object from the vault config response\n * @param chainId The chain ID to look up\n * @param config Optional config object. If not provided, will fetch from API\n * @returns Promise<Chain>\n */\nexport async function getChainFromConfig(\n chainId: number,\n config?: AmplifyVault[]\n): Promise<Chain> {\n // If we have a cache and no specific config was provided, use the cache\n if (chainsCache && !config) {\n const chain = chainsCache.get(Number(chainId));\n if (chain) {\n return chain;\n }\n }\n\n // If no config provided, fetch it\n const vaults = config ?? (await getVaults());\n const vault = vaults.find((v) => v.chainId === chainId);\n if (!vault) {\n throw new Error(`Vault not found for ID: ${chainId}`);\n }\n\n // If config is provided and no cache exists, update the cache synchronously with resolved chains\n if (config && !chainsCache) {\n // Populate cache with resolved Chain objects (not Promises)\n const cache = new Map<number, Chain>();\n for (const v of vaults) {\n const chainConfig = CHAIN_ID_TO_CHAIN_MAP[v.chainId];\n if (!chainConfig) {\n throw new Error(`Chain config not found for ID: ${v.chainId}`);\n }\n // NOTE: Include contracts property to ensure multicall3 is available\n cache.set(v.chainId, {\n id: v.chainId,\n name: chainConfig.name,\n nativeCurrency: chainConfig.nativeCurrency,\n rpcUrls: chainConfig.rpcUrls,\n contracts: chainConfig.contracts,\n });\n }\n chainsCache = cache;\n }\n\n const chain = chainsCache ? chainsCache.get(chainId) : undefined;\n if (!chain) {\n throw new Error(`Chain not found for ID: ${chainId}`);\n }\n return chain;\n}\n\n/**\n * Convert chain ID to chain name\n * @param chainId - The chain ID\n * @returns The chain name, or null if not found\n */\nexport function getChainNameById(chainId: number): string | null {\n return CHAIN_ID_TO_CHAIN_MAP[chainId]?.name || null;\n}\n\n/**\n * Clears the chains cache\n */\nexport function clearChainsCache(): void {\n chainsCache = null;\n}\n","import { createPublicClient, http, type PublicClient } from \"viem\";\nimport { getVaults } from \"../../client/amplify-sdk-client\";\nimport {\n type ChainId,\n getChainFromConfig,\n toChainId,\n} from \"../../utils/chain-utils\";\nimport { getLogger } from \"../logger.js\";\nimport { getRpcUrls } from \"../sdk-config.js\";\n\n// Cache to store PublicClient instances keyed by numeric chain ID\nconst clients: Map<number, PublicClient> = new Map();\n\n// Track which chains have already shown the public RPC warning\nconst warnedChains: Set<number> = new Set();\n\n/**\n * Gets or creates a PublicClient instance for the specified blockchain\n * @param chainId - The blockchain ID\n * @returns A PublicClient instance for interacting with the specified chain\n */\nconst getClient = async (chainId: ChainId): Promise<PublicClient> => {\n if (!chainId) {\n throw new Error(\"Chain ID is required\");\n }\n\n const numericChainId = toChainId(chainId);\n\n if (!clients.has(numericChainId)) {\n const chain = await getChainFromConfig(\n numericChainId,\n await getVaults()\n );\n\n const customRpcUrl = getRpcUrls()[numericChainId];\n\n if (!customRpcUrl && !warnedChains.has(numericChainId)) {\n warnedChains.add(numericChainId);\n getLogger().warn(\n `No custom RPC URL provided for chain ${numericChainId} (${chain.name}). Using default public RPC. Public RPCs may be unreliable — pass rpcUrls in initAmplifySDK() options for better reliability.`\n );\n }\n\n const rpcUrl = customRpcUrl ?? chain.rpcUrls.default.http[0];\n const client = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n clients.set(numericChainId, client);\n }\n\n const client = clients.get(numericChainId);\n if (!client) {\n throw new Error(`Client not found for chain ID ${chainId}`);\n }\n return client;\n};\n\n/**\n * Clears all cached PublicClient instances and warning state.\n * Called during SDK re-initialization to ensure new RPC URLs take effect.\n */\nfunction clearClients(): void {\n clients.clear();\n warnedChains.clear();\n}\n\nexport { clearClients, getClient };\n","/**\n * SDK Configuration Module\n *\n * Manages SDK initialization state and API key storage.\n * Provides core initialization function and helper utilities.\n */\n\nimport {\n clearCache,\n getCache,\n initializeCache,\n} from \"../client/amplify-sdk-client\";\nimport { APIError } from \"../types/amplify-sdk-api.js\";\nimport type {\n RequestHeaders,\n SDKConfig,\n SDKInitOptions,\n} from \"../types/sdk-config.js\";\nimport { getLogger, setLogger, setLogLevel } from \"./logger.js\";\nimport { initTelemetry, resetTelemetry } from \"./telemetry.js\";\nimport type { VaultCache } from \"./vault-cache.js\";\nimport { clearClients } from \"./viem/client.js\";\n\n/**\n * Constants for cache population\n */\nconst MAX_CACHE_RETRIES = 3;\nconst RETRY_DELAYS = [1000, 2000, 4000]; // Exponential backoff\n\n/**\n * Module-level SDK configuration state\n * Stores API key and initialization status\n */\nconst sdkConfig: SDKConfig = {\n apiKey: null,\n isInitialized: false,\n initializedAt: null,\n isInitializing: false,\n initPromise: null,\n telemetryEnabled: true,\n cachePopulationPromise: null,\n isCacheReady: false,\n rpcUrls: {},\n};\n\n/**\n * Error messages for initialization failures\n */\nconst ERROR_MESSAGES = {\n INVALID_API_KEY:\n \"Invalid API key format. Expected format: pxl_<type>_<string>\",\n EMPTY_API_KEY:\n \"API key cannot be empty. Provide a valid API key from Paxos Labs.\",\n AUTH_FAILED:\n \"Authentication failed: Invalid or expired API key. Verify your API key is correct and not expired.\",\n NETWORK_TIMEOUT:\n \"Initialization failed: Network timeout. Check your internet connection and retry.\",\n CACHE_INIT_FAILED: \"Failed to initialize cache. Retry or check API status.\",\n CONCURRENT_INIT:\n \"SDK initialization already in progress. Please wait for the current initialization to complete.\",\n UNKNOWN_ERROR:\n \"Unexpected initialization error. Contact support if issue persists.\",\n NOT_INITIALIZED:\n \"SDK not initialized. Call initAmplifySDK(apiKey) before using SDK functions. Get your API key at https://paxoslabs.com/developers\",\n};\n\n/**\n * Validate API key format\n *\n * @param apiKey - API key to validate\n * @throws {APIError} If API key is invalid\n */\nexport function validateAPIKey(apiKey: string): void {\n // Check for empty/null/undefined\n if (!apiKey || apiKey.trim().length === 0) {\n throw new APIError(ERROR_MESSAGES.EMPTY_API_KEY, {\n endpoint: \"initAmplifySDK\",\n statusCode: undefined,\n });\n }\n\n // Check minimum length\n if (apiKey.length < 10) {\n throw new APIError(ERROR_MESSAGES.INVALID_API_KEY, {\n endpoint: \"initAmplifySDK\",\n statusCode: undefined,\n });\n }\n\n // Optional: Warn if doesn't match expected prefix (non-blocking)\n if (!apiKey.startsWith(\"pxl_\")) {\n }\n}\n\n/**\n * Store API key in configuration\n *\n * @param apiKey - Validated API key to store\n */\nexport function setAPIKey(apiKey: string): void {\n sdkConfig.apiKey = apiKey;\n}\n\n/**\n * Retrieve stored API key\n *\n * @returns API key if set, null otherwise\n */\nexport function getAPIKey(): string | null {\n return sdkConfig.apiKey;\n}\n\n/**\n * Retrieve stored custom RPC URLs\n *\n * @returns Record mapping chain IDs to custom RPC URLs\n */\nexport function getRpcUrls(): Record<number, string> {\n return { ...sdkConfig.rpcUrls };\n}\n\n/**\n * Check if SDK is initialized\n *\n * @returns true if SDK has been initialized, false otherwise\n */\nexport function isInitialized(): boolean {\n return sdkConfig.isInitialized;\n}\n\n/**\n * Clear configuration state\n *\n * Resets all configuration to initial state.\n * Called before re-initialization with new API key.\n */\nexport function clearConfig(): void {\n sdkConfig.apiKey = null;\n sdkConfig.isInitialized = false;\n sdkConfig.initializedAt = null;\n sdkConfig.isInitializing = false;\n sdkConfig.initPromise = null;\n sdkConfig.telemetryEnabled = true;\n sdkConfig.cachePopulationPromise = null;\n sdkConfig.isCacheReady = false;\n sdkConfig.rpcUrls = {};\n clearClients();\n resetTelemetry();\n}\n\n/**\n * Generate request headers for API calls\n *\n * @returns Headers object with Content-Type and x-api-key auth\n */\nexport function getRequestHeaders(): RequestHeaders {\n const apiKey = getAPIKey();\n const headers: RequestHeaders = {\n \"Content-Type\": \"application/json\",\n };\n\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n\n return headers;\n}\n\n/**\n * Populates cache in background with retry logic\n *\n * - Runs in background (caller doesn't wait)\n * - Retries with exponential backoff on failure\n * - Logs errors but doesn't throw\n *\n * @param cache - VaultCache instance to populate\n */\nasync function populateCacheInBackground(cache: VaultCache): Promise<void> {\n const logger = getLogger();\n\n for (let attempt = 0; attempt < MAX_CACHE_RETRIES; attempt++) {\n try {\n await cache.refresh();\n sdkConfig.isCacheReady = true;\n logger.debug(\"Background cache population completed\", {\n attempt: attempt + 1,\n });\n return;\n } catch (error) {\n const isLastAttempt = attempt === MAX_CACHE_RETRIES - 1;\n\n if (isLastAttempt) {\n logger.warn(\n \"Background cache population failed after all retries, falling back to on-demand fetching\",\n {\n error: error instanceof Error ? error.message : String(error),\n attempts: MAX_CACHE_RETRIES,\n }\n );\n // Don't throw - SDK still works via on-demand fetching\n return;\n }\n\n logger.debug(\n `Cache population attempt ${attempt + 1} failed, retrying...`,\n {\n error: error instanceof Error ? error.message : String(error),\n nextRetryIn: RETRY_DELAYS[attempt],\n }\n );\n\n await new Promise((resolve) =>\n setTimeout(resolve, RETRY_DELAYS[attempt])\n );\n }\n }\n}\n\n/**\n * Returns true if cache is populated and ready\n *\n * Use this for synchronous checks of cache readiness.\n *\n * @returns true if cache has been successfully populated\n *\n * @example\n * ```typescript\n * if (isCacheReady()) {\n * // Cache is ready, operations will be fast\n * } else {\n * // Cache still loading, operations will fetch on-demand\n * }\n * ```\n */\nexport function isCacheReady(): boolean {\n return sdkConfig.isCacheReady;\n}\n\n/**\n * Waits for background cache population to complete\n *\n * Resolves immediately if cache is already ready.\n * If background population failed, triggers on-demand refresh.\n *\n * @returns Promise that resolves when cache is ready\n *\n * @example\n * ```typescript\n * await initAmplifySDK(apiKey);\n *\n * // Optional: wait for cache before operations\n * await waitForCacheReady();\n *\n * // Now operations are guaranteed to be fast\n * const tx = await prepareDeposit({...});\n * ```\n */\nexport async function waitForCacheReady(): Promise<void> {\n // Already ready\n if (sdkConfig.isCacheReady) {\n return;\n }\n\n // Wait for background population if in progress\n if (sdkConfig.cachePopulationPromise) {\n await sdkConfig.cachePopulationPromise;\n if (sdkConfig.isCacheReady) {\n return;\n }\n }\n\n // Background failed or never started - do on-demand refresh\n const cache = getCache();\n await cache.refresh();\n sdkConfig.isCacheReady = true;\n}\n\n/**\n * Initialize Amplify SDK with API key\n *\n * Validates API key format synchronously, then returns immediately\n * while cache and telemetry initialize in background. API key authentication\n * is validated by the background cache population and telemetry config fetch.\n * Use `waitForCacheReady()` if you need to ensure cache is populated before operations.\n *\n * @param apiKey - API key obtained from Paxos Labs\n * @param options - Optional configuration options\n * @param options.telemetry - Enable/disable telemetry (default: true)\n * @param options.logLevel - Console log level (default: LogLevel.ERROR)\n * @param options.logger - Custom logger implementation\n * @param options.rpcUrls - Custom RPC URLs per chain (e.g., `{ 1: \"https://my-eth-rpc.com\" }`)\n * @throws {APIError} If API key format is invalid\n *\n * @example\n * ```typescript\n * import { initAmplifySDK, waitForCacheReady } from \"@paxoslabs/amplify-sdk\";\n *\n * // Fast initialization (returns immediately, cache populates in background)\n * await initAmplifySDK(\"pxl_internal_your_api_key_here\");\n *\n * // Or with custom RPC URLs for better reliability\n * await initAmplifySDK(\"pxl_internal_your_api_key_here\", {\n * rpcUrls: {\n * 1: \"https://my-eth-rpc.com\",\n * 999: \"https://my-hyperEVM-rpc.com\",\n * },\n * });\n *\n * // Optional: wait for cache if you need guaranteed fast operations\n * await waitForCacheReady();\n *\n * // Now operations are fast (cache is ready)\n * const tx = await prepareDeposit({...});\n * ```\n */\nexport async function initAmplifySDK(\n apiKey: string,\n options?: SDKInitOptions\n): Promise<void> {\n // Validate API key format (synchronous, fast)\n validateAPIKey(apiKey);\n\n // Check if already initialized with same API key (idempotent)\n if (sdkConfig.isInitialized && sdkConfig.apiKey === apiKey) {\n // Apply updated rpcUrls if changed\n const nextRpcUrls = options?.rpcUrls ?? {};\n const hasRpcUrlChange =\n Object.keys(nextRpcUrls).length !==\n Object.keys(sdkConfig.rpcUrls).length ||\n Object.entries(nextRpcUrls).some(\n ([chainId, url]) => sdkConfig.rpcUrls[Number(chainId)] !== url\n );\n if (hasRpcUrlChange) {\n sdkConfig.rpcUrls = { ...nextRpcUrls };\n clearClients();\n }\n return;\n }\n\n // Check if already initializing\n if (sdkConfig.isInitializing && sdkConfig.initPromise) {\n // Wait for ongoing initialization to complete\n await sdkConfig.initPromise;\n return;\n }\n\n // Check if re-initializing with different API key\n if (sdkConfig.isInitialized && sdkConfig.apiKey !== apiKey) {\n // Clear existing state and cache\n clearConfig();\n clearCache();\n }\n\n // Apply logger options before any operations (so errors can be logged)\n if (options?.logger) {\n setLogger(options.logger);\n }\n if (options?.logLevel !== undefined) {\n setLogLevel(options.logLevel);\n }\n\n // Store telemetry preference\n sdkConfig.telemetryEnabled = options?.telemetry !== false;\n\n // Store custom RPC URLs\n sdkConfig.rpcUrls = options?.rpcUrls ?? {};\n\n // Mark as initializing\n sdkConfig.isInitializing = true;\n\n // Create initialization promise\n sdkConfig.initPromise = (async () => {\n try {\n // Store API key (needed for API calls)\n setAPIKey(apiKey);\n\n // Initialize cache structure\n const cache = initializeCache();\n\n // Mark as initialized BEFORE cache population (non-blocking init)\n sdkConfig.isInitialized = true;\n sdkConfig.initializedAt = new Date();\n sdkConfig.isCacheReady = false;\n\n // Start background cache population (non-blocking)\n // Retries up to 3 times with exponential backoff\n sdkConfig.cachePopulationPromise = populateCacheInBackground(cache);\n\n // Initialize telemetry (async, non-blocking)\n if (sdkConfig.telemetryEnabled) {\n initTelemetry(apiKey).catch(() => {\n // Silent failure - telemetry is optional\n });\n }\n\n getLogger().info(\n \"Amplify SDK initialized (cache populating in background)\"\n );\n } catch (error) {\n // Roll back on failure\n clearConfig();\n clearCache();\n\n // Re-throw error with context\n if (error instanceof APIError) {\n throw error;\n }\n\n // Wrap unexpected errors\n throw new APIError(ERROR_MESSAGES.UNKNOWN_ERROR, {\n endpoint: \"initAmplifySDK\",\n cause: error,\n });\n } finally {\n // Clear initialization state\n sdkConfig.isInitializing = false;\n sdkConfig.initPromise = null;\n }\n })();\n\n // Wait for initialization to complete (fast - no blocking network calls)\n await sdkConfig.initPromise;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { resolveVault, WithdrawQueueAbi } from './chunk-
|
|
2
|
-
import { getTokenPermitInfoWithAllowance, getErc20AllowanceWithDecimals, getRateInQuoteWithAssetDecimals, erc2612Abi, getErc20Decimals, BoringVaultAbi } from './chunk-
|
|
1
|
+
import { resolveVault, WithdrawQueueAbi } from './chunk-XA653JS3.mjs';
|
|
2
|
+
import { getTokenPermitInfoWithAllowance, getErc20AllowanceWithDecimals, getRateInQuoteWithAssetDecimals, erc2612Abi, getErc20Decimals, BoringVaultAbi } from './chunk-SXIBMN7X.mjs';
|
|
3
3
|
import { WAD } from './chunk-7RWWVUHP.mjs';
|
|
4
|
-
import { toChainId, APIError,
|
|
4
|
+
import { toChainId, APIError, getSupportedAssets, DEFAULT_APPROVAL_AMOUNT, DEFAULT_SLIPPAGE_BPS, getClient } from './chunk-MPCRFKSD.mjs';
|
|
5
5
|
import { formatUnits, parseUnits, erc20Abi, stringToHex, hexToSignature } from 'viem';
|
|
6
6
|
|
|
7
7
|
var isDepositSpendApproved = async ({
|
|
@@ -151,7 +151,7 @@ async function prepareApproveDepositTokenTxData({
|
|
|
151
151
|
{ endpoint: "prepareApproveDepositToken" }
|
|
152
152
|
);
|
|
153
153
|
}
|
|
154
|
-
const assets = await
|
|
154
|
+
const assets = await getSupportedAssets({ address: depositAsset });
|
|
155
155
|
if (assets.length === 0) {
|
|
156
156
|
throw new APIError(
|
|
157
157
|
`Asset metadata not found for token ${depositAsset} on chain ${normalizedChainId}`,
|
|
@@ -449,7 +449,7 @@ async function prepareDepositTxData(params) {
|
|
|
449
449
|
chainId: normalizedChainId,
|
|
450
450
|
callerEndpoint: "prepareDepositTransactionData"
|
|
451
451
|
});
|
|
452
|
-
const assets = await
|
|
452
|
+
const assets = await getSupportedAssets({ address: depositAsset });
|
|
453
453
|
const asset = assets.find((a) => a.chains.includes(normalizedChainId)) || assets.find((a) => a.address.toLowerCase() === depositAsset.toLowerCase());
|
|
454
454
|
if (!asset) {
|
|
455
455
|
throw new APIError(
|
|
@@ -776,7 +776,7 @@ async function prepareDepositWithPermitTxData(params) {
|
|
|
776
776
|
callerEndpoint: "prepareDepositWithPermitTxData"
|
|
777
777
|
});
|
|
778
778
|
let asset = null;
|
|
779
|
-
const assets = await
|
|
779
|
+
const assets = await getSupportedAssets({ address: depositAsset });
|
|
780
780
|
if (assets.length > 0) {
|
|
781
781
|
asset = assets.find((a) => a.chains.includes(normalizedChainId)) || assets[0] || null;
|
|
782
782
|
}
|
|
@@ -1407,5 +1407,5 @@ async function prepareWithdrawalAuthorization(params) {
|
|
|
1407
1407
|
}
|
|
1408
1408
|
|
|
1409
1409
|
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 };
|
|
1410
|
-
//# sourceMappingURL=chunk-
|
|
1411
|
-
//# sourceMappingURL=chunk-
|
|
1410
|
+
//# sourceMappingURL=chunk-B5BII2XH.mjs.map
|
|
1411
|
+
//# sourceMappingURL=chunk-B5BII2XH.mjs.map
|