@paxoslabs/amplify-sdk 0.4.1 → 0.4.2
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 +11 -0
- package/README.md +8 -0
- package/dist/{chunk-QKU5APOV.js → chunk-2YPKHXFJ.js} +120 -120
- package/dist/{chunk-QKU5APOV.js.map → chunk-2YPKHXFJ.js.map} +1 -1
- package/dist/{chunk-ZPIVBZLP.js → chunk-BQG3XKTU.js} +404 -371
- package/dist/chunk-BQG3XKTU.js.map +1 -0
- package/dist/{chunk-5FVJVJXC.mjs → chunk-GMMBJB4B.mjs} +7 -7
- package/dist/chunk-GMMBJB4B.mjs.map +1 -0
- package/dist/{chunk-VDNXXONH.js → chunk-OZJNKGW6.js} +59 -59
- package/dist/chunk-OZJNKGW6.js.map +1 -0
- package/dist/{chunk-SQ3YW6UK.mjs → chunk-RW7PZETN.mjs} +405 -371
- package/dist/chunk-RW7PZETN.mjs.map +1 -0
- package/dist/{chunk-PLWWBYSM.mjs → chunk-TPU2HZAX.mjs} +4 -4
- package/dist/{chunk-PLWWBYSM.mjs.map → chunk-TPU2HZAX.mjs.map} +1 -1
- package/dist/{chunk-Y55F4I3A.mjs → chunk-VZED4E3L.mjs} +5 -27
- package/dist/chunk-VZED4E3L.mjs.map +1 -0
- package/dist/{chunk-YTCO5BHT.js → chunk-WZXCJAKM.js} +12 -35
- package/dist/chunk-WZXCJAKM.js.map +1 -0
- package/dist/core.js +16 -16
- package/dist/core.mjs +4 -4
- package/dist/display.js +9 -9
- package/dist/display.mjs +3 -3
- package/dist/index.d.mts +28 -28
- package/dist/index.d.ts +28 -28
- package/dist/index.js +50 -58
- package/dist/index.mjs +4 -4
- package/dist/utils.js +7 -7
- package/dist/utils.mjs +2 -2
- package/dist/vaults.js +24 -24
- package/dist/vaults.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-5FVJVJXC.mjs.map +0 -1
- package/dist/chunk-SQ3YW6UK.mjs.map +0 -1
- package/dist/chunk-VDNXXONH.js.map +0 -1
- package/dist/chunk-Y55F4I3A.mjs.map +0 -1
- package/dist/chunk-YTCO5BHT.js.map +0 -1
- package/dist/chunk-ZPIVBZLP.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/telemetry.ts","../src/lib/logger.ts","../src/utils/fetch.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/vault-assets-client.ts","../src/client/vault-data-merger.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-BQG3XKTU.js","sourcesContent":["/**\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 * 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 * Environment Configuration\n *\n * Production URL constants and endpoint resolution.\n */\n\nconst 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 * 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.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 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 allVaults: AmplifyVault[] = [];\n for (const vaultArray of this.vaults.values()) {\n allVaults.push(...vaultArray);\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 } =\n await fetchVaultDataFromGraphQL();\n\n this.vaults.clear();\n this.assets.clear();\n\n for (const vault of vaults) {\n const tokenAddress = vault.vault.baseTokenAddress;\n const existing = this.vaults.get(tokenAddress);\n if (existing) {\n existing.push(vault);\n } else {\n this.vaults.set(tokenAddress, [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.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: Deposit token address (correlation key with SupportedAsset)\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 * Amplify vault configuration\n *\n * Represents a single vault with contract addresses, yield type, and supported deposit asset.\n * Multiple vaults can share the same baseTokenAddress (different chains/yield types).\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 * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * symbol: \"USDC\",\n * name: \"USD Coin\",\n * decimals: 6,\n * coinGeckoTokenId: \"usd-coin\"\n * }\n * };\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 /** Vault smart contract addresses */\n vault: VaultContracts;\n /** Supported deposit asset for this vault */\n supportedAssets: {\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/**\n * Supported asset (token) metadata\n *\n * Represents a cryptocurrency token with metadata and chain support.\n * Joins with AmplifyVault via address == AmplifyVault.vault.baseTokenAddress\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 (correlation key with AmplifyVault.vault.baseTokenAddress) */\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}\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`;\n\nconst DEPOSIT_TOKEN_FIELDS = `\n id\n address\n chainId\n name\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}\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\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 });\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} 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} 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 * Returns null if vault or depositTokenAddress is missing,\n * or if the yield type cannot be mapped.\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 return {\n id: config.id,\n chainId: config.chainId,\n yieldType,\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: {\n address: depositTokenAddress.address as Address,\n symbol: depositTokenAddress.name,\n name: depositTokenAddress.name,\n decimals: 0,\n },\n };\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 } else {\n assetMap.set(key, {\n address:\n config.depositTokenAddress.address as Address,\n symbol: config.depositTokenAddress.name,\n name: config.depositTokenAddress.name,\n 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 * REST Client for /v2/amplify/vaultAssets endpoint\n *\n * Fetches vault-asset pair data including depositable/withdrawable\n * flags and token metadata. Handles pagination automatically.\n *\n * @module client/vault-assets-client\n * @internal\n */\n\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\nimport { APIError } from \"../types/amplify-sdk-api\";\nimport type {\n VaultAssetEntry,\n VaultAssetsResponse,\n TokenMetadataEntry,\n} from \"../types/vault-assets-api\";\nimport {\n DEFAULT_TIMEOUT,\n createTimeoutSignal,\n} from \"../utils/fetch\";\n\nconst PAGE_SIZE = 100;\nconst MAX_PAGES = 50;\nconst ENDPOINT_PATH = \"/amplify/vaultAssets\";\n\n/**\n * Fetches all vault-asset data from the REST endpoint\n *\n * Handles pagination automatically, aggregating results\n * across pages until nextPageToken is null.\n *\n * @returns Aggregated VaultAssetsResponse with all pages merged\n * @throws {APIError} If the request fails\n *\n * @internal\n */\nexport async function fetchVaultAssets(): Promise<VaultAssetsResponse> {\n const baseUrl = getRestV2BaseURL();\n\n const allVaultAssets: VaultAssetEntry[] = [];\n let allTokenMetadata: Record<string, TokenMetadataEntry> =\n {};\n let pageToken: string | null = null;\n let pageCount = 0;\n\n do {\n let urlStr = `${baseUrl}${ENDPOINT_PATH}?pageSize=${PAGE_SIZE}`;\n if (pageToken) {\n urlStr += `&pageToken=${encodeURIComponent(pageToken)}`;\n }\n\n let response: Response;\n try {\n response = await fetch(urlStr, {\n method: \"GET\",\n headers: getRequestHeaders(),\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 \"vaultAssets request timed out\",\n { endpoint: ENDPOINT_PATH, cause: error }\n );\n }\n throw new APIError(\n `vaultAssets network error: ${error instanceof Error ? error.message : String(error)}`,\n { endpoint: ENDPOINT_PATH, cause: error }\n );\n }\n\n if (!response.ok) {\n throw new APIError(\n `vaultAssets HTTP error: ${response.status} ${response.statusText}`,\n {\n endpoint: ENDPOINT_PATH,\n statusCode: response.status,\n }\n );\n }\n\n let body: VaultAssetsResponse;\n try {\n body = await response.json();\n } catch (error) {\n throw new APIError(\n \"vaultAssets response is not valid JSON\",\n { endpoint: ENDPOINT_PATH, cause: error }\n );\n }\n\n allVaultAssets.push(...body.vaultAssets);\n allTokenMetadata = {\n ...allTokenMetadata,\n ...body.tokenMetadata,\n };\n pageToken = body.nextPageToken ?? null;\n pageCount++;\n\n if (pageCount >= MAX_PAGES && pageToken) {\n throw new APIError(\n `vaultAssets pagination safety limit reached (${pageCount} of ${MAX_PAGES} pages)`,\n {\n endpoint: ENDPOINT_PATH,\n statusCode: 0,\n cause: new Error(\n `Pagination exceeded ${MAX_PAGES} pages with nextPageToken still present`\n ),\n }\n );\n }\n } while (pageToken);\n\n return {\n vaultAssets: allVaultAssets,\n nextPageToken: null,\n tokenMetadata: allTokenMetadata,\n };\n}\n","/**\n * Vault Data Merger\n *\n * Merges GraphQL vault/asset data with REST vaultAssets data\n * to enrich metadata (decimals, name, symbol, coinGeckoId)\n * and add depositable/withdrawable flags.\n *\n * @module client/vault-data-merger\n * @internal\n */\n\nimport { getLogger } from \"../lib/logger\";\nimport type {\n AmplifyVault,\n SupportedAsset,\n} from \"../types/amplify-sdk-api\";\nimport type {\n TokenMetadataEntry,\n VaultAssetsResponse,\n} from \"../types/vault-assets-api\";\n\n/**\n * Builds a composite lookup key for vault-asset matching\n */\nfunction buildVaultAssetKey(\n boringVaultAddress: string,\n chainId: number,\n assetAddress: string\n): string {\n return `${boringVaultAddress.toLowerCase()}:${chainId}:${assetAddress.toLowerCase()}`;\n}\n\n/**\n * Builds a case-insensitive metadata lookup map\n */\nfunction buildMetadataMap(\n tokenMetadata: Record<string, TokenMetadataEntry>\n): Map<string, TokenMetadataEntry> {\n const map = new Map<string, TokenMetadataEntry>();\n for (const [address, metadata] of Object.entries(\n tokenMetadata\n )) {\n map.set(address.toLowerCase(), metadata);\n }\n return map;\n}\n\n/**\n * Enriches GraphQL vaults with REST vaultAssets data\n *\n * Matches vault-asset pairs using a composite key of\n * boringVaultAddress + chainId + assetAddress (all lowercase).\n * Enriches supportedAssets with token metadata and depositable/withdrawable flags.\n *\n * @param vaults - Vaults from GraphQL\n * @param vaultAssetsResponse - Response from /v2/amplify/vaultAssets\n * @returns Enriched vault array (new objects, inputs not mutated)\n */\nexport function enrichVaultsWithAssetData(\n vaults: AmplifyVault[],\n vaultAssetsResponse: VaultAssetsResponse\n): AmplifyVault[] {\n const logger = getLogger();\n\n const vaultAssetMap = new Map<\n string,\n { depositable: boolean; withdrawable: boolean }\n >();\n for (const entry of vaultAssetsResponse.vaultAssets) {\n const key = buildVaultAssetKey(\n entry.vaultAddress,\n entry.chainId,\n entry.assetAddress\n );\n vaultAssetMap.set(key, {\n depositable: entry.depositable,\n withdrawable: entry.withdrawable,\n });\n }\n\n const metadataMap = buildMetadataMap(\n vaultAssetsResponse.tokenMetadata\n );\n\n return vaults.map((vault) => {\n const assetAddress = vault.supportedAssets.address;\n const key = buildVaultAssetKey(\n vault.vault.boringVaultAddress,\n vault.chainId,\n assetAddress\n );\n\n const vaultAssetEntry = vaultAssetMap.get(key);\n const tokenMeta = metadataMap.get(\n assetAddress.toLowerCase()\n );\n\n if (!vaultAssetEntry && !tokenMeta) {\n logger.debug(\n `No vaultAssets match for vault ${vault.id}`\n );\n return vault;\n }\n\n return {\n ...vault,\n supportedAssets: {\n ...vault.supportedAssets,\n ...(tokenMeta && {\n symbol: tokenMeta.symbol,\n name: tokenMeta.name,\n decimals: Number.parseInt(\n tokenMeta.decimals,\n 10\n ),\n coinGeckoTokenId:\n tokenMeta.coin_gecko_id || undefined,\n }),\n ...(vaultAssetEntry && {\n depositable: vaultAssetEntry.depositable,\n withdrawable: vaultAssetEntry.withdrawable,\n }),\n },\n };\n });\n}\n\n/**\n * Enriches GraphQL assets with REST token metadata\n *\n * Matches assets by address (case-insensitive) in the tokenMetadata map.\n * Enriches with real decimals, name, symbol, and coinGeckoTokenId.\n *\n * @param assets - Assets from GraphQL\n * @param vaultAssetsResponse - Response from /v2/amplify/vaultAssets\n * @returns Enriched asset array (new objects, inputs not mutated)\n */\nexport function enrichAssetsWithMetadata(\n assets: SupportedAsset[],\n vaultAssetsResponse: VaultAssetsResponse\n): SupportedAsset[] {\n const metadataMap = buildMetadataMap(\n vaultAssetsResponse.tokenMetadata\n );\n\n return assets.map((asset) => {\n const tokenMeta = metadataMap.get(\n asset.address.toLowerCase()\n );\n if (!tokenMeta) {\n return asset;\n }\n\n return {\n ...asset,\n symbol: tokenMeta.symbol,\n name: tokenMeta.name,\n decimals: Number.parseInt(tokenMeta.decimals, 10),\n coinGeckoTokenId:\n tokenMeta.coin_gecko_id || undefined,\n };\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\";\nimport { getLogger } from \"../lib/logger\";\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 extractSupportedAssetsFromConfigs,\n mapGraphQLConfigToVault,\n} from \"./graphql-mapper\";\nimport { fetchVaultAssets } from \"./vault-assets-client\";\nimport {\n enrichAssetsWithMetadata,\n enrichVaultsWithAssetData,\n} from \"./vault-data-merger\";\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 logger = getLogger();\n\n // Fetch GraphQL (required) and REST vaultAssets (optional) in parallel\n const [graphqlResult, restResult] =\n await Promise.allSettled([\n fetchAmplifySdkConfigs(endpoint),\n fetchVaultAssets(),\n ]);\n\n // GraphQL must succeed\n if (graphqlResult.status === \"rejected\") {\n throw graphqlResult.reason;\n }\n\n const configs = graphqlResult.value.amplifySdkConfigs;\n\n let vaults: AmplifyVault[] = [];\n for (const config of configs) {\n const vault = mapGraphQLConfigToVault(config);\n if (vault) {\n vaults.push(vault);\n }\n }\n\n let assets =\n extractSupportedAssetsFromConfigs(configs);\n\n // Enrich with REST data if available (graceful fallback)\n if (restResult.status === \"fulfilled\") {\n vaults = enrichVaultsWithAssetData(\n vaults,\n restResult.value\n );\n assets = enrichAssetsWithMetadata(\n assets,\n restResult.value\n );\n logger.debug(\n \"Enriched vault data with vaultAssets metadata\"\n );\n } else {\n logger.warn(\n `Failed to fetch vaultAssets, using GraphQL-only data: ${\n restResult.reason instanceof Error\n ? restResult.reason.message\n : String(restResult.reason)\n }`\n );\n }\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(\n (v) => v.chainId === options.chainId\n );\n }\n\n if (options.yieldType) {\n filtered = filtered.filter(\n (v) => v.yieldType === options.yieldType\n );\n }\n\n if (options.depositTokenAddress) {\n filtered = filtered.filter(\n (v) =>\n v.vault.baseTokenAddress === options.depositTokenAddress\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) =>\n asset.chains.includes(chainId)\n )\n );\n }\n\n if (options.address) {\n const normalizedAddress = options.address.toLowerCase();\n filtered = filtered.filter(\n (asset) =>\n asset.address.toLowerCase() === normalizedAddress\n );\n }\n\n if (options.symbol) {\n filtered = filtered.filter(\n (asset) => asset.symbol === options.symbol\n );\n }\n\n return filtered;\n}\n\n// ============================================================================\n// CACHE-AWARE PUBLIC FUNCTIONS\n// ============================================================================\n\n/**\n * Fetches 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 * // Fetch all vaults (cache-first)\n * const allVaults = await fetchVaults();\n *\n * // Fetch CORE vaults on Ethereum (cache-first)\n * const ethCores = await fetchVaults({\n * chainId: 1,\n * yieldType: \"CORE\"\n * });\n *\n * // Fetch vaults accepting USDC (cache-first)\n * const usdcVaults = await fetchVaults({\n * depositTokenAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * });\n * ```\n */\nexport async function fetchVaults(\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 * Fetches 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 * // Fetch all supported assets (cache-first)\n * const allAssets = await fetchSupportedAssets();\n *\n * // Fetch assets supported on Ethereum and Base (cache-first)\n * const ethAssets = await fetchSupportedAssets({\n * chains: [1, 8453]\n * });\n *\n * // Fetch CORE yield type assets (API call - yieldType bypass)\n * const coreAssets = await fetchSupportedAssets({\n * yieldType: \"CORE\"\n * });\n * ```\n */\nexport async function fetchSupportedAssets(\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 fetchVaults() which now has cache-first behavior.\n * Retained for backward compatibility.\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 or returns invalid data\n */\nexport async function getVaultsFromCache(\n options?: VaultFilterOptions\n): Promise<AmplifyVault[]> {\n return fetchVaults(options);\n}\n\n/**\n * Gets supported assets from cache with automatic refresh on expiry\n *\n * Delegates to fetchSupportedAssets() which now has cache-first behavior.\n * Retained for backward compatibility.\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 or returns invalid data\n */\nexport async function getAssetsFromCache(\n options?: AssetFilterOptions\n): Promise<SupportedAsset[]> {\n return fetchSupportedAssets(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 // Get vaults by deposit token address from cache\n // Note: depositTokenAddress needs to be normalized for cache lookup\n // Try both the provided address and lowercase version\n const normalizedAddress = params.assetAddress.toLowerCase();\n let vaultsByToken = cache.getVault(params.assetAddress);\n\n // If not found with the exact case, try normalized (lowercase)\n if (!vaultsByToken) {\n vaultsByToken = cache.getVault(normalizedAddress);\n }\n\n // If still not found, check all vaults and find by case-insensitive address\n if (!vaultsByToken) {\n const allVaults = cache.getAllVaults();\n const matchingVaults = allVaults.filter(\n (vault) =>\n vault.vault.baseTokenAddress.toLowerCase() === normalizedAddress\n );\n vaultsByToken = matchingVaults.length > 0 ? matchingVaults : undefined;\n }\n\n if (!vaultsByToken || vaultsByToken.length === 0) {\n return null;\n }\n\n // Filter by yieldType and chainId\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 * 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 asset address (baseTokenAddress)\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 const assetAddress = vault.vault.baseTokenAddress.toLowerCase();\n\n if (!assetVaultMap.has(assetAddress)) {\n assetVaultMap.set(assetAddress, []);\n }\n\n // T052: Include vault metadata (yieldType, chainId, vaultId)\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 // 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 { fetchVaults } 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 fetchVaults());\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 { fetchVaults } 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 fetchVaults()\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 (if initialized)\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
1
|
import { WithdrawQueueAbi } from './chunk-CQZCGPZK.mjs';
|
|
2
|
-
import { getRateInQuoteWithAssetDecimals, getErc20Decimals
|
|
2
|
+
import { getRateInQuoteWithAssetDecimals, getErc20Decimals } from './chunk-VZED4E3L.mjs';
|
|
3
3
|
import { calculateExpectedSharesMinted } from './chunk-7RWWVUHP.mjs';
|
|
4
|
-
import { toChainId, findVaultByConfig, APIError, isValidAddress, getRestV2BaseURL,
|
|
4
|
+
import { toChainId, findVaultByConfig, APIError, isValidAddress, getRestV2BaseURL, DEFAULT_TIMEOUT, getRequestHeaders, getClient } from './chunk-RW7PZETN.mjs';
|
|
5
5
|
import { parseUnits } from 'viem';
|
|
6
6
|
|
|
7
7
|
async function getMinimumMint(params) {
|
|
@@ -88,7 +88,7 @@ async function getVaultAPY(params) {
|
|
|
88
88
|
orderByTimestamp: "desc",
|
|
89
89
|
pageSize: "1"
|
|
90
90
|
});
|
|
91
|
-
const url = `${getRestV2BaseURL(
|
|
91
|
+
const url = `${getRestV2BaseURL()}/amplify/vaultApys?${queryParams.toString()}`;
|
|
92
92
|
const controller = new AbortController();
|
|
93
93
|
const timeout = setTimeout(
|
|
94
94
|
() => controller.abort(),
|
|
@@ -151,7 +151,7 @@ async function getVaultTVL(params) {
|
|
|
151
151
|
orderByTimestamp: "desc",
|
|
152
152
|
pageSize: "1"
|
|
153
153
|
});
|
|
154
|
-
const url = `${getRestV2BaseURL(
|
|
154
|
+
const url = `${getRestV2BaseURL()}/amplify/vaultTvls?${queryParams.toString()}`;
|
|
155
155
|
const controller = new AbortController();
|
|
156
156
|
const timeout = setTimeout(
|
|
157
157
|
() => controller.abort(),
|
|
@@ -257,7 +257,7 @@ async function getWithdrawalRequests(params) {
|
|
|
257
257
|
queryParams.set("pageSize", String(params.pageSize));
|
|
258
258
|
if (params.pageToken)
|
|
259
259
|
queryParams.set("pageToken", params.pageToken);
|
|
260
|
-
const url = `${getRestV2BaseURL(
|
|
260
|
+
const url = `${getRestV2BaseURL()}/amplify/withdrawalRequests?${queryParams.toString()}`;
|
|
261
261
|
const controller = new AbortController();
|
|
262
262
|
const timeout = setTimeout(
|
|
263
263
|
() => controller.abort(),
|
|
@@ -448,5 +448,5 @@ async function getMinimumWithdrawalOrderSize(params) {
|
|
|
448
448
|
}
|
|
449
449
|
|
|
450
450
|
export { getMinimumMint, getMinimumWithdrawalOrderSize, getVaultAPY, getVaultTVL, getWithdrawalFee, getWithdrawalRequests };
|
|
451
|
-
//# sourceMappingURL=chunk-
|
|
452
|
-
//# sourceMappingURL=chunk-
|
|
451
|
+
//# sourceMappingURL=chunk-GMMBJB4B.mjs.map
|
|
452
|
+
//# sourceMappingURL=chunk-GMMBJB4B.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/display/deposit-display.ts","../src/display/vault-display.ts","../src/abi/fee-module-abi.ts","../src/display/withdrawal-display.ts"],"names":["parseUnits"],"mappings":"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","file":"chunk-GMMBJB4B.mjs","sourcesContent":["/**\n * @file Deposit display helpers\n * @module display/deposit-display\n */\n\nimport { parseUnits } from \"viem\";\nimport { getRateInQuoteWithAssetDecimals } from \"../api/accountant\";\nimport { getErc20Decimals } from \"../api/erc20\";\nimport { findVaultByConfig } from \"../client/amplify-sdk-client\";\nimport { APIError } from \"../types/amplify-sdk-api\";\nimport { calculateExpectedSharesMinted } from \"../utils/bigint\";\nimport { toChainId } from \"../utils/chain-utils\";\nimport type { GetMinimumMintParams, MinimumMintResult } from \"./types\";\n\n/**\n * Calculates the expected vault shares a user will receive for a deposit\n *\n * Uses the on-chain exchange rate from the Accountant contract to calculate\n * how many vault shares will be minted for a given deposit amount.\n *\n * @param params - Deposit parameters\n * @returns Expected shares, exchange rate, and decimal info\n * @throws {APIError} If vault not found or contract read fails\n *\n * @example\n * ```typescript\n * const result = await getMinimumMint({\n * yieldType: \"CORE\",\n * chainId: 1,\n * depositAssetAddress: \"0xA0b8...\", // USDC\n * depositAmount: \"1000.0\",\n * });\n * console.log(result.expectedShares);\n * ```\n */\nexport async function getMinimumMint(\n params: GetMinimumMintParams\n): Promise<MinimumMintResult> {\n try {\n const normalizedChainId = toChainId(params.chainId);\n\n const config = await findVaultByConfig({\n assetAddress: params.depositAssetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.depositAssetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n if (!config.vault.accountantAddress) {\n throw new APIError(\n `Accountant contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n // Get exchange rate and asset decimals via multicall\n const rateResults = await getRateInQuoteWithAssetDecimals({\n assetAddress: params.depositAssetAddress,\n accountantAddress: config.vault.accountantAddress,\n chainId: normalizedChainId,\n });\n const [assetDecimalsResult, exchangeRateResult] = rateResults;\n if (assetDecimalsResult.status === \"failure\" || exchangeRateResult.status === \"failure\") {\n throw new APIError(\n `Failed to get exchange rate or asset decimals: ${assetDecimalsResult.error?.message || exchangeRateResult.error?.message\n }`,\n { endpoint: \"getMinimumMint\" }\n );\n }\n\n const assetDecimals = assetDecimalsResult.result;\n const exchangeRate = exchangeRateResult.result;\n\n // Get vault share decimals\n const shareDecimals = await getErc20Decimals({\n tokenAddress: config.vault.boringVaultAddress,\n chainId: normalizedChainId,\n });\n\n // Parse deposit amount using asset decimals\n const depositAmountBigInt = parseUnits(\n params.depositAmount,\n assetDecimals\n );\n\n // Calculate expected shares\n const expectedShares = calculateExpectedSharesMinted(\n depositAmountBigInt,\n exchangeRate,\n shareDecimals\n );\n\n return {\n expectedShares,\n exchangeRate,\n shareDecimals,\n assetDecimals,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to calculate minimum mint: ${error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getMinimumMint\", cause: error }\n );\n }\n}\n","/**\n * @file Vault display helpers\n * @module display/vault-display\n */\n\nimport type { Address } from \"viem\";\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\nimport { APIError, isValidAddress } from \"../types/amplify-sdk-api\";\nimport { DEFAULT_TIMEOUT } from \"../utils/fetch\";\nimport type {\n GetVaultAPYParams,\n GetVaultTVLParams,\n VaultAPYResult,\n VaultTVLResult,\n} from \"./types\";\n\n/**\n * Fetches the latest APY for a vault from the backend API\n *\n * Requests the most recent APY data point by using\n * orderByTimestamp=desc with pageSize=1.\n *\n * @param params - Vault identifier parameters\n * @returns Latest APY value and metadata\n * @throws {APIError} If the API request fails or no data found\n *\n * @example\n * ```typescript\n * const result = await getVaultAPY({\n * vaultAddress: \"0x1234...\",\n * });\n * console.log(result.apyFormatted); // \"4.50%\"\n * ```\n */\nexport async function getVaultAPY(\n params: GetVaultAPYParams\n): Promise<VaultAPYResult> {\n try {\n if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getVaultAPY\" }\n );\n }\n\n const queryParams = new URLSearchParams({\n filter: `vaultAddress=${params.vaultAddress}`,\n orderByTimestamp: \"desc\",\n pageSize: \"1\",\n });\n\n const url = `${getRestV2BaseURL()}/amplify/vaultApys?${queryParams.toString()}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n DEFAULT_TIMEOUT\n );\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new APIError(\n `Failed to fetch vault APY: ${response.status} ${response.statusText}`,\n { endpoint: \"getVaultAPY\", statusCode: response.status }\n );\n }\n\n const data = (await response.json()) as {\n vaultApys: Array<{\n vaultAddress: string;\n timestamp: string;\n interval: string;\n apy: string;\n }>;\n nextPageToken: string | null;\n };\n\n if (!data.vaultApys || data.vaultApys.length === 0) {\n throw new APIError(\n `No APY data found for vault ${params.vaultAddress}`,\n { endpoint: \"getVaultAPY\" }\n );\n }\n\n const latest = data.vaultApys[0];\n const apyNumber = Number.parseFloat(latest.apy);\n\n return {\n apy: apyNumber,\n apyFormatted: `${apyNumber.toFixed(2)}%`,\n vaultAddress: latest.vaultAddress as Address,\n timestamp: latest.timestamp,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to fetch vault APY: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getVaultAPY\", cause: error }\n );\n }\n}\n\n/**\n * Fetches the current TVL for a vault from the backend API\n *\n * Requests the most recent TVL data point by using\n * includeCurrent=true, orderByTimestamp=desc with pageSize=1.\n *\n * @param params - Vault identifier parameters\n * @returns Current TVL value and metadata\n * @throws {APIError} If the API request fails or no data found\n *\n * @example\n * ```typescript\n * const result = await getVaultTVL({\n * vaultAddress: \"0x1234...\",\n * });\n * console.log(result.tvl, result.tvlAsset);\n * ```\n */\nexport async function getVaultTVL(\n params: GetVaultTVLParams\n): Promise<VaultTVLResult> {\n try {\n if (!isValidAddress(params.vaultAddress)) {\n throw new APIError(\n `Invalid vaultAddress: ${params.vaultAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getVaultTVL\" }\n );\n }\n\n const filterParts = [\n `vaultAddress=${params.vaultAddress}`,\n ];\n if (params.chainId !== undefined) {\n filterParts.push(`chainId=${params.chainId}`);\n }\n\n const queryParams = new URLSearchParams({\n filter: filterParts.join(\" AND \"),\n includeCurrent: \"true\",\n orderByTimestamp: \"desc\",\n pageSize: \"1\",\n });\n\n const url = `${getRestV2BaseURL()}/amplify/vaultTvls?${queryParams.toString()}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n DEFAULT_TIMEOUT\n );\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new APIError(\n `Failed to fetch vault TVL: ${response.status} ${response.statusText}`,\n { endpoint: \"getVaultTVL\", statusCode: response.status }\n );\n }\n\n const data = (await response.json()) as {\n vaultTvls: Array<{\n vaultAddress: string;\n chainId: number;\n timestamp: string;\n interval: string;\n tvl: string;\n tvlAsset: string;\n }>;\n nextPageToken: string | null;\n };\n\n if (!data.vaultTvls || data.vaultTvls.length === 0) {\n throw new APIError(\n `No TVL data found for vault ${params.vaultAddress}`,\n { endpoint: \"getVaultTVL\" }\n );\n }\n\n const latest = data.vaultTvls[0];\n\n return {\n tvl: latest.tvl,\n tvlAsset: latest.tvlAsset,\n vaultAddress: latest.vaultAddress as Address,\n chainId: latest.chainId,\n timestamp: latest.timestamp,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to fetch vault TVL: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getVaultTVL\", cause: error }\n );\n }\n}\n","export const FeeModuleAbi = [\n {\n inputs: [\n { internalType: \"uint256\", name: \"_offerFeePercentage\", type: \"uint256\" },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [\n { internalType: \"uint256\", name: \"feePercentage\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"maxAllowed\", type: \"uint256\" },\n ],\n name: \"FeePercentageTooHigh\",\n type: \"error\",\n },\n {\n inputs: [\n { internalType: \"uint256\", name: \"amount\", type: \"uint256\" },\n { internalType: \"contract IERC20\", name: \"offerAsset\", type: \"address\" },\n { internalType: \"contract IERC20\", name: \"wantAsset\", type: \"address\" },\n { internalType: \"address\", name: \"receiver\", type: \"address\" },\n ],\n name: \"calculateOfferFees\",\n outputs: [{ internalType: \"uint256\", name: \"feeAmount\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"offerFeePercentage\",\n outputs: [{ internalType: \"uint256\", name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","/**\n * @file Withdrawal display helpers\n * @module display/withdrawal-display\n */\n\nimport { type Address, parseUnits } from \"viem\";\nimport { FeeModuleAbi } from \"../abi/fee-module-abi\";\nimport { WithdrawQueueAbi } from \"../abi/withdraw-queue-abi\";\nimport { getErc20Decimals } from \"../api/erc20\";\nimport { findVaultByConfig } from \"../client/amplify-sdk-client\";\nimport { getRestV2BaseURL } from \"../constants/environment\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\nimport { getClient } from \"../lib/viem/client\";\nimport { APIError } from \"../types/amplify-sdk-api\";\nimport { isValidAddress } from \"../types/amplify-sdk-api\";\nimport { DEFAULT_TIMEOUT } from \"../utils/fetch\";\nimport { toChainId } from \"../utils/chain-utils\";\nimport type {\n GetMinimumWithdrawalOrderSizeParams,\n GetWithdrawalFeeParams,\n GetWithdrawalRequestsParams,\n MinimumWithdrawalOrderSizeResult,\n WithdrawalFeeResult,\n WithdrawalRequest,\n WithdrawalRequestsResult,\n} from \"./types\";\n\n/**\n * Builds a filter string from typed params for the v2 API\n */\nfunction buildFilterString(\n params: Record<string, string | number | boolean | undefined>\n): string {\n return Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${k}=${v}`)\n .join(\" AND \");\n}\n\n/**\n * Fetches a user's withdrawal requests from the backend API\n *\n * @param params - Filter parameters for withdrawal requests\n * @returns Paginated list of withdrawal requests\n * @throws {APIError} If the API request fails or parameters are invalid\n *\n * @example\n * ```typescript\n * const result = await getWithdrawalRequests({\n * userAddress: \"0x1234...\",\n * status: \"PENDING\",\n * chainId: 1,\n * });\n * console.log(result.withdrawalRequests);\n * ```\n */\nexport async function getWithdrawalRequests(\n params: GetWithdrawalRequestsParams\n): Promise<WithdrawalRequestsResult> {\n try {\n if (!isValidAddress(params.userAddress)) {\n throw new APIError(\n `Invalid userAddress: ${params.userAddress}. Must be a valid Ethereum address.`,\n { endpoint: \"getWithdrawalRequests\" }\n );\n }\n\n const filter = buildFilterString({\n userAddress: params.userAddress,\n chainId: params.chainId,\n vaultAddress: params.vaultAddress,\n status: params.status,\n });\n\n const queryParams = new URLSearchParams();\n if (filter) queryParams.set(\"filter\", filter);\n if (params.pageSize)\n queryParams.set(\"pageSize\", String(params.pageSize));\n if (params.pageToken)\n queryParams.set(\"pageToken\", params.pageToken);\n\n const url = `${getRestV2BaseURL()}/amplify/withdrawalRequests?${queryParams.toString()}`;\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n DEFAULT_TIMEOUT\n );\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n throw new APIError(\n `Failed to fetch withdrawal requests: ${response.status} ${response.statusText}`,\n {\n endpoint: \"getWithdrawalRequests\",\n statusCode: response.status,\n }\n );\n }\n\n const data = (await response.json()) as {\n withdrawalRequests: WithdrawalRequest[];\n nextPageToken: string | null;\n };\n\n return {\n withdrawalRequests: data.withdrawalRequests ?? [],\n nextPageToken: data.nextPageToken ?? null,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to fetch withdrawal requests: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getWithdrawalRequests\", cause: error }\n );\n }\n}\n\n/**\n * Reads the withdrawal fee from the on-chain FeeModule contract\n *\n * Performs two sequential RPC calls:\n * 1. Reads the FeeModule address from WithdrawQueue.feeModule()\n * 2. Multicalls calculateOfferFees + offerFeePercentage on the FeeModule\n *\n * @param params - Parameters for fee calculation\n * @returns Fee amount and fee percentage\n * @throws {APIError} If vault not found or contract read fails\n *\n * @example\n * ```typescript\n * const fee = await getWithdrawalFee({\n * yieldType: \"CORE\",\n * chainId: 1,\n * assetAddress: \"0xA0b8...\", // USDC\n * amount: \"1.0\",\n * offerAsset: \"0x1234...\", // vault shares\n * wantAsset: \"0xA0b8...\", // USDC\n * receiver: \"0x5678...\",\n * });\n * console.log(fee.feeAmount, fee.feePercentage);\n * ```\n */\nexport async function getWithdrawalFee(\n params: GetWithdrawalFeeParams\n): Promise<WithdrawalFeeResult> {\n try {\n const normalizedChainId = toChainId(params.chainId);\n\n const config = await findVaultByConfig({\n assetAddress: params.assetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.assetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n const client = await getClient(normalizedChainId);\n\n // Step 1: Read the FeeModule address from WithdrawQueue\n const feeModuleAddress = (await client.readContract({\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: \"feeModule\",\n })) as Address;\n\n // Get share decimals to parse the amount\n const shareDecimals = await getErc20Decimals({\n tokenAddress: config.vault.boringVaultAddress,\n chainId: normalizedChainId,\n });\n\n const amountBigInt = parseUnits(params.amount, shareDecimals);\n\n // Step 2: Multicall calculateOfferFees + offerFeePercentage\n const results = await client.multicall({\n contracts: [\n {\n abi: FeeModuleAbi,\n address: feeModuleAddress,\n functionName: \"calculateOfferFees\",\n args: [\n amountBigInt,\n params.offerAsset,\n params.wantAsset,\n params.receiver,\n ],\n },\n {\n abi: FeeModuleAbi,\n address: feeModuleAddress,\n functionName: \"offerFeePercentage\",\n },\n ],\n });\n\n const [feeAmountResult, feePercentageResult] = results;\n\n if (\n feeAmountResult.status === \"failure\" ||\n feePercentageResult.status === \"failure\"\n ) {\n throw new APIError(\n \"Failed to read fee data from FeeModule contract\",\n { endpoint: \"getWithdrawalFee\" }\n );\n }\n\n return {\n feeAmount: feeAmountResult.result,\n feePercentage: feePercentageResult.result,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to get withdrawal fee: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getWithdrawalFee\", cause: error }\n );\n }\n}\n\n/**\n * Reads the minimum withdrawal order size from the WithdrawQueue contract\n *\n * @param params - Parameters to identify the vault\n * @returns Minimum order size in vault shares and share decimals\n * @throws {APIError} If vault not found or contract read fails\n *\n * @example\n * ```typescript\n * const result = await getMinimumWithdrawalOrderSize({\n * yieldType: \"CORE\",\n * chainId: 1,\n * assetAddress: \"0xA0b8...\",\n * });\n * console.log(result.minimumOrderSize, result.shareDecimals);\n * ```\n */\nexport async function getMinimumWithdrawalOrderSize(\n params: GetMinimumWithdrawalOrderSizeParams\n): Promise<MinimumWithdrawalOrderSizeResult> {\n try {\n const normalizedChainId = toChainId(params.chainId);\n\n const config = await findVaultByConfig({\n assetAddress: params.assetAddress,\n yieldType: params.yieldType,\n chainId: normalizedChainId,\n });\n\n if (!config) {\n throw new APIError(\n `No vault found for asset ${params.assetAddress} with yield type '${params.yieldType}' on chain ${normalizedChainId}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n if (!config.vault.withdrawQueueAddress) {\n throw new APIError(\n `WithdrawQueue contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n if (!config.vault.boringVaultAddress) {\n throw new APIError(\n `BoringVault contract address not configured for vault ${config.id}`,\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n const client = await getClient(normalizedChainId);\n\n const [minOrderResult, shareDecimalsResult] =\n await client.multicall({\n contracts: [\n {\n abi: WithdrawQueueAbi,\n address: config.vault.withdrawQueueAddress,\n functionName: \"minimumOrderSize\",\n },\n {\n abi: [\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n ] as const,\n address: config.vault.boringVaultAddress,\n functionName: \"decimals\",\n },\n ],\n });\n\n if (\n minOrderResult.status === \"failure\" ||\n shareDecimalsResult.status === \"failure\"\n ) {\n throw new APIError(\n \"Failed to read minimum order size from WithdrawQueue contract\",\n { endpoint: \"getMinimumWithdrawalOrderSize\" }\n );\n }\n\n return {\n minimumOrderSize: minOrderResult.result,\n shareDecimals: shareDecimalsResult.result,\n };\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Failed to get minimum withdrawal order size: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { endpoint: \"getMinimumWithdrawalOrderSize\", cause: error }\n );\n }\n}\n"]}
|