@paxoslabs/amplify-sdk 0.2.0-alpha.1 → 0.2.0-alpha.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.
Files changed (34) hide show
  1. package/README.md +18 -7
  2. package/dist/{chunk-TF3S7T6P.js → chunk-4ZYCWOFI.js} +8 -8
  3. package/dist/{chunk-TF3S7T6P.js.map → chunk-4ZYCWOFI.js.map} +1 -1
  4. package/dist/{chunk-EWJDKRSY.js → chunk-CK3BIPWI.js} +2 -2
  5. package/dist/{chunk-EWJDKRSY.js.map → chunk-CK3BIPWI.js.map} +1 -1
  6. package/dist/{chunk-4ORV7PFT.mjs → chunk-E3JM2RCC.mjs} +3 -3
  7. package/dist/{chunk-4ORV7PFT.mjs.map → chunk-E3JM2RCC.mjs.map} +1 -1
  8. package/dist/{chunk-SMIA4ULA.js → chunk-IJBG5TTI.js} +19 -19
  9. package/dist/{chunk-SMIA4ULA.js.map → chunk-IJBG5TTI.js.map} +1 -1
  10. package/dist/{chunk-YDMFT2R7.mjs → chunk-NZDHFDPQ.mjs} +2 -2
  11. package/dist/{chunk-YDMFT2R7.mjs.map → chunk-NZDHFDPQ.mjs.map} +1 -1
  12. package/dist/{chunk-WWTNCRXX.js → chunk-RSQQMUEQ.js} +4 -4
  13. package/dist/{chunk-WWTNCRXX.js.map → chunk-RSQQMUEQ.js.map} +1 -1
  14. package/dist/{chunk-UURNMLRT.mjs → chunk-RZN7S23Z.mjs} +3 -3
  15. package/dist/{chunk-UURNMLRT.mjs.map → chunk-RZN7S23Z.mjs.map} +1 -1
  16. package/dist/{chunk-Y3QNUDV6.mjs → chunk-VZ3D7CNR.mjs} +3 -3
  17. package/dist/{chunk-Y3QNUDV6.mjs.map → chunk-VZ3D7CNR.mjs.map} +1 -1
  18. package/dist/{chunk-LJPJWJ2Y.mjs → chunk-WDPR2NKT.mjs} +4 -4
  19. package/dist/{chunk-LJPJWJ2Y.mjs.map → chunk-WDPR2NKT.mjs.map} +1 -1
  20. package/dist/{chunk-76SRRIGW.js → chunk-ZRI7KBQ6.js} +8 -8
  21. package/dist/{chunk-76SRRIGW.js.map → chunk-ZRI7KBQ6.js.map} +1 -1
  22. package/dist/core.js +14 -14
  23. package/dist/core.mjs +4 -4
  24. package/dist/display.js +12 -12
  25. package/dist/display.mjs +4 -4
  26. package/dist/index.d.mts +7 -7
  27. package/dist/index.d.ts +7 -7
  28. package/dist/index.js +115 -115
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +6 -6
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/utils.js +5 -5
  33. package/dist/utils.mjs +2 -2
  34. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/telemetry.ts","../src/lib/logger.ts","../src/constants/index.ts","../src/lib/vault-cache.ts","../src/api/amplify-sdk-client.ts","../src/lib/sdk-config.ts","../src/lib/telemetry.ts","../src/types/amplify-sdk-api.ts","../src/lib/viem/chains.ts","../src/utils/chain-utils.ts"],"names":["createTimeoutSignal","chain"],"mappings":"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","file":"chunk-YDMFT2R7.mjs","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 { LogLevel, type Logger } 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","import type { Address } from \"viem\";\n\nexport const ATOMIC_QUEUE_CONTRACT_ADDRESS =\n \"0x228c44bb4885c6633f4b6c83f14622f37d5112e5\" as Address;\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\nexport const API_BASE_URL = \"https://api.paxoslabs.com\";\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 { fetchSupportedAssets, fetchVaults } from \"../api/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 * Flag to prevent concurrent refresh operations\n */\n private refreshing: boolean;\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.refreshing = false;\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 waits for it to complete\n * instead of starting a concurrent refresh.\n *\n * @throws {APIError} If the API request fails\n */\n async refresh(): Promise<void> {\n // If already refreshing, wait for the current refresh to complete\n if (this.refreshing) {\n // Wait for refresh to complete by polling\n while (this.refreshing) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return;\n }\n\n this.refreshing = true;\n\n try {\n // Fetch both vaults and assets in parallel\n const [vaultsData, assetsData] = await Promise.all([\n fetchVaults(),\n fetchSupportedAssets(),\n ]);\n\n // Clear existing cache\n this.vaults.clear();\n this.assets.clear();\n\n // Populate vaults map (keyed by baseTokenAddress)\n for (const vault of vaultsData) {\n const tokenAddress = vault.vault.baseTokenAddress;\n const existing = this.vaults.get(tokenAddress);\n\n if (existing) {\n existing.push(vault);\n } else {\n this.vaults.set(tokenAddress, [vault]);\n }\n }\n\n // Populate assets map (keyed by address)\n for (const asset of assetsData) {\n this.assets.set(asset.address, asset);\n }\n\n // Update lastFetch timestamp\n this.lastFetch = Date.now();\n } finally {\n this.refreshing = false;\n }\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","/**\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 api/amplify-sdk-client\n */\n\nimport type { Address } from \"viem\";\nimport { API_BASE_URL } from \"../constants\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\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\";\n\n/**\n * Default timeout for API requests (10 seconds)\n */\nconst DEFAULT_TIMEOUT = 10000;\n\n/**\n * Creates an AbortSignal that times out after the specified duration\n */\nfunction createTimeoutSignal(timeoutMs: number): AbortSignal {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeoutMs);\n return controller.signal;\n}\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: PRIME, TBILL, LENDING.`,\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: PRIME, TBILL, LENDING.`,\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 * Validates AmplifyVault response data\n */\nfunction validateAmplifyVault(data: unknown): data is AmplifyVault {\n if (!data || typeof data !== \"object\") return false;\n\n const vaultData = data as Partial<AmplifyVault>;\n\n // Check required fields\n if (typeof vaultData.id !== \"string\" || vaultData.id.length === 0)\n return false;\n if (!isValidChainId(vaultData.chainId)) return false;\n if (!isValidYieldType(vaultData.yieldType)) return false;\n\n // Check vault object\n if (!vaultData.vault || typeof vaultData.vault !== \"object\") return false;\n\n const vault = vaultData.vault;\n\n // Check required vault addresses\n if (!isValidAddress(vault.boringVaultAddress)) return false;\n if (!isValidAddress(vault.tellerAddress)) return false;\n if (!isValidAddress(vault.accountantAddress)) return false;\n if (!isValidAddress(vault.managerAddress)) return false;\n if (!isValidAddress(vault.rolesAuthorityAddress)) return false;\n if (!isValidAddress(vault.baseTokenAddress)) return false;\n\n // Check optional vault addresses (handle both null and undefined)\n if (\n vault.baseTokenStandIn !== undefined &&\n vault.baseTokenStandIn !== null &&\n !isValidAddress(vault.baseTokenStandIn)\n ) {\n return false;\n }\n\n if (\n vault.communityCodeDepositorAddress !== undefined &&\n vault.communityCodeDepositorAddress !== null &&\n !isValidAddress(vault.communityCodeDepositorAddress)\n ) {\n return false;\n }\n\n // Check supportedAssets object\n if (\n !vaultData.supportedAssets ||\n typeof vaultData.supportedAssets !== \"object\"\n ) {\n return false;\n }\n\n const supportedAssets = vaultData.supportedAssets;\n\n // Check required supportedAssets fields\n if (!isValidAddress(supportedAssets.address)) return false;\n if (\n typeof supportedAssets.symbol !== \"string\" ||\n supportedAssets.symbol.length === 0\n ) {\n return false;\n }\n if (\n typeof supportedAssets.name !== \"string\" ||\n supportedAssets.name.length === 0\n ) {\n return false;\n }\n if (\n typeof supportedAssets.decimals !== \"number\" ||\n supportedAssets.decimals < 0 ||\n !Number.isInteger(supportedAssets.decimals)\n ) {\n return false;\n }\n\n // Check optional coinGeckoTokenId\n if (\n supportedAssets.coinGeckoTokenId !== undefined &&\n typeof supportedAssets.coinGeckoTokenId !== \"string\"\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates SupportedAsset response data\n */\nfunction validateSupportedAsset(data: unknown): data is SupportedAsset {\n if (!data || typeof data !== \"object\") return false;\n\n const asset = data as Partial<SupportedAsset>;\n\n // Check required fields\n if (!isValidAddress(asset.address)) return false;\n if (typeof asset.symbol !== \"string\" || asset.symbol.length === 0)\n return false;\n if (typeof asset.name !== \"string\" || asset.name.length === 0) return false;\n if (\n typeof asset.decimals !== \"number\" ||\n asset.decimals < 0 ||\n !Number.isInteger(asset.decimals)\n ) {\n return false;\n }\n\n // Check optional coinGeckoTokenId\n if (\n asset.coinGeckoTokenId !== undefined &&\n typeof asset.coinGeckoTokenId !== \"string\"\n ) {\n return false;\n }\n\n // Check chains array\n if (!Array.isArray(asset.chains) || asset.chains.length === 0) {\n return false;\n }\n\n // Validate each chain ID in chains\n for (const chainId of asset.chains) {\n if (!isValidChainId(chainId)) return false;\n }\n\n return true;\n}\n\n/**\n * Fetches vaults from the Earn SDK API\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\n * const allVaults = await fetchVaults();\n *\n * // Fetch PRIME vaults on Ethereum\n * const ethPrimes = await fetchVaults({\n * chainId: 1,\n * yieldType: \"PRIME\"\n * });\n *\n * // Fetch vaults accepting USDC\n * const usdcVaults = await fetchVaults({\n * depositTokenAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * });\n * ```\n */\nexport async function fetchVaults(\n options?: VaultFilterOptions\n): Promise<AmplifyVault[]> {\n const endpoint = \"/v1/earn-sdk/vaults\";\n\n // Validate filter options\n validateVaultFilterOptions(options);\n\n // Build query params\n const params = new URLSearchParams();\n if (options?.chainId !== undefined) {\n params.append(\"chain_id\", options.chainId.toString());\n }\n if (options?.yieldType) {\n params.append(\"yield_type\", options.yieldType);\n }\n if (options?.depositTokenAddress) {\n params.append(\"deposit_token_address\", options.depositTokenAddress);\n }\n\n const url = `${API_BASE_URL}${endpoint}${\n params.toString() ? `?${params.toString()}` : \"\"\n }`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: createTimeoutSignal(DEFAULT_TIMEOUT),\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new APIError(\n `Failed to fetch vaults: ${response.status} ${response.statusText}`,\n {\n statusCode: response.status,\n endpoint,\n cause: errorText,\n }\n );\n }\n\n // Parse response\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n throw new APIError(\"Failed to parse vaults response: Invalid JSON\", {\n statusCode: response.status,\n endpoint,\n cause: error,\n });\n }\n\n // Validate response is an array\n if (!Array.isArray(data)) {\n throw new APIError(\"Invalid vaults response: Expected array\", {\n statusCode: response.status,\n endpoint,\n cause: data,\n });\n }\n\n // Validate each vault\n const vaults: AmplifyVault[] = [];\n for (let i = 0; i < data.length; i++) {\n const vault = data[i];\n if (!validateAmplifyVault(vault)) {\n throw new APIError(\n `Invalid vault data at index ${i}: Failed validation`,\n {\n statusCode: response.status,\n endpoint,\n cause: vault,\n }\n );\n }\n vaults.push(vault);\n }\n\n return vaults;\n } catch (error) {\n // Handle timeout\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new APIError(`Failed to fetch vaults: Network timeout`, {\n endpoint,\n cause: error,\n });\n }\n\n // Re-throw APIError as-is\n if (error instanceof APIError) {\n throw error;\n }\n\n // Handle network errors\n if (error instanceof TypeError) {\n throw new APIError(`Failed to fetch vaults: Network error`, {\n endpoint,\n cause: error,\n });\n }\n\n // Handle unknown errors\n throw new APIError(`Failed to fetch vaults: Unknown error`, {\n endpoint,\n cause: error,\n });\n }\n}\n\n/**\n * Fetches supported assets from the Earn SDK API\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\n * const allAssets = await fetchSupportedAssets();\n *\n * // Fetch assets supported on Ethereum and Base\n * const ethAssets = await fetchSupportedAssets({\n * chains: [1, 8453]\n * });\n *\n * // Fetch PRIME yield type assets\n * const primeAssets = await fetchSupportedAssets({\n * yieldType: \"PRIME\"\n * });\n *\n * // Combine filters\n * const ethPrimeAssets = await fetchSupportedAssets({\n * chains: [1],\n * yieldType: \"PRIME\"\n * });\n * ```\n */\nexport async function fetchSupportedAssets(\n options?: AssetFilterOptions\n): Promise<SupportedAsset[]> {\n const endpoint = \"/v1/earn-sdk/supported-assets-by-chains\";\n\n // Validate filter options\n validateAssetFilterOptions(options);\n\n // Build query params\n const params = new URLSearchParams();\n if (options?.chains !== undefined && options.chains.length > 0) {\n params.append(\"chains\", options.chains.join(\",\"));\n }\n if (options?.yieldType) {\n params.append(\"yield_type\", options.yieldType);\n }\n\n const url = `${API_BASE_URL}${endpoint}${\n params.toString() ? `?${params.toString()}` : \"\"\n }`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: createTimeoutSignal(DEFAULT_TIMEOUT),\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new APIError(\n `Failed to fetch supported assets: ${response.status} ${response.statusText}`,\n {\n statusCode: response.status,\n endpoint,\n cause: errorText,\n }\n );\n }\n\n // Parse response\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n throw new APIError(\n \"Failed to parse supported assets response: Invalid JSON\",\n {\n statusCode: response.status,\n endpoint,\n cause: error,\n }\n );\n }\n\n // Validate response is an array\n if (!Array.isArray(data)) {\n throw new APIError(\"Invalid supported assets response: Expected array\", {\n statusCode: response.status,\n endpoint,\n cause: data,\n });\n }\n\n // Validate each asset\n const assets: SupportedAsset[] = [];\n for (let i = 0; i < data.length; i++) {\n const asset = data[i];\n if (!validateSupportedAsset(asset)) {\n throw new APIError(\n `Invalid asset data at index ${i}: Failed validation`,\n {\n statusCode: response.status,\n endpoint,\n cause: asset,\n }\n );\n }\n assets.push(asset);\n }\n\n return assets;\n } catch (error) {\n // Handle timeout\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new APIError(`Failed to fetch supported assets: Network timeout`, {\n endpoint,\n cause: error,\n });\n }\n\n // Re-throw APIError as-is\n if (error instanceof APIError) {\n throw error;\n }\n\n // Handle network errors\n if (error instanceof TypeError) {\n throw new APIError(`Failed to fetch supported assets: Network error`, {\n endpoint,\n cause: error,\n });\n }\n\n // Handle unknown errors\n throw new APIError(`Failed to fetch supported assets: Unknown error`, {\n endpoint,\n cause: error,\n });\n }\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 * @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 *\n * @example\n * ```typescript\n * // Get all vaults (cache-first)\n * const allVaults = await getVaultsFromCache();\n *\n * // Get PRIME vaults on Ethereum (cache-first)\n * const ethPrimes = await getVaultsFromCache({\n * chainId: 1,\n * yieldType: \"PRIME\"\n * });\n * ```\n */\nexport async function getVaultsFromCache(\n options?: VaultFilterOptions\n): Promise<AmplifyVault[]> {\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 // Get all vaults from cache\n let vaults = cache.getAllVaults();\n\n // Apply filters if provided\n if (options?.chainId !== undefined) {\n vaults = vaults.filter((v) => v.chainId === options.chainId);\n }\n\n if (options?.yieldType) {\n vaults = vaults.filter((v) => v.yieldType === options.yieldType);\n }\n\n if (options?.depositTokenAddress) {\n vaults = vaults.filter(\n (v) => v.vault.baseTokenAddress === options.depositTokenAddress\n );\n }\n\n return vaults;\n}\n\n/**\n * Gets supported assets from cache with automatic refresh on expiry\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 *\n * @remarks\n * Note: yieldType filtering is not supported in the cache layer because\n * SupportedAsset objects don't have a yieldType property. For yieldType\n * filtering, use fetchSupportedAssets() which queries the API directly.\n *\n * @example\n * ```typescript\n * // Get all supported assets (cache-first)\n * const allAssets = await getAssetsFromCache();\n *\n * // Get assets supported on Ethereum and Base (cache-first)\n * const ethAssets = await getAssetsFromCache({\n * chains: [1, 8453]\n * });\n *\n * // Get USDC by address (cache-first)\n * const usdc = await getAssetsFromCache({\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * });\n *\n * // Get asset by symbol (cache-first)\n * const usdcBySymbol = await getAssetsFromCache({\n * symbol: \"USDC\"\n * });\n * ```\n */\nexport async function getAssetsFromCache(\n options?: AssetFilterOptions\n): Promise<SupportedAsset[]> {\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 // Get all assets from cache\n let assets = cache.getAllAssets();\n\n // Apply filters if provided\n if (options?.chains !== undefined && options.chains.length > 0) {\n // Filter assets that support ANY of the specified chains\n assets = assets.filter((asset) =>\n options.chains?.some((chainId) => asset.chains.includes(chainId))\n );\n }\n\n // Filter by address (exact match, case-insensitive)\n if (options?.address) {\n const normalizedAddress = options.address.toLowerCase();\n assets = assets.filter(\n (asset) => asset.address.toLowerCase() === normalizedAddress\n );\n }\n\n // Filter by symbol (exact match, case-sensitive)\n if (options?.symbol) {\n assets = assets.filter((asset) => asset.symbol === options.symbol);\n }\n\n // Note: yieldType filtering is not applied here because SupportedAsset\n // objects don't have a yieldType property. The yieldType filter is\n // only meaningful when querying the API directly via fetchSupportedAssets()\n\n return assets;\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 (PRIME, TBILL, LENDING)\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 (PRIME, TBILL, or LENDING)\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 PRIME vault on Ethereum for USDC\n * const vault = await findVaultByConfig({\n * assetAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * yieldType: \"PRIME\",\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: PRIME, TBILL, LENDING.`,\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","/**\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 { clearCache, initializeCache } from \"../api/amplify-sdk-client.js\";\nimport { APIError } from \"../types/amplify-sdk-api.js\";\nimport type {\n RequestHeaders,\n SDKConfig,\n SDKInitOptions,\n} from \"../types/sdk-config.js\";\nimport { initTelemetry, resetTelemetry } from \"./telemetry.js\";\nimport { setLogger, setLogLevel } from \"./logger.js\";\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};\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 * 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 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 * Initialize Amplify SDK with API key\n *\n * Validates API key, configures authentication headers, and pre-populates\n * the cache with vault and asset data. Optionally initializes telemetry\n * for error tracking.\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 * @throws {APIError} If initialization fails\n *\n * @example\n * ```typescript\n * import { initAmplifySDK } from \"@paxoslabs/amplify-sdk\";\n *\n * // Basic initialization (telemetry enabled by default)\n * await initAmplifySDK(\"pxl_internal_your_api_key_here\");\n *\n * // Disable telemetry\n * await initAmplifySDK(\"pxl_your_api_key\", { telemetry: false });\n *\n * // Enable debug logging\n * await initAmplifySDK(\"pxl_your_api_key\", { logLevel: LogLevel.DEBUG });\n * ```\n */\nexport async function initAmplifySDK(\n apiKey: string,\n options?: SDKInitOptions\n): Promise<void> {\n // Validate API key format\n validateAPIKey(apiKey);\n\n // Check if already initialized with same API key (idempotent)\n if (sdkConfig.isInitialized && sdkConfig.apiKey === apiKey) {\n return; // No-op, already initialized with this key\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 // Mark as initializing\n sdkConfig.isInitializing = true;\n\n // Create initialization promise\n sdkConfig.initPromise = (async () => {\n try {\n // Store API key\n setAPIKey(apiKey);\n\n // Initialize cache\n const cache = initializeCache();\n\n // Populate cache with vaults and assets\n await cache.refresh();\n\n // Mark as initialized\n sdkConfig.isInitialized = true;\n sdkConfig.initializedAt = new Date();\n\n // Initialize telemetry (async, non-blocking)\n // This runs after SDK is fully initialized so we have the API key\n if (sdkConfig.telemetryEnabled) {\n initTelemetry(apiKey).catch(() => {\n // Silent failure - telemetry is optional\n // Errors are already logged by initTelemetry\n });\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.CACHE_INIT_FAILED, {\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\n await sdkConfig.initPromise;\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 { 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 * Creates an AbortSignal that times out after the specified duration\n */\nfunction createTimeoutSignal(timeoutMs: number): AbortSignal {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeoutMs);\n return controller.signal;\n}\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}\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-prime-001\",\n * chainId: 1,\n * yieldType: \"PRIME\",\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 };\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 PRIME vaults on Ethereum\n * const options: VaultFilterOptions = {\n * chainId: 1,\n * yieldType: \"PRIME\"\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 PRIME yield type assets (API call)\n * const primeOptions: AssetFilterOptions = {\n * yieldType: \"PRIME\"\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: PRIME, TBILL, or LENDING) */\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 // 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 === \"PRIME\" || value === \"TBILL\" || value === \"LENDING\")\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: \"PRIME\",\n * recipientAddress: \"0x1234...\",\n * wantToken: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * shareAmount: \"1.5\",\n * chainId: 1,\n * slippage: 100, // 1% (basis points)\n * };\n * ```\n */\nexport interface PrepareWithdrawTransactionDataParams {\n /** Yield strategy type (e.g., \"PRIME\") */\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 (100 = 1%, default: 100) */\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 PRIME yield type\", {\n * code: \"VAULT_NOT_FOUND\",\n * yieldType: \"PRIME\",\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 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: \"prime-usdc-eth\", yieldType: \"PRIME\", chainId: 1, vaultId: \"...\" },\n * { id: \"prime-usdc-boba\", yieldType: \"PRIME\", 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","import { defineChain } from \"viem\";\nimport type { Chain } from \"viem/chains\";\nimport {\n boba,\n form,\n mainnet,\n plumeMainnet,\n sei,\n swellchain,\n} from \"viem/chains\";\n\nconst rari = defineChain({\n id: 1380012617,\n name: \"Rari Chain\",\n nativeCurrency: {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://mainnet.rpc.rarichain.org/http\"],\n webSocket: [\"wss://mainnet.rpc.rarichain.org/ws\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Rari Explorer\",\n url: \"https://mainnet.explorer.rarichain.org\",\n },\n },\n contracts: {\n multicall3: {\n address: \"0x3F5Fc48153f8aDd3E429F0c84fA6FEd5c58657Dc\",\n },\n },\n});\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\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 [boba.id]: boba,\n [form.id]: form,\n [hyperEvm.id]: hyperEvm,\n [plumeMainnet.id]: plumeMainnet,\n [rari.id]: rari,\n [sei.id]: sei,\n [swellchain.id]: swellchain,\n} as const;\n\nexport { boba, form, hyperEvm, mainnet, plumeMainnet, rari, sei, swellchain };\nexport type { Chain };\n","import type { Chain } from \"viem/chains\";\nimport { fetchVaults } from \"../api/amplify-sdk-client\";\nimport { CHAIN_ID_TO_CHAIN_MAP } from \"../lib/viem/chains\";\nimport type { AmplifyVault } from \"../types/amplify-sdk-api\";\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"]}
