UNPKG

@paxoslabs/earn-sdk

Version:
1 lines 65.9 kB
{"version":3,"sources":["../src/types/earn-sdk-api.ts","../src/lib/vault-cache.ts","../src/api/earn-sdk-client.ts","../src/lib/viem/chains.ts","../src/utils/chain-utils.ts","../src/constants/index.ts"],"names":["chain"],"mappings":"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","file":"chunk-NTRZGVUA.mjs","sourcesContent":["/**\n * Type definitions for Earn 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/earn-sdk-api\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Yield strategy type for a vault\n */\nexport type YieldType = \"PRIME\" | \"TBILL\" | \"LENDING\";\n\n/**\n * Nucleus smart contract configuration for a vault\n *\n * Contains all contract addresses required for vault operations:\n * - boringVaultAddressId: Main vault contract\n * - tellerAddressId: Handles deposits and withdrawals\n * - accountantAddressId: Manages accounting logic\n * - managerAddressId: Controls strategy execution\n * - rolesAuthorityAddressId: Enforces role-based access\n * - baseTokenAddressId: Deposit token address (correlation key with SupportedAsset)\n * - baseTokenStandInId: Optional stand-in token\n * - communityCodeDepositorAddressId: Optional community depositor contract\n */\nexport interface NucleusContracts {\n boringVaultAddressId: Address;\n tellerAddressId: Address;\n accountantAddressId: Address;\n managerAddressId: Address;\n rolesAuthorityAddressId: Address;\n baseTokenAddressId: Address;\n baseTokenStandInId?: Address;\n communityCodeDepositorAddressId?: Address;\n}\n\n/**\n * Earn vault configuration\n *\n * Represents a single vault with contract addresses, yield type, and deposit token.\n * Multiple vaults can share the same baseTokenAddressId (different chains/yield types).\n *\n * @example\n * ```typescript\n * const vault: EarnVault = {\n * id: \"config-eth-prime-001\",\n * chainId: 1,\n * yieldType: \"PRIME\",\n * Nucleus: {\n * boringVaultAddressId: \"0x8a5Fb0Eb3E1a90AF81C5DFF9f2e5D0e7b8D4E5F6\",\n * tellerAddressId: \"0x7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B6C\",\n * accountantAddressId: \"0x6A7B8C9D0E1F2A3B4C5D6E7F8A9B0C1D2E3F4A5B\",\n * managerAddressId: \"0x5A6B7C8D9E0F1A2B3C4D5E6F7A8B9C0D1E2F3A4B\",\n * rolesAuthorityAddressId: \"0x4A5B6C7D8E9F0A1B2C3D4E5F6A7B8C9D0E1F2A3B\",\n * baseTokenAddressId: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\"\n * }\n * };\n * ```\n */\nexport interface EarnVault {\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 /** Token address of supported asset */\n depositTokenAddressId: Address;\n /** Yield strategy type */\n yieldType: YieldType;\n /** Nucleus smart contract addresses */\n Nucleus: NucleusContracts;\n}\n\n/**\n * Supported asset (token) metadata\n *\n * Represents a cryptocurrency token with metadata and chain support.\n * Joins with EarnVault via address == EarnVault.Nucleus.baseTokenAddressId\n *\n * @example\n * ```typescript\n * const asset: SupportedAsset = {\n * address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n * symbol: \"USDC\",\n * name: \"USD Coin\",\n * decimals: 6,\n * supportedChains: [1, 137, 8453, 42161]\n * };\n * ```\n */\nexport interface SupportedAsset {\n /** Token contract address (correlation key with EarnVault.Nucleus.baseTokenAddressId) */\n address: string;\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 /** Array of chain IDs where this token is supported */\n supportedChains: 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?: string;\n}\n\n/**\n * Filter options for asset queries\n *\n * Used to filter supported assets by chain or symbol.\n * All filters are optional and can be combined.\n *\n * @example\n * ```typescript\n * // Get all assets supported on Ethereum\n * const options: AssetFilterOptions = {\n * chainId: 1\n * };\n *\n * // Get USDC asset info\n * const usdcOptions: AssetFilterOptions = {\n * symbol: \"USDC\"\n * };\n * ```\n */\nexport interface AssetFilterOptions {\n /** Filter by chain ID (assets with this chain in supportedChains array) */\n chainId?: number;\n /** Filter by token symbol */\n symbol?: string;\n /** Filter by token address */\n address?: 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}\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","/**\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 type { EarnVault, SupportedAsset } from \"../types/earn-sdk-api\";\nimport { fetchVaults, fetchSupportedAssets } from \"../api/earn-sdk-client\";\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 depositTokenAddressId (baseTokenAddressId)\n * One key can map to multiple vaults (different chains/yield types)\n */\n private vaults: Map<string, EarnVault[]>;\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, EarnVault[]>();\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 (baseTokenAddressId)\n * @returns Array of EarnVault objects, or undefined if not found\n */\n getVault(tokenAddress: string): EarnVault[] | 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 EarnVault objects\n */\n getAllVaults(): EarnVault[] {\n const allVaults: EarnVault[] = [];\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 baseTokenAddressId)\n for (const vault of vaultsData) {\n const tokenAddress = vault.Nucleus.baseTokenAddressId;\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 * Earn SDK API Client\n *\n * Provides functions to fetch vault and asset data from the Earn SDK backend API.\n * Handles input validation, error handling, and response parsing.\n * Includes cache integration for performance optimization.\n *\n * @module api/earn-sdk-client\n */\n\nimport { VaultCache } from \"../lib/vault-cache\";\nimport type {\n AssetFilterOptions,\n EarnVault,\n SupportedAsset,\n VaultFilterOptions,\n WithdrawSupportedAsset,\n YieldType,\n} from \"../types/earn-sdk-api\";\nimport {\n APIError,\n isValidAddress,\n isValidChainId,\n isValidYieldType,\n} from \"../types/earn-sdk-api\";\n\n/**\n * Base URL for the Earn SDK API\n * Hardcoded to localhost for development\n */\nconst API_BASE_URL = \"http://localhost:8500\";\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 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/supported-assets-by-chains\" }\n );\n }\n\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 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 EarnVault response data\n */\nfunction validateEarnVault(data: unknown): data is EarnVault {\n if (!data || typeof data !== \"object\") return false;\n\n const vault = data as Partial<EarnVault>;\n\n // Check required fields\n if (typeof vault.id !== \"string\" || vault.id.length === 0) return false;\n if (!isValidChainId(vault.chainId)) return false;\n if (!isValidYieldType(vault.yieldType)) return false;\n\n // Check Nucleus object\n if (!vault.Nucleus || typeof vault.Nucleus !== \"object\") return false;\n\n const nucleus = vault.Nucleus;\n\n // Check required Nucleus addresses\n if (!isValidAddress(nucleus.boringVaultAddressId)) return false;\n if (!isValidAddress(nucleus.tellerAddressId)) return false;\n if (!isValidAddress(nucleus.accountantAddressId)) return false;\n if (!isValidAddress(nucleus.managerAddressId)) return false;\n if (!isValidAddress(nucleus.rolesAuthorityAddressId)) return false;\n if (!isValidAddress(nucleus.baseTokenAddressId)) return false;\n\n // Check optional Nucleus addresses\n if (\n nucleus.baseTokenStandInId !== undefined &&\n !isValidAddress(nucleus.baseTokenStandInId)\n ) {\n return false;\n }\n\n if (\n nucleus.communityCodeDepositorAddressId !== undefined &&\n !isValidAddress(nucleus.communityCodeDepositorAddressId)\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 supportedChains\n if (\n !Array.isArray(asset.supportedChains) ||\n asset.supportedChains.length === 0\n ) {\n return false;\n }\n\n // Validate each chain ID in supportedChains\n for (const chainId of asset.supportedChains) {\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 EarnVault 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<EarnVault[]> {\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(\"chainId\", options.chainId.toString());\n }\n if (options?.yieldType) {\n params.append(\"yieldType\", options.yieldType);\n }\n if (options?.depositTokenAddress) {\n params.append(\"depositTokenAddress\", options.depositTokenAddress);\n }\n\n const url = `${API_BASE_URL}${endpoint}${params.toString() ? `?${params.toString()}` : \"\"}`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\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: EarnVault[] = [];\n for (let i = 0; i < data.length; i++) {\n const vault = data[i];\n if (!validateEarnVault(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\n * const ethAssets = await fetchSupportedAssets({\n * chainId: 1\n * });\n *\n * // Fetch USDC asset info\n * const usdc = await fetchSupportedAssets({\n * symbol: \"USDC\"\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?.chainId !== undefined) {\n params.append(\"chainId\", options.chainId.toString());\n }\n if (options?.symbol) {\n params.append(\"symbol\", options.symbol);\n }\n if (options?.address) {\n params.append(\"address\", options.address);\n }\n\n const url = `${API_BASE_URL}${endpoint}${params.toString() ? `?${params.toString()}` : \"\"}`;\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\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 (erro