1
+ {"version":3,"sources":["../src/types/telemetry.ts","../src/lib/logger.ts","../src/constants/index.ts","../src/lib/vault-cache.ts","../src/api/amplify-sdk-client.ts","../src/lib/sdk-config.ts","../src/lib/telemetry.ts","../src/types/amplify-sdk-api.ts","../src/lib/viem/chains.ts","../src/utils/chain-utils.ts"],"names":["createTimeoutSignal","chain"],"mappings":"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","file":"chunk-NZDHFDPQ.mjs","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 { LogLevel, type Logger } 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","import type { Address } from \"viem\";\n\nexport const ATOMIC_QUEUE_CONTRACT_ADDRESS =\n \"0x228c44bb4885c6633f4b6c83f14622f37d5112e5\" as Address;\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\nexport const API_BASE_URL = \"https://api.paxoslabs.com\";\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 { fetchSupportedAssets, fetchVaults } from \"../api/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 * Flag to prevent concurrent refresh operations\n */\n private refreshing: boolean;\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.refreshing = false;\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 waits for it to complete\n * instead of starting a concurrent refresh.\n *\n * @throws {APIError} If the API request fails\n */\n async refresh(): Promise<void> {\n // If already refreshing, wait for the current refresh to complete\n if (this.refreshing) {\n // Wait for refresh to complete by polling\n while (this.refreshing) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n return;\n }\n\n this.refreshing = true;\n\n try {\n // Fetch both vaults and assets in parallel\n const [vaultsData, assetsData] = await Promise.all([\n fetchVaults(),\n fetchSupportedAssets(),\n ]);\n\n // Clear existing cache\n this.vaults.clear();\n this.assets.clear();\n\n // Populate vaults map (keyed by baseTokenAddress)\n for (const vault of vaultsData) {\n const tokenAddress = vault.vault.baseTokenAddress;\n const existing = this.vaults.get(tokenAddress);\n\n if (existing) {\n existing.push(vault);\n } else {\n this.vaults.set(tokenAddress, [vault]);\n }\n }\n\n // Populate assets map (keyed by address)\n for (const asset of assetsData) {\n this.assets.set(asset.address, asset);\n }\n\n // Update lastFetch timestamp\n this.lastFetch = Date.now();\n } finally {\n this.refreshing = false;\n }\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","/**\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 api/amplify-sdk-client\n */\n\nimport type { Address } from \"viem\";\nimport { API_BASE_URL } from \"../constants\";\nimport { getRequestHeaders } from \"../lib/sdk-config\";\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\";\n\n/**\n * Default timeout for API requests (10 seconds)\n */\nconst DEFAULT_TIMEOUT = 10000;\n\n/**\n * Creates an AbortSignal that times out after the specified duration\n */\nfunction createTimeoutSignal(timeoutMs: number): AbortSignal {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeoutMs);\n return controller.signal;\n}\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: PRIME, TBILL, LENDING.`,\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: PRIME, TBILL, LENDING.`,\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 * Validates AmplifyVault response data\n */\nfunction validateAmplifyVault(data: unknown): data is AmplifyVault {\n if (!data || typeof data !== \"object\") return false;\n\n const vaultData = data as Partial<AmplifyVault>;\n\n // Check required fields\n if (typeof vaultData.id !== \"string\" || vaultData.id.length === 0)\n return false;\n if (!isValidChainId(vaultData.chainId)) return false;\n if (!isValidYieldType(vaultData.yieldType)) return false;\n\n // Check vault object\n if (!vaultData.vault || typeof vaultData.vault !== \"object\") return false;\n\n const vault = vaultData.vault;\n\n // Check required vault addresses\n if (!isValidAddress(vault.boringVaultAddress)) return false;\n if (!isValidAddress(vault.tellerAddress)) return false;\n if (!isValidAddress(vault.accountantAddress)) return false;\n if (!isValidAddress(vault.managerAddress)) return false;\n if (!isValidAddress(vault.rolesAuthorityAddress)) return false;\n if (!isValidAddress(vault.baseTokenAddress)) return false;\n\n // Check optional vault addresses (handle both null and undefined)\n if (\n vault.baseTokenStandIn !== undefined &&\n vault.baseTokenStandIn !== null &&\n !isValidAddress(vault.baseTokenStandIn)\n ) {\n return false;\n }\n\n if (\n vault.communityCodeDepositorAddress !== undefined &&\n vault.communityCodeDepositorAddress !== null &&\n !isValidAddress(vault.communityCodeDepositorAddress)\n ) {\n return false;\n }\n\n // Check supportedAssets object\n if (\n !vaultData.supportedAssets ||\n typeof vaultData.supportedAssets !== \"object\"\n ) {\n return false;\n }\n\n const supportedAssets = vaultData.supportedAssets;\n\n // Check required supportedAssets fields\n if (!isValidAddress(supportedAssets.address)) return false;\n if (\n typeof supportedAssets.symbol !== \"string\" ||\n supportedAssets.symbol.length === 0\n ) {\n return false;\n }\n if (\n typeof supportedAssets.name !== \"string\" ||\n supportedAssets.name.length === 0\n ) {\n return false;\n }\n if (\n typeof supportedAssets.decimals !== \"number\" ||\n supportedAssets.decimals < 0 ||\n !Number.isInteger(supportedAssets.decimals)\n ) {\n return false;\n }\n\n // Check optional coinGeckoTokenId\n if (\n supportedAssets.coinGeckoTokenId !== undefined &&\n typeof supportedAssets.coinGeckoTokenId !== \"string\"\n ) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validates SupportedAsset response data\n */\nfunction validateSupportedAsset(data: unknown): data is SupportedAsset {\n if (!data || typeof data !== \"object\") return false;\n\n const asset = data as Partial<SupportedAsset>;\n\n // Check required fields\n if (!isValidAddress(asset.address)) return false;\n if (typeof asset.symbol !== \"string\" || asset.symbol.length === 0)\n return false;\n if (typeof asset.name !== \"string\" || asset.name.length === 0) return false;\n if (\n typeof asset.decimals !== \"number\" ||\n asset.decimals < 0 ||\n !Number.isInteger(asset.decimals)\n ) {\n return false;\n }\n\n // Check optional coinGeckoTokenId\n if (\n asset.coinGeckoTokenId !== undefined &&\n typeof asset.coinGeckoTokenId !== \"string\"\n ) {\n return false;\n }\n\n // Check chains array\n if (!Array.isArray(asset.chains) || asset.chains.length === 0) {\n return false;\n }\n\n // Validate each chain ID in chains\n for (const chainId of asset.chains) {\n if (!isValidChainId(chainId)) return false;\n }\n\n return true;\n}\n\n/**\n * Fetches vaults from the Earn SDK API\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\n * const allVaults = await fetchVaults();\n *\n * // Fetch PRIME vaults on Ethereum\n * const ethPrimes = await fetchVaults({\n * chainId: 1,\n * yieldType: \"PRIME\"\n * });\n *\n * // Fetch vaults accepting USDC\n * const usdcVaults = await fetchVaults({\n * depositTokenAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * });\n * ```\n */\nexport async function fetchVaults(\n options?: VaultFilterOptions\n): Promise<AmplifyVault[]> {\n const endpoint = \"/v1/earn-sdk/vaults\";\n\n // Validate filter options\n validateVaultFilterOptions(options);\n\n // Build query params\n const params = new URLSearchParams();\n if (options?.chainId !== undefined) {\n params.append(\"chain_id\", options.chainId.toString());\n }\n if (options?.yieldType) {\n params.append(\"yield_type\", options.yieldType);\n }\n if (options?.depositTokenAddress) {\n params.append(\"deposit_token_address\", options.depositTokenAddress);\n }\n\n const url = `${API_BASE_URL}${endpoint}${\n params.toString() ? `?${params.toString()}` : \"\"\n }`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: createTimeoutSignal(DEFAULT_TIMEOUT),\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new APIError(\n `Failed to fetch vaults: ${response.status} ${response.statusText}`,\n {\n statusCode: response.status,\n endpoint,\n cause: errorText,\n }\n );\n }\n\n // Parse response\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n throw new APIError(\"Failed to parse vaults response: Invalid JSON\", {\n statusCode: response.status,\n endpoint,\n cause: error,\n });\n }\n\n // Validate response is an array\n if (!Array.isArray(data)) {\n throw new APIError(\"Invalid vaults response: Expected array\", {\n statusCode: response.status,\n endpoint,\n cause: data,\n });\n }\n\n // Validate each vault\n const vaults: AmplifyVault[] = [];\n for (let i = 0; i < data.length; i++) {\n const vault = data[i];\n if (!validateAmplifyVault(vault)) {\n throw new APIError(\n `Invalid vault data at index ${i}: Failed validation`,\n {\n statusCode: response.status,\n endpoint,\n cause: vault,\n }\n );\n }\n vaults.push(vault);\n }\n\n return vaults;\n } catch (error) {\n // Handle timeout\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new APIError(`Failed to fetch vaults: Network timeout`, {\n endpoint,\n cause: error,\n });\n }\n\n // Re-throw APIError as-is\n if (error instanceof APIError) {\n throw error;\n }\n\n // Handle network errors\n if (error instanceof TypeError) {\n throw new APIError(`Failed to fetch vaults: Network error`, {\n endpoint,\n cause: error,\n });\n }\n\n // Handle unknown errors\n throw new APIError(`Failed to fetch vaults: Unknown error`, {\n endpoint,\n cause: error,\n });\n }\n}\n\n/**\n * Fetches supported assets from the Earn SDK API\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\n * const allAssets = await fetchSupportedAssets();\n *\n * // Fetch assets supported on Ethereum and Base\n * const ethAssets = await fetchSupportedAssets({\n * chains: [1, 8453]\n * });\n *\n * // Fetch PRIME yield type assets\n * const primeAssets = await fetchSupportedAssets({\n * yieldType: \"PRIME\"\n * });\n *\n * // Combine filters\n * const ethPrimeAssets = await fetchSupportedAssets({\n * chains: [1],\n * yieldType: \"PRIME\"\n * });\n * ```\n */\nexport async function fetchSupportedAssets(\n options?: AssetFilterOptions\n): Promise<SupportedAsset[]> {\n const endpoint = \"/v1/earn-sdk/supported-assets-by-chains\";\n\n // Validate filter options\n validateAssetFilterOptions(options);\n\n // Build query params\n const params = new URLSearchParams();\n if (options?.chains !== undefined && options.chains.length > 0) {\n params.append(\"chains\", options.chains.join(\",\"));\n }\n if (options?.yieldType) {\n params.append(\"yield_type\", options.yieldType);\n }\n\n const url = `${API_BASE_URL}${endpoint}${\n params.toString() ? `?${params.toString()}` : \"\"\n }`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: getRequestHeaders(),\n signal: createTimeoutSignal(DEFAULT_TIMEOUT),\n });\n\n // Handle HTTP errors\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new APIError(\n `Failed to fetch supported assets: ${response.status} ${response.statusText}`,\n {\n statusCode: response.status,\n endpoint,\n cause: errorText,\n }\n );\n }\n\n // Parse response\n let data: unknown;\n try {\n data = await response.json();\n } catch (error) {\n throw new APIError(\n \"Failed to parse supported assets response: Invalid JSON\",\n {\n statusCode: response.status,\n endpoint,\n cause: error,\n }\n );\n }\n\n // Validate response is an array\n if (!Array.isArray(data)) {\n throw new APIError(\"Invalid supported assets response: Expected array\", {\n statusCode: response.status,\n endpoint,\n cause: data,\n });\n }\n\n // Validate each asset\n const assets: SupportedAsset[] = [];\n for (let i = 0; i < data.length; i++) {\n const asset = data[i];\n if (!validateSupportedAsset(asset)) {\n throw new APIError(\n `Invalid asset data at index ${i}: Failed validation`,\n {\n statusCode: response.status,\n endpoint,\n cause: asset,\n }\n );\n }\n assets.push(asset);\n }\n\n return assets;\n } catch (error) {\n // Handle timeout\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new APIError(`Failed to fetch supported assets: Network timeout`, {\n endpoint,\n cause: error,\n });\n }\n\n // Re-throw APIError as-is\n if (error instanceof APIError) {\n throw error;\n }\n\n // Handle network errors\n if (error instanceof TypeError) {\n throw new APIError(`Failed to fetch supported assets: Network error`, {\n endpoint,\n cause: error,\n });\n }\n\n // Handle unknown errors\n throw new APIError(`Failed to fetch supported assets: Unknown error`, {\n endpoint,\n cause: error,\n });\n }\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 * @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 *\n * @example\n * ```typescript\n * // Get all vaults (cache-first)\n * const allVaults = await getVaultsFromCache();\n *\n * // Get PRIME vaults on Ethereum (cache-first)\n * const ethPrimes = await getVaultsFromCache({\n * chainId: 1,\n * yieldType: \"PRIME\"\n * });\n * ```\n */\nexport async function getVaultsFromCache(\n options?: VaultFilterOptions\n): Promise<AmplifyVault[]> {\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 // Get all vaults from cache\n let vaults = cache.getAllVaults();\n\n // Apply filters if provided\n if (options?.chainId !== undefined) {\n vaults = vaults.filter((v) => v.chainId === options.chainId);\n }\n\n if (options?.yieldType) {\n vaults = vaults.filter((v) => v.yieldType === options.yieldType);\n }\n\n if (options?.depositTokenAddress) {\n vaults = vaults.filter(\n (v) => v.vault.baseTokenAddress === options.depositTokenAddress\n );\n }\n\n return vaults;\n}\n\n/**\n * Gets supported assets from cache with automatic refresh on expiry\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 *\n * @remarks\n * Note: yieldType filtering is not supported in the cache layer because\n * SupportedAsset objects don't have a yieldType property. For yieldType\n * filtering, use fetchSupportedAssets() which queries the API directly.\n *\n * @example\n * ```typescript\n * // Get all supported assets (cache-first)\n * const allAssets = await getAssetsFromCache();\n *\n * // Get assets supported on Ethereum and Base (cache-first)\n * const ethAssets = await getAssetsFromCache({\n * chains: [1, 8453]\n * });\n *\n * // Get USDC by address (cache-first)\n * const usdc = await getAssetsFromCache({\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * });\n *\n * // Get asset by symbol (cache-first)\n * const usdcBySymbol = await getAssetsFromCache({\n * symbol: \"USDC\"\n * });\n * ```\n */\nexport async function getAssetsFromCache(\n options?: AssetFilterOptions\n): Promise<SupportedAsset[]> {\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 // Get all assets from cache\n let assets = cache.getAllAssets();\n\n // Apply filters if provided\n if (options?.chains !== undefined && options.chains.length > 0) {\n // Filter assets that support ANY of the specified chains\n assets = assets.filter((asset) =>\n options.chains?.some((chainId) => asset.chains.includes(chainId))\n );\n }\n\n // Filter by address (exact match, case-insensitive)\n if (options?.address) {\n const normalizedAddress = options.address.toLowerCase();\n assets = assets.filter(\n (asset) => asset.address.toLowerCase() === normalizedAddress\n );\n }\n\n // Filter by symbol (exact match, case-sensitive)\n if (options?.symbol) {\n assets = assets.filter((asset) => asset.symbol === options.symbol);\n }\n\n // Note: yieldType filtering is not applied here because SupportedAsset\n // objects don't have a yieldType property. The yieldType filter is\n // only meaningful when querying the API directly via fetchSupportedAssets()\n\n return assets;\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 (PRIME, TBILL, LENDING)\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 (PRIME, TBILL, or LENDING)\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 PRIME vault on Ethereum for USDC\n * const vault = await findVaultByConfig({\n * assetAddress: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * yieldType: \"PRIME\",\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: PRIME, TBILL, LENDING.`,\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","/**\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 { clearCache, initializeCache } from \"../api/amplify-sdk-client.js\";\nimport { APIError } from \"../types/amplify-sdk-api.js\";\nimport type {\n RequestHeaders,\n SDKConfig,\n SDKInitOptions,\n} from \"../types/sdk-config.js\";\nimport { initTelemetry, resetTelemetry } from \"./telemetry.js\";\nimport { setLogger, setLogLevel } from \"./logger.js\";\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};\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 * 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 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 * Initialize Amplify SDK with API key\n *\n * Validates API key, configures authentication headers, and pre-populates\n * the cache with vault and asset data. Optionally initializes telemetry\n * for error tracking.\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 * @throws {APIError} If initialization fails\n *\n * @example\n * ```typescript\n * import { initAmplifySDK } from \"@paxoslabs/amplify-sdk\";\n *\n * // Basic initialization (telemetry enabled by default)\n * await initAmplifySDK(\"pxl_internal_your_api_key_here\");\n *\n * // Disable telemetry\n * await initAmplifySDK(\"pxl_your_api_key\", { telemetry: false });\n *\n * // Enable debug logging\n * await initAmplifySDK(\"pxl_your_api_key\", { logLevel: LogLevel.DEBUG });\n * ```\n */\nexport async function initAmplifySDK(\n apiKey: string,\n options?: SDKInitOptions\n): Promise<void> {\n // Validate API key format\n validateAPIKey(apiKey);\n\n // Check if already initialized with same API key (idempotent)\n if (sdkConfig.isInitialized && sdkConfig.apiKey === apiKey) {\n return; // No-op, already initialized with this key\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 // Mark as initializing\n sdkConfig.isInitializing = true;\n\n // Create initialization promise\n sdkConfig.initPromise = (async () => {\n try {\n // Store API key\n setAPIKey(apiKey);\n\n // Initialize cache\n const cache = initializeCache();\n\n // Populate cache with vaults and assets\n await cache.refresh();\n\n // Mark as initialized\n sdkConfig.isInitialized = true;\n sdkConfig.initializedAt = new Date();\n\n // Initialize telemetry (async, non-blocking)\n // This runs after SDK is fully initialized so we have the API key\n if (sdkConfig.telemetryEnabled) {\n initTelemetry(apiKey).catch(() => {\n // Silent failure - telemetry is optional\n // Errors are already logged by initTelemetry\n });\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.CACHE_INIT_FAILED, {\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\n await sdkConfig.initPromise;\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 { 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 * Creates an AbortSignal that times out after the specified duration\n */\nfunction createTimeoutSignal(timeoutMs: number): AbortSignal {\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeoutMs);\n return controller.signal;\n}\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}\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-prime-001\",\n * chainId: 1,\n * yieldType: \"PRIME\",\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 };\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 PRIME vaults on Ethereum\n * const options: VaultFilterOptions = {\n * chainId: 1,\n * yieldType: \"PRIME\"\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 PRIME yield type assets (API call)\n * const primeOptions: AssetFilterOptions = {\n * yieldType: \"PRIME\"\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: PRIME, TBILL, or LENDING) */\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 // 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 === \"PRIME\" || value === \"TBILL\" || value === \"LENDING\")\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: \"PRIME\",\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., \"PRIME\") */\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 PRIME yield type\", {\n * code: \"VAULT_NOT_FOUND\",\n * yieldType: \"PRIME\",\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 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: \"prime-usdc-eth\", yieldType: \"PRIME\", chainId: 1, vaultId: \"...\" },\n * { id: \"prime-usdc-boba\", yieldType: \"PRIME\", 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","import { defineChain } from \"viem\";\nimport type { Chain } from \"viem/chains\";\nimport {\n boba,\n form,\n mainnet,\n plumeMainnet,\n sei,\n swellchain,\n} from \"viem/chains\";\n\nconst rari = defineChain({\n id: 1380012617,\n name: \"Rari Chain\",\n nativeCurrency: {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://mainnet.rpc.rarichain.org/http\"],\n webSocket: [\"wss://mainnet.rpc.rarichain.org/ws\"],\n },\n },\n blockExplorers: {\n default: {\n name: \"Rari Explorer\",\n url: \"https://mainnet.explorer.rarichain.org\",\n },\n },\n contracts: {\n multicall3: {\n address: \"0x3F5Fc48153f8aDd3E429F0c84fA6FEd5c58657Dc\",\n },\n },\n});\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\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 [boba.id]: boba,\n [form.id]: form,\n [hyperEvm.id]: hyperEvm,\n [plumeMainnet.id]: plumeMainnet,\n [rari.id]: rari,\n [sei.id]: sei,\n [swellchain.id]: swellchain,\n} as const;\n\nexport { boba, form, hyperEvm, mainnet, plumeMainnet, rari, sei, swellchain };\nexport type { Chain };\n","import type { Chain } from \"viem/chains\";\nimport { fetchVaults } from \"../api/amplify-sdk-client\";\nimport { CHAIN_ID_TO_CHAIN_MAP } from \"../lib/viem/chains\";\nimport type { AmplifyVault } from \"../types/amplify-sdk-api\";\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"]}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkEWJDKRSY_js = require('./chunk-EWJDKRSY.js');
3
+ var chunkCK3BIPWI_js = require('./chunk-CK3BIPWI.js');
4
4
 
5
5
  // src/utils/time.ts
6
- var calculateDeadline = (daysFromNow = chunkEWJDKRSY_js.DEFAULT_DEADLINE) => {
6
+ var calculateDeadline = (daysFromNow = chunkCK3BIPWI_js.DEFAULT_DEADLINE) => {
7
7
  const daysInSeconds = daysFromNow * 24 * 60 * 60;
8
8
  const currentTimeStamp = Math.floor(Date.now() / 1e3);
9
9
  const deadline = currentTimeStamp + daysInSeconds;
@@ -11,5 +11,5 @@ var calculateDeadline = (daysFromNow = chunkEWJDKRSY_js.DEFAULT_DEADLINE) => {
11
11
  };
12
12
 
13
13
  exports.calculateDeadline = calculateDeadline;
14
- //# sourceMappingURL=chunk-WWTNCRXX.js.map
15
- //# sourceMappingURL=chunk-WWTNCRXX.js.map
14
+ //# sourceMappingURL=chunk-RSQQMUEQ.js.map
15
+ //# sourceMappingURL=chunk-RSQQMUEQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/time.ts"],"names":["DEFAULT_DEADLINE"],"mappings":";;;;;AAoBO,IAAM,iBAAA,GAAoB,CAAC,WAAA,GAAcA,iCAAA,KAAqB;AAEnE,EAAA,MAAM,aAAA,GAAgB,WAAA,GAAc,EAAA,GAAK,EAAA,GAAK,EAAA;AAG9C,EAAA,MAAM,mBAAmB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAGrD,EAAA,MAAM,WAAW,gBAAA,GAAmB,aAAA;AAEpC,EAAA,OAAO,OAAO,QAAQ,CAAA;AACxB","file":"chunk-WWTNCRXX.js","sourcesContent":["/**\n * @fileoverview Utility functions for time-related operations\n */\n\nimport { DEFAULT_DEADLINE } from \"../constants\";\n\n/**\n * Calculates a deadline timestamp in seconds from the current time\n *\n * @param {number} [daysFromNow=DEFAULT_DEADLINE] - Number of days from now to set the deadline\n * @returns {number} Unix timestamp in seconds representing the deadline\n *\n * @example\n * // Returns a timestamp 3 days from now (in seconds)\n * const threeDay = calculateDeadline();\n *\n * @example\n * // Returns a timestamp 7 days from now (in seconds)\n * const weekDeadline = calculateDeadline(7);\n */\nexport const calculateDeadline = (daysFromNow = DEFAULT_DEADLINE) => {\n // Get days in seconds\n const daysInSeconds = daysFromNow * 24 * 60 * 60;\n\n // Get current timestamp in seconds\n const currentTimeStamp = Math.floor(Date.now() / 1000);\n\n // Calculate deadline (current time + 3 days in seconds)\n const deadline = currentTimeStamp + daysInSeconds;\n\n return BigInt(deadline);\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/time.ts"],"names":["DEFAULT_DEADLINE"],"mappings":";;;;;AAoBO,IAAM,iBAAA,GAAoB,CAAC,WAAA,GAAcA,iCAAA,KAAqB;AAEnE,EAAA,MAAM,aAAA,GAAgB,WAAA,GAAc,EAAA,GAAK,EAAA,GAAK,EAAA;AAG9C,EAAA,MAAM,mBAAmB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAGrD,EAAA,MAAM,WAAW,gBAAA,GAAmB,aAAA;AAEpC,EAAA,OAAO,OAAO,QAAQ,CAAA;AACxB","file":"chunk-RSQQMUEQ.js","sourcesContent":["/**\n * @fileoverview Utility functions for time-related operations\n */\n\nimport { DEFAULT_DEADLINE } from \"../constants\";\n\n/**\n * Calculates a deadline timestamp in seconds from the current time\n *\n * @param {number} [daysFromNow=DEFAULT_DEADLINE] - Number of days from now to set the deadline\n * @returns {number} Unix timestamp in seconds representing the deadline\n *\n * @example\n * // Returns a timestamp 3 days from now (in seconds)\n * const threeDay = calculateDeadline();\n *\n * @example\n * // Returns a timestamp 7 days from now (in seconds)\n * const weekDeadline = calculateDeadline(7);\n */\nexport const calculateDeadline = (daysFromNow = DEFAULT_DEADLINE) => {\n // Get days in seconds\n const daysInSeconds = daysFromNow * 24 * 60 * 60;\n\n // Get current timestamp in seconds\n const currentTimeStamp = Math.floor(Date.now() / 1000);\n\n // Calculate deadline (current time + 3 days in seconds)\n const deadline = currentTimeStamp + daysInSeconds;\n\n return BigInt(deadline);\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { getClient, TellerAbi, AccountantAbi } from './chunk-Y3QNUDV6.mjs';
1
+ import { getClient, TellerAbi, AccountantAbi } from './chunk-VZ3D7CNR.mjs';
2
2
  import 'viem';
3
3
 
4
4
  var getPausedStates = async ({
@@ -42,5 +42,5 @@ var getPreviewFee = async ({
42
42
  };
43
43
 
44
44
  export { getPausedStates, getPreviewFee };
45
- //# sourceMappingURL=chunk-UURNMLRT.mjs.map
46
- //# sourceMappingURL=chunk-UURNMLRT.mjs.map
45
+ //# sourceMappingURL=chunk-RZN7S23Z.mjs.map
46
+ //# sourceMappingURL=chunk-RZN7S23Z.mjs.map