@turtleclub/hooks 0.5.0-beta.100 → 0.5.0-beta.102

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/v2/index.ts","../src/v2/opportunities/queries.ts","../src/v2/lib/api-client.ts","../src/v2/opportunities/schema.ts","../src/v2/supported-tokens/schema.ts","../src/v2/supported-chains/schema.ts","../src/v2/schemas/pagination.ts","../src/v2/supported-chains/api.ts","../src/v2/supported-chains/queries.ts","../src/v2/supported-chains/hooks.ts","../src/v2/lib/query-config.ts","../src/v2/supported-tokens/api.ts","../src/v2/supported-tokens/queries.ts","../src/v2/supported-tokens/hooks.ts","../src/v2/incentives/schema.ts","../src/v2/products/schema.ts","../src/v2/schemas/shared.ts","../src/v2/organizations/schema.ts","../src/v2/organizations/api.ts","../src/v2/organizations/hooks.ts","../src/v2/organizations/queries.ts","../src/v2/streams/hooks.ts","../src/v2/streams/schemas.ts","../src/v2/streams/api.ts","../src/v2/streams/mutations.ts","../src/v2/streams/queries.ts","../src/v2/opportunities/api.ts","../src/v2/earn-opportunities/queries.ts","../src/v2/earn-opportunities/schema.ts","../src/v2/earn-opportunities/api.ts","../src/v2/earn-route/queries.ts","../src/v2/earn-route/schema.ts","../src/v2/earn-route/api.ts","../src/v2/earn-membership/queries.ts","../src/v2/earn-membership/schema.ts","../src/v2/earn-membership/api.ts","../src/v2/earn-deposits/queries.ts","../src/v2/earn-deposits/schema.ts","../src/v2/earn-deposits/api.ts","../src/v2/earn-actions/queries.ts","../src/v2/products/queries.ts","../src/v2/products/api.ts","../src/v2/enso-balances/queries.ts","../src/v2/enso-balances/schemas.ts","../src/v2/enso-balances/api.ts","../src/v2/widget/queries.ts","../src/v2/widget/schema.ts","../src/v2/opportunities/hooks.ts","../src/v2/widget/api.ts","../src/v2/users/queries.ts","../src/v2/users/schemas.ts","../src/v2/users/api.ts","../src/v2/nfts/queries.ts","../src/v2/nfts/api.ts","../src/v2/covers/queries.ts","../src/v2/covers/schema.ts","../src/v2/covers/api.ts","../src/v2/balance/queries.ts","../src/v2/balance/schema.ts","../src/v2/balance/api.ts","../src/v2/deposits/queries.ts","../src/v2/deposits/schemas.ts","../src/v2/deposits/api.ts","../src/v2/incentives/queries.ts","../src/v2/incentives/api.ts","../src/v2/liquidity-providers/queries.ts","../src/v2/liquidity-providers/schema.ts","../src/v2/liquidity-providers/api.ts","../src/v2/geocheck/queries.ts","../src/v2/geocheck/schema.ts","../src/v2/geocheck/api.ts","../src/v2/org-leaderboard/queries.ts","../src/v2/org-leaderboard/schema.ts","../src/v2/org-leaderboard/api.ts","../src/v2/earn-opportunities/hooks.ts","../src/v2/earn-route/hooks.ts","../src/v2/earn-membership/hooks.ts","../src/v2/earn-deposits/hooks.ts","../src/v2/earn-deposits/hooks/useDepositValidation.ts","../src/v2/earn-deposits/hooks/utils.ts","../src/v2/earn-deposits/hooks/useDepositSelection.ts","../src/v2/balance/hooks/useTokenBalance.ts","../src/v2/earn-deposits/hooks/useDepositFlow.ts","../src/v2/earn-actions/useEarnDeposit.ts","../src/v2/earn-actions/hooks.ts","../src/v2/earn-actions/schema.ts","../src/v2/earn-actions/api.ts","../src/v2/earn-deposits/hooks/useActionsDefaultParams.ts","../src/v2/balance/hooks/useGetOnChainBalance.ts","../src/v2/balance/hooks/useBalance.ts","../src/v2/balance/hooks/usePortfolioBalance.ts","../src/v2/balance/types.ts","../src/v2/balance/utils.ts","../src/v2/balance/constants.ts","../src/v2/earn-actions/useEarnWithdraw.ts","../src/v2/earn-withdrawals/hooks/useWithdrawSelection.ts","../src/v2/earn-withdrawals/hooks/useWithdrawValidation.ts","../src/v2/earn-withdrawals/hooks/useWithdrawFlow.ts","../src/v2/enso-balances/hooks.ts","../src/v2/products/hooks.ts","../src/v2/balance/hooks/useEnsoBalances.ts","../src/v2/widget/hooks.ts","../src/v2/geocheck/hooks.ts","../src/v2/swap/useSwapRoute.ts","../src/v2/swap/route-processor.ts","../src/v2/users/hooks.ts","../src/v2/nfts/hooks.ts","../src/v2/covers/hooks.ts","../src/v2/membership-flow/hooks.ts","../src/v2/incentives/hooks.ts","../src/v2/distributors/hooks.ts","../src/v2/distributors/schema.ts","../src/v2/distributors/api.ts","../src/v2/liquidity-providers/hooks.ts","../src/v2/org-leaderboard/hooks.ts","../src/v2/lib/turtle-provider.tsx"],"sourcesContent":["// V2 exports\nexport * from \"./v2\";\n","import { mergeQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { opportunitiesQueries } from \"./opportunities/queries\";\nimport { earnOpportunitiesQueries } from \"./earn-opportunities/queries\";\nimport { earnRouteQueries } from \"./earn-route/queries\";\nimport { earnMembershipQueries } from \"./earn-membership/queries\";\nimport { earnDepositsQueries } from \"./earn-deposits/queries\";\nimport { earnActionsQueries } from \"./earn-actions/queries\";\nimport { productsQueries } from \"./products/queries\";\nimport { ensoBalancesQueries } from \"./enso-balances/queries\";\nimport { widgetQueries } from \"./widget/queries\";\nimport { streamsQueries } from \"./streams/queries\";\nimport { supportedChainsQueries } from \"./supported-chains/queries\";\nimport { supportedTokensQueries } from \"./supported-tokens/queries\";\nimport { usersQueries } from \"./users/queries\";\nimport { nftsQueries } from \"./nfts/queries\";\nimport { coversQueries } from \"./covers/queries\";\nimport { balanceQueries } from \"./balance/queries\";\nimport { depositsQueries } from \"./deposits/queries\";\nimport { incentivesQueries } from \"./incentives/queries\";\nimport { liquidityProvidersQueries } from \"./liquidity-providers/queries\";\nimport { geocheckQueries } from \"./geocheck/queries\";\n\n// Org leaderboard\nimport { orgLeaderboardQueries } from \"./org-leaderboard/queries\";\n\n// Merged query keys for cache invalidation\nexport const queries = mergeQueryKeys(\n opportunitiesQueries,\n earnOpportunitiesQueries,\n earnRouteQueries,\n earnMembershipQueries,\n earnDepositsQueries,\n earnActionsQueries,\n productsQueries,\n ensoBalancesQueries,\n widgetQueries,\n streamsQueries,\n supportedChainsQueries,\n supportedTokensQueries,\n usersQueries,\n nftsQueries,\n coversQueries,\n balanceQueries,\n depositsQueries,\n incentivesQueries,\n liquidityProvidersQueries,\n geocheckQueries,\n orgLeaderboardQueries\n);\n\n// Features - Earn API\nexport * from \"./earn-opportunities\";\nexport * from \"./earn-route\";\nexport * from \"./earn-membership\";\nexport * from \"./earn-deposits\";\nexport * from \"./earn-actions\";\nexport * from \"./earn-withdrawals\";\nexport * from \"./enso-balances\";\n\n// Features\nexport * from \"./opportunities\";\nexport * from \"./products\";\nexport * from \"./balance\";\nexport * from \"./widget\";\nexport * from \"./supported-chains\";\nexport * from \"./supported-tokens\";\nexport * from \"./geocheck\";\nexport * from \"./streams\";\nexport * from \"./swap\";\nexport * from \"./users\";\nexport * from \"./nfts\";\nexport * from \"./covers\";\nexport * from \"./membership-flow\";\nexport * from \"./organizations\";\nexport * from \"./incentives\";\nexport * from \"./distributors\";\nexport * from \"./liquidity-providers\";\nexport * from \"./org-leaderboard\";\n// export * from \"./deposits\"; // Resolve conflicts\n\n// Shared schemas\nexport * from \"./schemas/shared\";\n\n// Provider & Client\nexport { TurtleHooksProvider } from \"./lib/turtle-provider\";\nexport type { TurtleHooksProviderProps } from \"./lib/turtle-provider\";\nexport { apiClient, ApiError } from \"./lib/api-client\";\nexport type { ApiClientConfig, ApiClientOptions, ApiDomain } from \"./lib/api-client\";\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport {\n getOpportunities,\n getOpportunityById,\n getOpportunitiesPaginated,\n getOpportunitiesFilterOptions,\n} from \"./api\";\nimport type {\n OpportunityFilters,\n GetOpportunitiesPaginatedInput,\n GetOpportunityByIdInput,\n} from \"./schema\";\n\nexport const opportunitiesQueries = createQueryKeys(\"opportunities\", {\n // Get all opportunities (no filters)\n all: {\n queryKey: null,\n queryFn: () => getOpportunities(),\n },\n\n // Get opportunities with filters\n list: (filters?: OpportunityFilters) => ({\n queryKey: [{ filters }],\n queryFn: () => getOpportunities(filters),\n }),\n\n // Get single opportunity by ID\n byId: (id: string, query?: GetOpportunityByIdInput) => ({\n queryKey: [id],\n queryFn: () => getOpportunityById(id, query),\n }),\n\n // Get paginated opportunities\n paginated: (params?: GetOpportunitiesPaginatedInput) => ({\n queryKey: [{ params }],\n queryFn: () => getOpportunitiesPaginated(params),\n }),\n\n // Get filter options for opportunities\n filterOptions: {\n queryKey: null,\n queryFn: () => getOpportunitiesFilterOptions(),\n },\n});\n","export const API_BASE_URL = \"https://api.turtle.xyz\";\nexport const EARN_BASE_URL = \"https://earn.turtle.xyz\";\n\nexport type ApiDomain = \"api\" | \"earn\";\n\nexport interface ApiClientConfig {\n apiUrl?: string;\n earnUrl?: string;\n getToken?: () => string | null;\n earnApiKey?: string;\n debug?: boolean;\n disableGeocheck?: boolean;\n}\n\nexport interface ApiClientOptions extends Omit<RequestInit, \"body\"> {\n debug?: boolean;\n domain?: ApiDomain;\n body?: unknown;\n}\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public response?: unknown\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nclass ApiClient {\n private static instance: ApiClient;\n private config: ApiClientConfig = {};\n\n static getInstance(): ApiClient {\n if (!ApiClient.instance) {\n ApiClient.instance = new ApiClient();\n }\n return ApiClient.instance;\n }\n\n configure(config: ApiClientConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): ApiClientConfig {\n return this.config;\n }\n\n private getBaseUrl(domain: ApiDomain): string {\n if (domain === \"earn\") {\n return this.config.earnUrl || EARN_BASE_URL;\n }\n return this.config.apiUrl || API_BASE_URL;\n }\n\n async fetch<T = unknown>(endpoint: string, options?: ApiClientOptions): Promise<T> {\n const { domain = \"api\", debug = this.config.debug, body, ...fetchOptions } = options ?? {};\n\n const baseUrl = this.getBaseUrl(domain);\n const url = `${baseUrl}${endpoint}`;\n const token = this.config.getToken?.();\n\n const isFormData = body instanceof FormData;\n\n const headers: HeadersInit = {\n // Don't set Content-Type for FormData - browser sets it with boundary\n ...(!isFormData && { \"Content-Type\": \"application/json\" }),\n ...fetchOptions.headers,\n };\n\n if (token) {\n (headers as Record<string, string>)[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Add API key for Earn domain requests\n if (domain === \"earn\" && this.config.earnApiKey) {\n (headers as Record<string, string>)[\"X-API-Key\"] = this.config.earnApiKey;\n }\n\n if (debug) {\n console.log(\"[ApiClient Request]\", {\n method: fetchOptions.method ?? \"GET\",\n url,\n headers,\n body: isFormData ? \"[FormData]\" : body,\n });\n }\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n body: body ? (isFormData ? body : JSON.stringify(body)) : undefined,\n });\n\n const data = await response.json();\n\n if (debug) {\n console.log(\"[ApiClient Response]\", {\n status: response.status,\n ok: response.ok,\n data,\n });\n }\n\n if (!response.ok) {\n throw new ApiError(\n `API error: ${response.status} ${response.statusText}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } catch (error) {\n if (debug) {\n console.error(\"[ApiClient Error]\", error);\n }\n\n if (error instanceof ApiError) {\n throw error;\n }\n\n throw new ApiError(error instanceof Error ? error.message : \"Unknown error\", 0, error);\n }\n }\n}\n\nexport const apiClient = ApiClient.getInstance();\n","import { z } from \"zod\";\nimport { tokenSchema } from \"../supported-tokens\";\nimport { incentiveSchema } from \"../incentives/schema\";\nimport { productSchema } from \"../products/schema\";\nimport { lendingConfigSchema, stakingConfigSchema, vaultConfigSchema } from \"../schemas/shared\";\nimport { streamSchema } from \"../streams\";\n\n// Opportunity Type Enum\nconst opportunityTypeEnum = z.enum([\"vault\", \"lending\", \"staking\", \"stablecoin\", \"draft\", \"\"]);\n\n// Opportunity Status Enum\nconst opportunityStatusEnum = z.enum([\"active\", \"paused\", \"deprecated\", \"draft\", \"ended\"]);\n\n// Main Opportunity Schema - matching backend API exactly\nexport const opportunitySchema = z.object({\n id: z.string().uuid().optional(),\n name: z.string(),\n shortName: z.string(),\n type: opportunityTypeEnum,\n description: z.string().optional().default(\"\"),\n curator: z.string().optional().default(\"\"),\n tvl: z.number().min(0, \"TVL must be positive\"),\n featured: z.boolean().optional().default(false),\n featuredOrder: z.number().int().optional().nullable(),\n originalConfig: z.any().optional().nullable(),\n exposures: z.array(z.string()).optional().default([]),\n tags: z.array(z.any()).optional().default([]),\n status: opportunityStatusEnum.optional().default(\"active\"),\n statusReason: z.string().optional().default(\"\"),\n depositDisabled: z.boolean().optional().default(false),\n depositDisabledReason: z.string().optional().default(\"\"),\n withdrawalDisabled: z.boolean().optional().default(false),\n withdrawalDisabledReason: z.string().optional().default(\"\"),\n docsUrl: z.string().optional().nullable(),\n auditsUrl: z.string().optional().nullable(),\n turtleTvl: z.number(),\n turtleUsers: z.number(),\n earnEnabled: z.boolean(),\n swapDirectEnabled: z.boolean().optional().default(true),\n swapRouteEnabled: z.boolean().optional().default(false),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n mainStreamId: z.string().optional(),\n\n // Relationships\n depositTokens: z.array(tokenSchema),\n withdrawTokens: z.array(tokenSchema).optional().default([]),\n baseTokens: tokenSchema,\n receiptToken: tokenSchema,\n incentives: z.array(incentiveSchema),\n products: z.array(productSchema),\n vaultConfig: vaultConfigSchema.optional().nullable(),\n lendingConfig: lendingConfigSchema.optional().nullable(),\n stakingConfig: stakingConfigSchema.optional().nullable(),\n mainStream: streamSchema.optional().nullable(),\n\n // Will be deprecated\n exposure: z.array(z.string()),\n explorerUrl: z.string().nullable(),\n});\n\nexport const opportunityFiltersSchema = z.object({\n tokenId: z.string().uuid().optional(),\n chain: z.string().optional(),\n productId: z.string().uuid().optional(),\n tags: z.string().optional(),\n withMainStream: z.boolean().optional(),\n});\nexport type OpportunityFilters = z.infer<typeof opportunityFiltersSchema>;\n\nexport const opportunitiesResponseSchema = z.object({\n opportunities: z.array(opportunitySchema),\n total: z.number().optional(),\n});\n\nexport type OpportunitiesResponse = z.infer<typeof opportunitiesResponseSchema>;\n\nexport const getOpportunitiesPaginatedInputSchema = z.object({\n page: z.number().min(1).default(1),\n limit: z.number().min(1).max(100).default(10),\n // Sorting\n sortBy: z\n .enum([\n \"turtleTvl\",\n \"tvl\",\n \"name\",\n \"turtleUsers\",\n \"type\",\n \"organization\",\n \"curator\",\n \"provider\",\n \"apr\",\n ])\n .optional(),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional(),\n // Filter by receipt token chain (comma-separated)\n receiptTokenChainId: z.string().optional(), // Comma-separated UUIDs\n receiptTokenChainSlug: z.string().optional(), // Comma-separated slugs\n // Filter by deposit token\n depositTokenGroup: z.string().optional(),\n depositTokenSymbols: z.string().optional(), // Comma-separated symbols\n depositTokenChainId: z.string().optional(),\n // Filter by tags (comma-separated)\n tags: z.string().optional(),\n // Filter by IDs (comma-separated UUIDs)\n productId: z.string().optional(), // Comma-separated UUIDs\n curatorId: z.string().optional(), // Comma-separated UUIDs\n providerId: z.string().optional(), // Comma-separated UUIDs\n partnerId: z.string().optional(), // Comma-separated UUIDs\n lendingProtocolId: z.string().optional(), // Comma-separated UUIDs\n // Status filters\n withdrawalDisabled: z.boolean().optional(),\n depositDisabled: z.boolean().optional(),\n status: z.string().optional(),\n earnEnabled: z.boolean().optional(),\n featured: z.boolean().optional(),\n // TVL filters\n tvlGreaterThan: z.number().optional(),\n turtleTvlGreaterThan: z.number().optional(),\n tvlMin: z.number().optional(),\n tvlMax: z.number().optional(),\n // APR filters\n minApr: z.number().optional(),\n maxApr: z.number().optional(),\n // Chain IDs (comma-separated)\n chainIds: z.string().optional(),\n // Search\n search: z.string().optional(),\n withMainStream: z.boolean().optional(),\n});\n\nexport type GetOpportunitiesPaginatedInput = z.infer<typeof getOpportunitiesPaginatedInputSchema>;\n\nconst paginationMetadataSchema = z.object({\n page: z.number(),\n limit: z.number(),\n total: z.number(),\n totalPages: z.number(),\n});\n\nexport const getOpportunitiesPaginatedSchema = z.object({\n opportunities: z.array(opportunitySchema),\n pagination: paginationMetadataSchema,\n});\n\nexport type GetOpportunitiesPaginatedResponse = z.infer<typeof getOpportunitiesPaginatedSchema>;\n\nconst filterChainSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n slug: z.string(),\n chainId: z.string(),\n logoUrl: z.string(),\n ecosystem: z.string(),\n status: z.string(),\n explorerUrl: z.string(),\n});\n\nexport const filterOrganizationSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n description: z.string(),\n landingUrl: z.string(),\n iconUrl: z.string(),\n organizationType: z.string(),\n turtleRefCode: z.string(),\n twitterHandle: z.string(),\n status: z.string(),\n featured: z.boolean(),\n});\n\nexport const filterTagSchema = z.object({\n id: z.string().uuid(),\n code: z.string(),\n name: z.string(),\n description: z.string().optional().nullable(),\n color: z.string().optional().nullable(),\n type: z.string().optional().nullable(),\n});\n\nconst depositTokenSymbolSchema = z.object({\n symbol: z.string(),\n logoUrl: z.string(),\n});\n\nexport const getOpportunitiesFilterOptionsSchema = z.object({\n chains: z.array(filterChainSchema),\n providers: z.array(filterOrganizationSchema),\n curators: z.array(filterOrganizationSchema).optional().nullable(),\n partners: z.array(filterOrganizationSchema).optional().nullable(),\n tags: z.array(filterTagSchema).optional().nullable(),\n lendingProtocols: z.array(filterOrganizationSchema),\n depositTokenSymbols: z.array(depositTokenSymbolSchema).optional().nullable(),\n});\n\nexport type GetOpportunitiesFilterOptionsResponse = z.infer<\n typeof getOpportunitiesFilterOptionsSchema\n>;\n\nexport const getOpportunityByIdInputSchema = z.object({\n withMainStream: z.boolean().optional(),\n});\n\nexport type GetOpportunityByIdInput = z.infer<typeof getOpportunityByIdInputSchema>;\n\nexport type Opportunity = z.infer<typeof opportunitySchema>;\n","import { z } from \"zod\";\nimport { chainSchema } from \"../supported-chains\";\n\nconst uuidSchema = z.string().uuid();\n\nexport const tokenSchema = z.object({\n id: uuidSchema,\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().int().nonnegative(),\n isNative: z.boolean(),\n logoUrl: z.string().optional(),\n chain: chainSchema,\n priceUsd: z.number().optional(),\n canonicalAssetId: uuidSchema.optional(),\n streamsMinAmount: z.string().nullable().optional(),\n totalTurtleTvl: z.number().optional(),\n price: z.string().optional(),\n amount: z.string().optional(),\n rawAmount: z.string().optional(),\n});\n\n// Supported token schema - extends base token with active field\nexport const supportedTokenSchema = tokenSchema.extend({\n active: z.boolean(),\n});\n\n// Supported tokens response schema\nexport const supportedTokensResponseSchema = z.object({\n tokens: z.array(supportedTokenSchema),\n total: z.number().optional(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n});\n\n// Supported token filters\nexport interface SupportedTokenFilters {\n chainId?: string;\n offset?: number;\n limit?: number;\n search?: string;\n ids?: string[];\n withStreamsMinAmount?: boolean;\n}\n\n// Types\nexport type Token = z.infer<typeof tokenSchema>;\nexport type SupportedToken = z.infer<typeof supportedTokenSchema>;\nexport type SupportedTokensResponse = z.infer<typeof supportedTokensResponseSchema>;\n","import { z } from \"zod\";\nimport { paginationMetadataSchema } from \"../schemas/pagination\";\n\nexport const supportedChainEcosystemSchema = z.enum([\"evm\", \"solana\"]);\nexport const supportedChainStatusSchema = z.enum([\"active\", \"inactive\"]);\n\nexport const chainSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n slug: z.string().optional(),\n chainId: z.string(),\n isTestnet: z.boolean().optional(),\n logoUrl: z.string().optional(),\n ecosystem: supportedChainEcosystemSchema.optional(),\n status: supportedChainStatusSchema.optional(),\n explorerUrl: z.string().optional(),\n});\n\n// Input schema for GET /turtle/chains\nexport const getSupportedChainsInputSchema = z.object({\n page: z.number().min(1).default(1).optional(),\n limit: z.number().min(1).max(100).default(50).optional(),\n // Sorting\n sortBy: z.enum([\"name\", \"chainId\", \"ecosystem\", \"slug\"]).optional(),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional(),\n // Filters\n ecosystem: z.string().optional(), // Filter by ecosystem\n status: z.string().optional(), // Filter by status\n chainId: z.string().optional(), // Filter by specific chainId\n slug: z.string().optional(), // Filter by slug\n search: z.string().optional(), // Search by name or slug\n});\n\nexport type GetSupportedChainsInput = z.infer<typeof getSupportedChainsInputSchema>;\n\n// Supported chains response schema with pagination\nexport const supportedChainsResponseSchema = z.object({\n chains: z.array(chainSchema),\n pagination: paginationMetadataSchema.optional(),\n});\n\n// Types\nexport type Chain = z.infer<typeof chainSchema>;\nexport type SupportedChainsResponse = z.infer<typeof supportedChainsResponseSchema>;\n","import { z } from \"zod\";\n\n// Pagination metadata schema used across hooks. Kept in a separate module to\n// avoid circular dependencies between shared schemas and feature schemas.\nexport const paginationMetadataSchema = z.object({\n page: z.number().int().min(1).catch(1),\n limit: z.number().int().min(1).max(100),\n total: z.number().int().min(0),\n total_pages: z.number().int().min(1).optional(),\n has_next: z.boolean().optional(),\n has_previous: z.boolean().optional(),\n});\n\nexport type PaginationMetadata = z.infer<typeof paginationMetadataSchema>;\n\n","import { apiClient } from \"../lib/api-client\";\nimport type { GetSupportedChainsInput, SupportedChainsResponse } from \"./schema\";\nimport { supportedChainsResponseSchema } from \"./schema\";\n\n// GET /turtle/chains\nexport async function getSupportedChains(\n params?: GetSupportedChainsInput,\n options?: { debug?: boolean }\n): Promise<SupportedChainsResponse> {\n const queryParams = new URLSearchParams();\n\n if (params) {\n // Pagination\n if (params.page !== undefined) queryParams.append(\"page\", params.page.toString());\n if (params.limit !== undefined) queryParams.append(\"limit\", params.limit.toString());\n\n // Sorting\n if (params.sortBy) queryParams.append(\"sortBy\", params.sortBy);\n if (params.sortOrder) queryParams.append(\"sortOrder\", params.sortOrder);\n\n // Filters\n if (params.ecosystem) queryParams.append(\"ecosystem\", params.ecosystem);\n if (params.status) queryParams.append(\"status\", params.status);\n if (params.chainId) queryParams.append(\"chainId\", params.chainId);\n if (params.slug) queryParams.append(\"slug\", params.slug);\n if (params.search) queryParams.append(\"search\", params.search);\n }\n\n const queryString = queryParams.toString();\n const endpoint = `/turtle/chains${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = supportedChainsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse supported chains: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getSupportedChains } from \"./api\";\nimport type { GetSupportedChainsInput } from \"./schema\";\n\nexport const supportedChainsQueries = createQueryKeys(\"supportedChains\", {\n all: (params?: GetSupportedChainsInput, options?: { debug?: boolean }) => ({\n queryKey: [params],\n queryFn: () => getSupportedChains(params, options),\n }),\n});\n","import { useQuery } from \"@tanstack/react-query\";\nimport { supportedChainsQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { PaginationMetadata } from \"../schemas/pagination\";\nimport type { Chain, GetSupportedChainsInput } from \"./schema\";\n\nexport interface UseSupportedChainsOptions extends GetSupportedChainsInput {\n /** Enable debug logging */\n debug?: boolean;\n /** Enable the query (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseSupportedChainsResult {\n /** List of supported chains */\n chains: Chain[];\n /** Pagination metadata */\n pagination?: PaginationMetadata;\n /** Get chain by chainId */\n getChainByChainId: (chainId: string) => Chain | undefined;\n /** Get chain by slug */\n getChainBySlug: (slug: string) => Chain | undefined;\n /** Get chains by ecosystem */\n getChainsByEcosystem: (ecosystem: string) => Chain[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n /** Is fetching (including background refetches) */\n isFetching: boolean;\n}\n\n/**\n * Hook to fetch all supported chains with helper methods\n *\n * @param options - Query options including pagination, sorting, and filtering\n * @returns Chains data with helper methods and query state\n *\n * @example\n * ```typescript\n * // Fetch all chains\n * const { chains, isLoading } = useSupportedChains();\n *\n * // Fetch chains with pagination\n * const { chains, pagination } = useSupportedChains({ page: 1, limit: 20 });\n *\n * // Filter by ecosystem\n * const { chains } = useSupportedChains({ ecosystem: \"evm\" });\n *\n * // Search and sort\n * const { chains } = useSupportedChains({\n * search: \"polygon\",\n * sortBy: \"name\",\n * sortOrder: \"asc\"\n * });\n * ```\n */\nexport function useSupportedChains(options?: UseSupportedChainsOptions): UseSupportedChainsResult {\n const { debug, enabled = true, ...params } = options || {};\n\n const { data, isLoading, error, refetch, isFetching } = useQuery({\n ...supportedChainsQueries.all(params, { debug }),\n ...queryDefaults,\n enabled,\n });\n\n const chains = data?.chains ?? [];\n const pagination = data?.pagination;\n\n return {\n chains,\n pagination,\n getChainByChainId: (chainId: string) => chains.find((chain) => chain.chainId === chainId),\n getChainBySlug: (slug: string) => chains.find((chain) => chain.slug === slug),\n getChainsByEcosystem: (ecosystem: string) =>\n chains.filter((chain) => chain.ecosystem === ecosystem),\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n isFetching,\n };\n}\n","import { QueryFunction, UseQueryOptions } from \"@tanstack/react-query\";\n\n// Default TanStack Query configuration\n// Override per-query as needed\nexport const queryDefaults = {\n staleTime: 5 * 60 * 1000, // 5 minutes - data is fresh\n gcTime: 10 * 60 * 1000, // 10 minutes - cache garbage collection (formerly cacheTime)\n retry: 1, // Retry failed requests once\n refetchOnWindowFocus: false, // Don't refetch on tab focus\n} as const;\n\nexport function createQueryOptions<TData, TError = Error>(\n queryConfig: { queryKey: readonly unknown[]; queryFn: QueryFunction<TData, any> },\n options?: Omit<UseQueryOptions<TData, TError>, \"queryKey\" | \"queryFn\">\n) {\n return {\n ...queryDefaults,\n ...queryConfig,\n ...options,\n } as UseQueryOptions<TData, TError, TData, any>;\n}\n","import { apiClient } from \"../lib/api-client\";\nimport type { SupportedTokenFilters, SupportedTokensResponse } from \"./schema\";\nimport { supportedTokensResponseSchema } from \"./schema\";\n\n// GET /turtle/tokens\nexport async function getSupportedTokens(\n filters?: SupportedTokenFilters,\n options?: { debug?: boolean }\n): Promise<SupportedTokensResponse> {\n const params = new URLSearchParams();\n\n if (filters?.offset !== undefined) params.append(\"offset\", filters.offset.toString());\n if (filters?.limit !== undefined) params.append(\"limit\", filters.limit.toString());\n if (filters?.search) params.append(\"search\", filters.search);\n if (filters?.chainId) params.append(\"chainId\", filters.chainId);\n if (filters?.withStreamsMinAmount) {\n params.append(\"withStreamsMinAmount\", String(filters.withStreamsMinAmount));\n }\n if (filters?.ids?.length) {\n filters.ids.forEach((id) => params.append(\"ids\", id));\n }\n\n const queryString = params.toString();\n const endpoint = `/turtle/tokens${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = supportedTokensResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse supported tokens: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getSupportedTokens } from \"./api\";\nimport type { SupportedTokenFilters } from \"./schema\";\n\nexport const supportedTokensQueries = createQueryKeys(\"supportedTokens\", {\n list: (filters?: SupportedTokenFilters) => ({\n queryKey: [filters],\n queryFn: () => getSupportedTokens(filters),\n }),\n});\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { supportedTokensQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { SupportedToken, SupportedTokenFilters } from \"./schema\";\n\nexport interface UseSupportedTokensOptions extends SupportedTokenFilters {\n enabled?: boolean;\n}\n\nexport interface UseSupportedTokensResult {\n tokens: SupportedToken[];\n total: number;\n limit: number;\n offset: number;\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n getTokenById: (id: string) => SupportedToken | undefined;\n getToken: (address: string, chainId: string) => SupportedToken | undefined;\n}\n\n/**\n * Hook to fetch supported tokens with pagination and search\n */\nexport function useSupportedTokens({\n offset = 0,\n limit = 20,\n search,\n chainId,\n withStreamsMinAmount,\n enabled = true,\n ids = [],\n}: UseSupportedTokensOptions = {}): UseSupportedTokensResult {\n const { data, isLoading, error, refetch } = useQuery({\n ...supportedTokensQueries.list({ offset, limit, search, chainId, withStreamsMinAmount, ids }),\n ...queryDefaults,\n staleTime: 5 * 60 * 1000, // 1 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n refetchOnWindowFocus: false, // Don't refetch on tab focus\n enabled,\n });\n\n const tokens: SupportedToken[] = useMemo(() => {\n if (!data?.tokens) return [];\n return data.tokens;\n }, [data?.tokens]);\n\n return {\n tokens,\n total: data?.total ?? 0,\n limit: data?.limit ?? limit,\n offset: data?.offset ?? offset,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n getTokenById: (id: string) => tokens.find((token) => token.id === id),\n getToken: (address: string, chainId: string) =>\n tokens.find(\n (token) =>\n token.address.toLowerCase() === address.toLowerCase() && token.chain.chainId === chainId\n ),\n };\n}\n","import { z } from \"zod\";\n\n// Incentive schema\nexport const incentiveSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n description: z.string(),\n iconUrl: z.string(),\n rewardType: z.string(),\n rewardTypeName: z.string(),\n boostPct: z.number().nullable(),\n totalCapacity: z.number().nullable(),\n maxCapacityPerLP: z.number().nullable(),\n lockup: z.string().nullable(),\n minCommitment: z.number().nullable(),\n baseYieldTarget: z.number().nullable(),\n baseYieldSource: z.string().nullable(),\n incentiveYieldTarget: z.number().nullable(),\n fdvEstimate: z.number().nullable(),\n isIncentiveYieldGuaranteed: z.boolean().nullable(),\n tokenSupplyAllocation: z.number().nullable(),\n yield: z.number().nullable(),\n indexed: z.boolean().nullable(),\n minApr: z.number().nullable().optional(),\n maxApr: z.number().nullable().optional(),\n});\n\n// Create Incentive Input schema\nexport const createIncentiveInputSchema = incentiveSchema.omit({\n id: true,\n});\n\n// Update Incentive Input schema\nexport const updateIncentiveInputSchema = incentiveSchema.partial().extend({\n id: z.string().uuid(),\n});\n\n// Incentives Response schema\nexport const incentivesResponseSchema = z.object({\n incentives: z.array(incentiveSchema),\n total: z.number().optional(),\n});\n\n// Upload Icon Request schema\nexport const uploadIncentiveIconRequestSchema = z.object({\n file: z.object({\n name: z.string(),\n size: z.number().positive(),\n type: z.string().refine((type) => type.startsWith(\"image/\"), {\n message: \"File must be an image type\",\n }),\n lastModified: z.number().optional(),\n }),\n filename: z.string().optional(),\n overwrite: z.boolean().optional(),\n});\n\n// Upload Icon Response schema\nexport const uploadIncentiveIconResponseSchema = z.object({\n publicUrl: z.string().url(),\n});\n\n// Type exports\nexport type Incentive = z.infer<typeof incentiveSchema>;\nexport type CreateIncentiveInput = z.infer<typeof createIncentiveInputSchema>;\nexport type UpdateIncentiveInput = z.infer<typeof updateIncentiveInputSchema>;\nexport type IncentivesResponse = z.infer<typeof incentivesResponseSchema>;\nexport type IncentiveResponse = z.infer<typeof incentiveSchema>;\nexport type UploadIncentiveIconRequest = z.infer<typeof uploadIncentiveIconRequestSchema>;\nexport type UploadIncentiveIconResponse = z.infer<typeof uploadIncentiveIconResponseSchema>;\n","import { z } from \"zod\";\n\n// Enum schemas\nconst productTypeSchema = z.enum([\"deal\", \"campaign\"]);\n\nconst productStatusSchema = z.enum([\"draft\", \"active\", \"paused\", \"ended\"]);\n\n// TurtleOrganization schema\nconst turtleOrganizationSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n iconUrl: z.string(),\n landingUrl: z.string(),\n});\n\n// Product schema\nexport const productSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n title: z.string(),\n subtitle: z.string(),\n description: z.string(),\n logoUrl: z.string(),\n productUrl: z.string(),\n startedAt: z.string().optional().nullable(),\n endedAt: z.string().optional().nullable(),\n status: productStatusSchema,\n productType: productTypeSchema,\n organization: turtleOrganizationSchema.nullable(),\n opportunities: z.lazy(() => z.array(z.any())).nullish(),\n createdAt: z.string(),\n});\n\n// Create Product Request schema\nexport const createProductInputSchema = z.object({\n product: productSchema.omit({\n id: true,\n createdAt: true,\n organization: true,\n }),\n organizationId: z.string().uuid(),\n});\n// Update Product Request schema\nexport const updateProductInputSchema = z.object({\n product: productSchema.partial().omit({\n organization: true,\n }),\n // organizationId: z.string().uuid(),\n});\n\nexport const productsResponseSchema = z.object({\n products: z.array(productSchema),\n total: z.number().optional(),\n});\n\nexport const productResponseSchema = z.object({\n product: productSchema,\n stats: z\n .object({\n totalUsers: z.number(),\n activeUsers: z.number(),\n })\n .optional(),\n});\n\nexport const createProductResponseSchema = z.object({\n id: z.string().uuid(),\n});\n\nexport const updateProductResponseSchema = z.object({\n success: z.boolean(),\n});\n\n// File validation schema for multipart file upload\nconst fileSchema = z.any().refine((value) => {\n if (!value) return false;\n if (!(value instanceof File)) return false;\n if (value.size > 10 * 1024 * 1024) return false;\n return true;\n}, \"Invalid file\");\n\n// Request schema for UploadProductLogoHandler\nexport const uploadProductLogoRequestSchema = z.object({\n // Form data - file upload (required)\n file: fileSchema,\n\n // Form data - optional filename override\n filename: z.string().optional(),\n});\n\n// Response schema for UploadProductLogoHandler\nexport const uploadProductLogoResponseSchema = z.object({\n url: z.string().url(),\n error: z.string().optional(),\n});\n\nexport const productFiltersSchema = z.object({\n organizationId: z.string().uuid().optional(),\n});\nexport type ProductFilters = z.infer<typeof productFiltersSchema>;\n\n// Type exports\nexport type ProductsResponse = z.infer<typeof productsResponseSchema>;\nexport type ProductResponse = z.infer<typeof productResponseSchema>;\nexport type UpdateProductResponse = z.infer<typeof updateProductResponseSchema>;\nexport type CreateProductResponse = z.infer<typeof createProductResponseSchema>;\nexport type CreateProductInput = z.infer<typeof createProductInputSchema>;\nexport type UpdateProductInput = z.infer<typeof updateProductInputSchema>;\nexport type Product = z.infer<typeof productSchema>;\nexport type ProductType = z.infer<typeof productTypeSchema>;\nexport type ProductStatus = z.infer<typeof productStatusSchema>;\nexport type TurtleOrganization = z.infer<typeof turtleOrganizationSchema>;\nexport type UploadProductLogoRequest = z.infer<typeof uploadProductLogoRequestSchema>;\nexport type UploadProductLogoResponse = z.infer<typeof uploadProductLogoResponseSchema>;\n","import { z } from \"zod\";\nimport { organizationSchema } from \"../organizations\";\nimport { chainSchema } from \"../supported-chains\";\nimport type { PaginationMetadata } from \"./pagination\";\n\n// Vault Configuration Schema - matching backend\nexport const vaultConfigSchema = z.object({\n id: z.string().uuid().optional(),\n infraProvider: organizationSchema.optional().nullable(),\n curator: organizationSchema.optional().nullable(),\n withdrawalCooldownSecs: z.number().int().min(0).optional().nullable(),\n withdrawalContractAddress: z.string().optional().nullable(),\n withdrawalDetails: z.any().optional().nullable(),\n depositUrl: z.string().optional().nullable(),\n providerMetadata: z.any().optional().nullable(),\n performanceFee: z.number().min(0).max(100).optional().nullable(),\n managementFee: z.number().min(0).max(100).optional().nullable(),\n depositFee: z.number().min(0).max(100).optional().nullable(),\n withdrawalFee: z.number().min(0).max(100).optional().nullable(),\n minDepositAmount: z.number().optional().nullable(),\n minDepositValueUSD: z.number().optional().nullable(),\n depositCapAmount: z.number().optional().nullable(),\n depositCapValueUSD: z.number().optional().nullable(),\n depositFillSecs: z.number().int().optional().nullable(),\n lockupPeriodSecs: z.number().int().optional().nullable(),\n asyncDeposit: z.boolean().optional().nullable(),\n asyncWithdraw: z.boolean().optional().nullable(),\n secondaryOnly: z.boolean().optional().nullable(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\n\n// Lending Configuration Schema - matching backend\nexport const lendingConfigSchema = z.object({\n id: z.string().uuid(),\n protocol: organizationSchema.optional(),\n curator: organizationSchema.optional(),\n marketAddress: z.string().optional(),\n depositUrl: z.string().optional().nullable(),\n providerMetadata: z.any().optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\n// Staking Configuration Schema - matching backend\nexport const stakingConfigSchema = z.object({\n id: z.string().uuid(),\n protocol: organizationSchema.optional(),\n chainId: z.string().uuid().optional(),\n chain: chainSchema.optional(),\n stakingContractAddress: z.string().optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\nexport type VaultConfig = z.infer<typeof vaultConfigSchema>;\nexport type LendingConfig = z.infer<typeof lendingConfigSchema>;\nexport type { PaginationMetadata };\n","import { z } from \"zod\";\n\nexport const organizationSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional().nullable(),\n landingUrl: z.string().optional().nullable(),\n iconUrl: z.string().optional().nullable(),\n organizationType: z.string().optional().nullable(),\n organizationPermissions: z\n .array(\n z.object({\n id: z.string().uuid(),\n permissionId: z.string().uuid(),\n status: z.enum([\"pending\", \"approved\", \"rejected\", \"revoked\"]),\n permissionName: z.string(),\n })\n )\n .optional(),\n turtleRefCode: z.string().optional().nullable(),\n twitterHandle: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n featured: z.boolean().optional().nullable(),\n});\n\n// Request Schema (Path Parameter)\nexport const LeaveOrganizationInputSchema = z.object({\n organizationId: z.string().uuid(),\n});\n\nexport type LeaveOrganizationInput = z.infer<typeof LeaveOrganizationInputSchema>;\n\n// Response Schema\nexport const LeaveOrganizationOutputSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n});\n\nexport type LeaveOrganizationOutput = z.infer<typeof LeaveOrganizationOutputSchema>;\n\nexport type Organization = z.infer<typeof organizationSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n LeaveOrganizationInput,\n LeaveOrganizationOutput,\n LeaveOrganizationOutputSchema,\n} from \"./schema\";\n\n// POST /organization/{organizationId}/leave\nexport async function leaveOrganization(\n input: LeaveOrganizationInput\n): Promise<LeaveOrganizationOutput> {\n const endpoint = `/organization/${input.organizationId}/leave`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n });\n\n // Validate response with Zod\n const result = LeaveOrganizationOutputSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse leave organization response: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { leaveOrganization } from \"./api\";\nimport type { LeaveOrganizationInput, LeaveOrganizationOutput } from \"./schema\";\n\nexport interface UseLeaveOrganizationOptions extends Omit<\n UseMutationOptions<LeaveOrganizationOutput, Error, LeaveOrganizationInput>,\n \"mutationFn\"\n> {}\n\n/**\n * Hook for leaving an organization\n *\n * @example\n * ```tsx\n * function LeaveOrganizationButton({ organizationId }: { organizationId: string }) {\n * const leaveOrganization = useLeaveOrganization({\n * onSuccess: (data) => {\n * console.log(\"Successfully left organization\", data);\n * // Navigate away or show success message\n * },\n * onError: (error) => {\n * console.error(\"Failed to leave organization\", error);\n * }\n * });\n *\n * return (\n * <button\n * onClick={() => leaveOrganization.mutate({ organizationId })}\n * disabled={leaveOrganization.isPending}\n * >\n * {leaveOrganization.isPending ? \"Leaving...\" : \"Leave Organization\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useLeaveOrganization(options?: UseLeaveOrganizationOptions) {\n return useMutation({\n mutationFn: leaveOrganization,\n ...options,\n });\n}\n","import { leaveOrganization } from \"./api\";\nimport type { LeaveOrganizationInput } from \"./schema\";\n\nexport const organizationsMutations = {\n leave: (input: LeaveOrganizationInput) => leaveOrganization(input),\n};\n","import { useMutation, useQuery, UseMutationOptions, UseQueryOptions } from \"@tanstack/react-query\";\nimport { createQueryOptions } from \"../lib/query-config\";\nimport { streamsMutations } from \"./mutations\";\nimport { streamsQueries } from \"./queries\";\nimport {\n DeleteStreamOutput,\n DeleteStreamInput,\n GetStreamsQuery,\n Stream,\n UpdateStreamInput,\n UpdateStreamOutput,\n StreamsSupportedChainsResponse,\n StreamWallet,\n StreamWalletDetails,\n GetStreamsWalletsQuery,\n PaginationSchema,\n GetStreamPointsQuery,\n StreamPoint,\n} from \"./schemas\";\n\n// --- Types for Options ---\n\nexport type UseStreamsOptions = Omit<UseQueryOptions<Stream[], Error>, \"queryKey\" | \"queryFn\">;\n\nexport type UseStreamPointsOptions = Omit<\n UseQueryOptions<StreamPoint[], Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseStreamWalletsOptions = Omit<\n UseQueryOptions<{ data: StreamWallet[]; pagination: PaginationSchema }, Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseStreamWalletDetailsOptions = Omit<\n UseQueryOptions<StreamWalletDetails, Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseStreamSupportedChainsOptions = Omit<\n UseQueryOptions<StreamsSupportedChainsResponse[\"chains\"], Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseUpdateStreamOptions = Omit<\n UseMutationOptions<UpdateStreamOutput, Error, UpdateStreamInput>,\n \"mutationFn\"\n>;\n\nexport type UseDeleteStreamOptions = Omit<\n UseMutationOptions<DeleteStreamOutput, Error, DeleteStreamInput>,\n \"mutationFn\"\n>;\n\n// --- Hooks ---\n\nexport function useStreams({\n query,\n options,\n}: {\n query?: GetStreamsQuery;\n options?: UseStreamsOptions;\n} = {}) {\n return useQuery(createQueryOptions(streamsQueries.list(query), options));\n}\n\nexport function useStreamPoints({\n query,\n options,\n}: {\n query?: GetStreamPointsQuery;\n options?: UseStreamPointsOptions;\n} = {}) {\n return useQuery(createQueryOptions(streamsQueries.points(query), options));\n}\n\nexport function useStreamWallets({\n query,\n options,\n}: {\n query: GetStreamsWalletsQuery;\n options?: UseStreamWalletsOptions;\n}) {\n return useQuery(createQueryOptions(streamsQueries.wallets(query), options));\n}\n\nexport function useStreamWalletDetails({\n query,\n options,\n}: {\n query: { streamId: string; userAddress: string };\n options?: UseStreamWalletDetailsOptions;\n}) {\n return useQuery(createQueryOptions(streamsQueries.walletDetails(query), options));\n}\n\nexport function useStreamSupportedChains({\n options,\n}: {\n options?: UseStreamSupportedChainsOptions;\n} = {}) {\n return useQuery(createQueryOptions(streamsQueries.supportedChains, options));\n}\n\nexport function useUpdateStream(options?: UseUpdateStreamOptions) {\n return useMutation({\n mutationFn: streamsMutations.update,\n ...options,\n });\n}\n\nexport function useDeleteStream(options?: UseDeleteStreamOptions) {\n return useMutation({\n mutationFn: streamsMutations.deleteStream,\n ...options,\n });\n}\n","import { z } from \"zod\";\nimport { organizationSchema } from \"../organizations\";\nimport { supportedTokenSchema } from \"../supported-tokens\";\n\nconst customArgsBaseSchema = z.object({\n targetTokenId: z.string().uuid(),\n});\n\n// Schemes for SNAPSHOTS (without targetToken)\nconst snapshotCustomArgsTokensPerUsdSchema = customArgsBaseSchema.extend({\n tokensPerUSD: z.string(),\n});\nconst snapshotCustomArgsAprSchema = customArgsBaseSchema.extend({\n apr: z.string(),\n});\nconst snapshotCustomArgsTokensPerDaySchema = customArgsBaseSchema.extend({\n tokensPerDay: z.string(),\n});\n\nconst snapshotCustomArgsSchema = z.union([\n snapshotCustomArgsTokensPerUsdSchema,\n snapshotCustomArgsAprSchema,\n snapshotCustomArgsTokensPerDaySchema,\n]);\n\n// Schemes for STREAM (with mandatory targetToken)\nconst streamCustomArgsTokensPerUsdSchema = snapshotCustomArgsTokensPerUsdSchema.extend({\n targetToken: supportedTokenSchema,\n});\nconst streamCustomArgsAprSchema = snapshotCustomArgsAprSchema.extend({\n targetToken: supportedTokenSchema,\n});\nconst streamCustomArgsTokensPerDaySchema = snapshotCustomArgsTokensPerDaySchema.extend({\n targetToken: supportedTokenSchema,\n});\n\nconst streamCustomArgsSchema = z.union([\n streamCustomArgsTokensPerUsdSchema,\n streamCustomArgsAprSchema,\n streamCustomArgsTokensPerDaySchema,\n]);\n\nconst updateStreamCustomArgsBaseSchema = z.object({\n targetTokenId: z.string().uuid().optional(),\n});\n\nconst updateStreamCustomArgsTokensPerUsdSchema = updateStreamCustomArgsBaseSchema.extend({\n tokensPerUSD: z.string(),\n});\nconst updateStreamCustomArgsAprSchema = updateStreamCustomArgsBaseSchema.extend({\n apr: z.string(),\n});\nconst updateStreamCustomArgsTokensPerDaySchema = updateStreamCustomArgsBaseSchema.extend({\n tokensPerDay: z.string(),\n});\n\nexport const updateStreamCustomArgsSchema = z.union([\n updateStreamCustomArgsTokensPerUsdSchema,\n updateStreamCustomArgsAprSchema,\n updateStreamCustomArgsTokensPerDaySchema,\n]);\n\nexport const snapshotSchema = z.object({\n amountBase: z.string(),\n amountDistributed: z.string(),\n createdAt: z.string().datetime(),\n rootHash: z.string().nullable(),\n timestamp: z.string().datetime(),\n updatedAt: z.string().datetime(),\n userCount: z.number().nullable().optional(),\n activeUserCount: z.number().optional(),\n tvl: z.string().nullable().optional(),\n baseTvl: z.string().nullable().optional(),\n netTvl: z.string().nullable().optional(),\n turtleTvl: z.string().nullable().optional(),\n turtleNetTvl: z.string().nullable().optional(),\n customMetrics: z.record(z.unknown()).optional(),\n customArgs: snapshotCustomArgsSchema.optional(),\n});\n\nexport const streamPointSchema = z.object({\n id: z.string(),\n orgId: z.string().optional(),\n symbol: z.string(),\n name: z.string(),\n decimals: z.coerce.number().optional(),\n logoUrl: z.string().url().nullable().optional(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n deletedAt: z.string().nullable().optional(),\n organization: organizationSchema.nullable().optional(),\n});\n\nconst chainSchema = z.object({\n chainId: z.coerce.number(),\n ecosystem: z.string(),\n explorerUrl: z.string(),\n id: z.string().uuid(),\n isTestnet: z.boolean(),\n logoUrl: z.string(),\n name: z.string(),\n slug: z.string(),\n status: z.string(),\n});\n\nconst rewardTokenSchema = z\n .object({\n active: z.boolean(),\n address: z.string(),\n canonicalAssetId: z.string().uuid(),\n chain: chainSchema,\n decimals: z.number(),\n id: z.string().uuid(),\n isNative: z.boolean(),\n logoUrl: z.string(),\n name: z.string(),\n priceUsd: z.number(),\n symbol: z.string(),\n streamsMinAmount: z.string().nullable().optional(),\n })\n .nullable();\n\nconst adaptersSchema = z.array(\n z.object({\n type: z.string(),\n params: z.record(z.string(), z.number()),\n })\n);\n\nconst feeTierSchema = z.object({\n maxTVL: z.string().nullable(), // represents a USD amount\n feePct: z.string(), // represents a percentage (e.g. 0.15 means 15%)\n});\n\nconst feeScheduleSchema = z.object({\n feeTiers: z.array(feeTierSchema),\n until: z.string().datetime().nullable(),\n});\n\nconst feeSnapshotSchema = z.object({\n timestamp: z.string().datetime(),\n tvl: z.string().nullable(), // means USD amount\n accumulatedFee: z.string(), // means USD amount\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\nconst feeSchema = z.object({\n managementFeeSchedules: z.array(feeScheduleSchema),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n lastFeeSnapshotTimestamp: z.string().datetime(),\n feeComputationPaused: z.boolean(),\n feeSnapshots: z.array(feeSnapshotSchema).optional(),\n lastFeeSnapshot: feeSnapshotSchema.nullable(),\n});\n\nexport const streamSchema = z.object({\n adapters: adaptersSchema,\n admin: z.string().nullable(),\n chainId: z.number().nullable(),\n chargedFee: z.string().nullable(),\n claimPaused: z.boolean(),\n committedSnapshot: snapshotSchema.nullable(),\n contractAddress: z.string().nullable(),\n createdAt: z.string().datetime(),\n creationConfirmedAt: z.string().datetime().nullable(),\n customArgs: streamCustomArgsSchema,\n endTimestamp: z.string().datetime().nullable(),\n fee: feeSchema.nullable(),\n hashCommitmentPaused: z.boolean(),\n id: z.string().uuid(),\n lastSnapshot: snapshotSchema.nullable(),\n merkleTreeComputationPaused: z.boolean(),\n orgId: z.string().uuid(),\n point: streamPointSchema.nullable().optional(),\n rewardToken: rewardTokenSchema,\n snapshotComputationPaused: z.boolean(),\n snapshots: z.array(snapshotSchema).optional(),\n startTimestamp: z.string().datetime(),\n strategy: z.string(),\n totalAmount: z.string().nullable(),\n type: z.number(),\n updatedAt: z.string().datetime(),\n userId: z.string().uuid(),\n});\n\n// --- API Request/Response Schemas ---\n\nexport const getStreamsOutputSchema = z.object({\n streams: z.array(streamSchema),\n});\n\nexport const getStreamPointsOutputSchema = z.object({\n points: z.array(streamPointSchema),\n});\n\nexport const createStreamPointBodySchema = z.object({\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().optional(),\n logoUrl: z.string().url().nullable().optional(),\n});\n\nexport const createStreamPointOutputSchema = z.object({\n point: streamPointSchema,\n});\n\nexport const getStreamsSupportedChainsOutputSchema = z.object({\n success: z.boolean(),\n chains: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n chainId: z.number(),\n logoUrl: z.string(),\n ecosystem: z.string(),\n status: z.string(),\n explorerUrl: z.string(),\n streamFactory: z.string(), // Address as string\n })\n ),\n});\n\nexport const streamSignatureRequestInputSchema = z.object({\n adapters: adaptersSchema,\n chainId: z.number().nullable(),\n customArgs: snapshotCustomArgsSchema,\n endTimestamp: z.string().nullable(),\n pointId: z.string().uuid().nullable(),\n rewardToken: z.string().nullable(),\n startTimestamp: z.string(),\n totalAmount: z.string().nullable(),\n type: z.number(),\n walletAddress: z.string().nullable(),\n});\n\nexport const streamSignatureRequestOutputSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n txParams: z\n .object({\n chainId: z.number(),\n sender: z.string(),\n params: z.object({\n deadline: z.number(),\n params: z.object({\n StreamId: z.array(z.number()),\n RewardToken: z.string(),\n NetTotalAmount: z.string(),\n FeeAmount: z.string(),\n }),\n signature: z.string(),\n }),\n })\n .nullable(),\n});\n\nexport const getStreamsQuerySchema = z.object({\n streamId: z.string().optional(),\n userId: z.string().optional(),\n organizationId: z.string().optional(),\n withSnapshots: z.boolean().optional(),\n withFeeSnapshots: z.boolean().optional(),\n usersCount: z.boolean().optional(),\n});\n\nexport const getStreamPointsQuerySchema = z.object({\n id: z.string().optional().nullable(),\n organizationId: z.string().optional().nullable(),\n symbol: z.string().optional().nullable(),\n name: z.string().optional().nullable(),\n});\n\n// --- Wallets & Snapshots Schemas ---\n\nexport const streamWalletSnapshotSchema = z.object({\n timestamp: z.string().datetime(),\n rewardsAccumulated: z.string(),\n rewardsAccumulatedBase: z.string(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n tvl: z.string().nullable().optional(),\n});\n\nexport const streamWalletSchema = z.object({\n userAddress: z.string(),\n lastSnapshot: streamWalletSnapshotSchema,\n});\n\nexport const paginationSchema = z.object({\n limit: z.number(),\n page: z.number(),\n total: z.number(),\n totalPages: z.number(),\n});\n\nexport const getStreamWalletsResponseSchema = z.object({\n data: z.array(streamWalletSchema),\n pagination: paginationSchema,\n});\n\nexport const getStreamWalletsQuerySchema = z.object({\n streamId: z.string(),\n page: z.number().optional(),\n limit: z.number().optional(),\n});\n\nexport const streamWalletDetailsSchema = z.object({\n streamId: z.string(),\n userAddress: z.string(),\n snapshots: z.array(streamWalletSnapshotSchema),\n stream: streamSchema,\n});\n\nexport const getStreamWalletDetailsResponseSchema = z.object({\n wallet: streamWalletDetailsSchema,\n});\n\nconst updateStreamMutableFieldsSchema = z.object({\n customArgs: updateStreamCustomArgsSchema.optional(),\n snapshotComputationPaused: z.boolean().optional(),\n merkleTreeComputationPaused: z.boolean().optional(),\n hashCommitmentPaused: z.boolean().optional(),\n stopStream: z.boolean().optional(),\n endTimestamp: z.string().datetime().nullable().optional(),\n setNilEndTimestamp: z.boolean().optional(),\n});\n\nconst updateStreamFieldsSchema = z.object({\n streamId: z.string().uuid(),\n});\n\nconst updateStreamBodyBaseSchema = updateStreamFieldsSchema.merge(updateStreamMutableFieldsSchema);\n\ntype UpdateStreamMutableFields = z.infer<typeof updateStreamMutableFieldsSchema>;\n\nconst hasUpdateStreamFields = (input: UpdateStreamMutableFields) => {\n return Object.values(input).some((value) => value !== undefined);\n};\n\nexport const updateStreamBodySchema = updateStreamBodyBaseSchema.refine(\n ({ streamId: _streamId, ...updateFields }: z.infer<typeof updateStreamBodyBaseSchema>) =>\n hasUpdateStreamFields(updateFields),\n {\n message: \"At least one stream update field must be provided\",\n }\n);\n\nconst updateStreamInputBaseSchema = updateStreamBodyBaseSchema.extend({\n organizationId: z.string().uuid(),\n});\n\nexport const updateStreamInputSchema = updateStreamInputBaseSchema;\n\nexport const deleteStreamInputSchema = z.object({\n organizationId: z.string().uuid(),\n streamId: z.string().uuid(),\n});\n\nexport const updateStreamOutputSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n});\n\nexport const deleteStreamOutputSchema = updateStreamOutputSchema;\n\n// --- Types ---\n\nexport type Stream = z.infer<typeof streamSchema>;\nexport type StreamsSchema = z.infer<typeof getStreamsOutputSchema>;\nexport type StreamPoint = z.infer<typeof streamPointSchema>;\nexport type StreamsSupportedChainsResponse = z.infer<typeof getStreamsSupportedChainsOutputSchema>;\nexport type CreateStreamPointBody = z.infer<typeof createStreamPointBodySchema>;\nexport type CreateStreamPointOutput = z.infer<typeof createStreamPointOutputSchema>;\nexport type StreamSignatureRequestInput = z.infer<typeof streamSignatureRequestInputSchema>;\nexport type StreamSignatureRequestOutput = z.infer<typeof streamSignatureRequestOutputSchema>;\nexport type GetStreamsQuery = z.infer<typeof getStreamsQuerySchema>;\nexport type GetStreamPointsQuery = z.infer<typeof getStreamPointsQuerySchema>;\nexport type StreamWalletSnapshot = z.infer<typeof streamWalletSnapshotSchema>;\nexport type StreamWallet = z.infer<typeof streamWalletSchema>;\nexport type StreamWalletDetails = z.infer<typeof streamWalletDetailsSchema>;\nexport type PaginationSchema = z.infer<typeof paginationSchema>;\nexport type GetStreamsWalletsQuery = z.infer<typeof getStreamWalletsQuerySchema>;\nexport type UpdateStreamCustomArgs = z.infer<typeof updateStreamCustomArgsSchema>;\nexport type UpdateStreamInput = z.infer<typeof updateStreamInputSchema>;\nexport type UpdateStreamBody = z.infer<typeof updateStreamBodySchema>;\nexport type UpdateStreamOutput = z.infer<typeof updateStreamOutputSchema>;\nexport type DeleteStreamInput = z.infer<typeof deleteStreamInputSchema>;\nexport type DeleteStreamOutput = z.infer<typeof deleteStreamOutputSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n GetStreamsQuery,\n getStreamsOutputSchema,\n StreamsSchema,\n getStreamsSupportedChainsOutputSchema,\n StreamsSupportedChainsResponse,\n StreamSignatureRequestInput,\n streamSignatureRequestOutputSchema,\n StreamSignatureRequestOutput,\n StreamWallet,\n getStreamWalletsResponseSchema,\n StreamWalletDetails,\n getStreamWalletDetailsResponseSchema,\n PaginationSchema,\n GetStreamsWalletsQuery,\n GetStreamPointsQuery,\n StreamPoint,\n getStreamPointsOutputSchema,\n CreateStreamPointBody,\n CreateStreamPointOutput,\n createStreamPointOutputSchema,\n UpdateStreamBody,\n UpdateStreamOutput,\n updateStreamOutputSchema,\n DeleteStreamOutput,\n deleteStreamOutputSchema,\n} from \"./schemas\";\n\nexport async function getStreams(query?: GetStreamsQuery): Promise<StreamsSchema[\"streams\"]> {\n const params = new URLSearchParams();\n if (query?.streamId) params.set(\"id\", query.streamId);\n if (query?.userId) params.set(\"userId\", query.userId);\n if (query?.organizationId) params.set(\"organizationId\", query.organizationId);\n if (query?.withSnapshots) params.append(\"withSnapshots\", \"true\");\n if (query?.usersCount && query?.withSnapshots) params.append(\"usersCount\", \"true\");\n if (query?.withFeeSnapshots) params.append(\"withFeeSnapshots\", \"true\");\n\n const queryString = params.toString();\n const endpoint = `/streams${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamsOutputSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreams:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse streams: ${result.error.message}`);\n }\n return result.data.streams;\n}\n\nexport async function getStreamPoints(query?: GetStreamPointsQuery): Promise<StreamPoint[]> {\n const params = new URLSearchParams();\n if (query?.id) params.set(\"id\", query.id);\n if (query?.organizationId) params.set(\"organizationId\", query.organizationId);\n if (query?.symbol) params.set(\"symbol\", query.symbol);\n if (query?.name) params.set(\"name\", query.name);\n\n const queryString = params.toString();\n const endpoint = `/streams/points${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamPointsOutputSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreamPoints:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse stream points: ${result.error.message}`);\n }\n return result.data.points;\n}\n\nexport async function createStreamPoint(\n organizationId: string,\n body: CreateStreamPointBody\n): Promise<CreateStreamPointOutput> {\n const endpoint = `/streams/points/${organizationId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body,\n });\n\n const result = createStreamPointOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse create point response: ${result.error.message}`);\n }\n return result.data;\n}\n\nexport async function getStreamWallets(\n query: GetStreamsWalletsQuery\n): Promise<{ data: StreamWallet[]; pagination: PaginationSchema }> {\n const params = new URLSearchParams();\n if (query?.page) params.set(\"page\", query.page.toString());\n if (query?.limit) params.set(\"limit\", query.limit.toString());\n\n const queryString = params.toString();\n const endpoint = `/streams/${query.streamId}/wallets/${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamWalletsResponseSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreamWallets:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse stream wallets: ${result.error.message}`);\n }\n return result.data;\n}\n\nexport async function getStreamWalletDetails(\n streamId: string,\n userAddress: string\n): Promise<StreamWalletDetails> {\n const endpoint = `/streams/${streamId}/wallets/${userAddress}`;\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamWalletDetailsResponseSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreamWalletDetails:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse stream wallet details: ${result.error.message}`);\n }\n return result.data.wallet;\n}\n\nexport async function getStreamsSupportedChains(): Promise<\n StreamsSupportedChainsResponse[\"chains\"]\n> {\n const endpoint = \"/streams/supported_chains\";\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamsSupportedChainsOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse supported chains: ${result.error.message}`);\n }\n return result.data.chains;\n}\n\nexport async function requestStreamSignature(\n organizationId: string,\n input: StreamSignatureRequestInput\n): Promise<StreamSignatureRequestOutput> {\n const endpoint = `/streams/${organizationId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: input,\n });\n\n const result = streamSignatureRequestOutputSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Failed to parse signature response: ${result.error.message}`);\n }\n return result.data;\n}\n\nexport async function updateStream(\n organizationId: string,\n body: UpdateStreamBody\n): Promise<UpdateStreamOutput> {\n const endpoint = `/streams/${organizationId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"PATCH\",\n body,\n });\n\n const result = updateStreamOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse update stream response: ${result.error.message}`);\n }\n\n return result.data;\n}\n\nexport async function deleteStream(organizationId: string, streamId: string): Promise<DeleteStreamOutput> {\n const endpoint = `/streams/${organizationId}/${streamId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"DELETE\",\n });\n\n const result = deleteStreamOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse delete stream response: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { deleteStream, updateStream } from \"./api\";\nimport { DeleteStreamInput, UpdateStreamInput } from \"./schemas\";\n\nexport const streamsMutations = {\n update: ({ organizationId, ...body }: UpdateStreamInput) => updateStream(organizationId, body),\n deleteStream: (input: DeleteStreamInput) => deleteStream(input.organizationId, input.streamId),\n};\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport {\n getStreams,\n getStreamsSupportedChains,\n getStreamWallets,\n getStreamWalletDetails,\n getStreamPoints,\n} from \"./api\";\nimport { GetStreamPointsQuery, GetStreamsQuery, GetStreamsWalletsQuery } from \"./schemas\";\n\nexport const streamsQueries = createQueryKeys(\"streams\", {\n list: (query?: GetStreamsQuery) => ({\n queryKey: [query ?? \"all\"],\n queryFn: () => getStreams(query),\n }),\n points: (query?: GetStreamPointsQuery) => ({\n queryKey: [query ?? \"all\"],\n queryFn: () => getStreamPoints(query),\n }),\n wallets: (query: GetStreamsWalletsQuery) => ({\n queryKey: [query],\n queryFn: () => getStreamWallets(query),\n }),\n walletDetails: (query: { streamId: string; userAddress: string }) => ({\n queryKey: [query],\n queryFn: () => getStreamWalletDetails(query.streamId, query.userAddress),\n }),\n supportedChains: {\n queryKey: null,\n queryFn: () => getStreamsSupportedChains(),\n },\n});\n","import { apiClient } from \"../lib/api-client\";\nimport type {\n OpportunityFilters,\n OpportunitiesResponse,\n GetOpportunitiesPaginatedInput,\n GetOpportunitiesPaginatedResponse,\n GetOpportunitiesFilterOptionsResponse,\n GetOpportunityByIdInput,\n Opportunity,\n} from \"./schema\";\nimport {\n opportunitiesResponseSchema,\n getOpportunitiesPaginatedSchema,\n getOpportunitiesFilterOptionsSchema,\n opportunitySchema,\n} from \"./schema\";\n\n// GET /turtle/opportunities\nexport async function getOpportunities(\n filters?: OpportunityFilters,\n options?: { debug?: boolean }\n): Promise<OpportunitiesResponse> {\n const params = new URLSearchParams();\n\n if (filters?.tokenId) params.append(\"tokenId\", filters.tokenId);\n if (filters?.chain) params.append(\"chain\", filters.chain);\n if (filters?.productId) params.append(\"productId\", filters.productId);\n\n const queryString = params.toString();\n const endpoint = `/turtle/opportunities${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = opportunitiesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/opportunities/{id}\nexport async function getOpportunityById(\n id: string,\n queryParams?: GetOpportunityByIdInput,\n options?: { debug?: boolean }\n): Promise<Opportunity> {\n const params = new URLSearchParams();\n\n if (queryParams?.withMainStream !== undefined) {\n params.append(\"withMainStream\", String(queryParams.withMainStream));\n }\n\n const queryString = params.toString();\n const endpoint = `/turtle/opportunities/${id}${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = opportunitySchema.safeParse(data);\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse opportunity: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/opportunities-paginated\nexport async function getOpportunitiesPaginated(\n params?: GetOpportunitiesPaginatedInput,\n options?: { debug?: boolean }\n): Promise<GetOpportunitiesPaginatedResponse> {\n const queryParams = new URLSearchParams();\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n\n const queryString = queryParams.toString();\n const endpoint = `/turtle/opportunities-paginated${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = getOpportunitiesPaginatedSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse paginated opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/opportunities-filter-options\nexport async function getOpportunitiesFilterOptions(options?: {\n debug?: boolean;\n}): Promise<GetOpportunitiesFilterOptionsResponse> {\n const data = await apiClient.fetch(\"/turtle/opportunities-filter-options\", {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = getOpportunitiesFilterOptionsSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse opportunities filter options: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getEarnOpportunities } from \"./api\";\n\nexport const earnOpportunitiesQueries = createQueryKeys(\"earnOpportunities\", {\n all: {\n queryKey: null,\n queryFn: (context) => getEarnOpportunities(context),\n },\n});\n","import { z } from \"zod\";\nimport { tokenSchema } from \"../supported-tokens\";\n\n// Earn Opportunity Response Schema\nexport const earnOpportunitySchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n description: z.string(),\n type: z.string(),\n estimatedApr: z.number(),\n tvl: z.number(),\n featured: z.boolean(),\n baseTokens: tokenSchema,\n depositTokens: z.array(tokenSchema).nullable(),\n receiptToken: tokenSchema,\n});\n\n// Earn Opportunities Response Schema\nexport const earnOpportunitiesResponseSchema = z.object({\n opportunities: z.array(earnOpportunitySchema).nullable(),\n total: z.number().int(),\n});\n\nexport type EarnOpportunity = z.infer<typeof earnOpportunitySchema>;\nexport type EarnOpportunitiesResponse = z.infer<typeof earnOpportunitiesResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { EarnOpportunitiesResponse } from \"./schema\";\nimport { earnOpportunitiesResponseSchema } from \"./schema\";\n\n// GET /v1/opportunities\nexport async function getEarnOpportunities(\n context?: QueryFunctionContext\n): Promise<EarnOpportunitiesResponse> {\n const data = await apiClient.fetch(\"/v1/opportunities/\", {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = earnOpportunitiesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse earn opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getEarnRoute } from \"./api\";\nimport type { EarnRouteParams } from \"./schema\";\n\nexport const earnRouteQueries = createQueryKeys(\"earnRoute\", {\n // Get earn route with specific parameters\n byParams: (params: EarnRouteParams) => ({\n queryKey: [params],\n queryFn: (context) => getEarnRoute(params, context),\n }),\n});\n","import { ethz } from \"@turtleclub/utils\";\nimport { z } from \"zod\";\n\n// Asset schemas\nexport const assetImageData = z.object({\n kind: z.literal(\"image\"),\n url: z.string(),\n alt: z.string(),\n});\n\nexport const assetERC20Data = z.object({\n kind: z.literal(\"erc20\"),\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n});\n\nexport const assetData = z.discriminatedUnion(\"kind\", [assetImageData, assetERC20Data]);\n\nexport const asset = z.object({\n id: z.string().uuid(),\n name: z.string(),\n slugs: z.array(z.string()),\n tags: z.array(z.string()),\n description: z.string().nullable(),\n data: z.array(assetData),\n});\n\n// Token schema\nexport const routeToken = z.object({\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n logos: z.array(z.string()),\n decimals: z.number(),\n chain: z.number(),\n price: z.number().nullable().optional(),\n});\n\n// Router substeps\nexport const swapSubstep = z.object({\n kind: z.literal(\"swap\"),\n from: z.array(routeToken),\n to: z.array(routeToken),\n protocol: z.string(),\n protocol_asset: asset.nullable(),\n price_impact: z.number().nullable(),\n});\n\nexport const depositSubstep = z.object({\n kind: z.literal(\"deposit\"),\n vault: z.string(),\n from: z.array(routeToken),\n to: z.array(routeToken),\n amount: z.string(),\n protocol: z.string(),\n protocol_asset: asset.nullable(),\n price_impact: z.number().nullable(),\n});\n\nexport const routerSubstep = z.discriminatedUnion(\"kind\", [swapSubstep, depositSubstep]);\n\n// Transaction schema\nexport const stepTx = z.object({\n from: ethz.address(),\n to: ethz.address(),\n data: ethz.hex(),\n value: z.string(),\n gas: z.number(),\n});\n\n// Router steps\nexport const approveStep = z.object({\n kind: z.literal(\"approve\"),\n owner: z.string(),\n spender: z.string(),\n token: routeToken,\n amount: z.string(),\n tx: stepTx,\n});\n\nexport const ensoStep = z.object({\n kind: z.literal(\"enso\"),\n substeps: z.array(routerSubstep),\n tx: stepTx,\n asset: asset.nullable(),\n});\n\nexport const routerStep = z.discriminatedUnion(\"kind\", [approveStep, ensoStep]);\n\n// Earn Route Response\nexport const earnRouteResponseSchema = z.object({\n steps: z.array(routerStep),\n amount_out: z.string(),\n price_impact: z.number().nullable(),\n});\n\n// Earn Route Request Params\nexport interface EarnRouteParams {\n user: string;\n chain: number;\n slippage: number;\n token_in: string;\n token_out: string;\n amount: string;\n distributor_id: string;\n referral_code?: string;\n // @deprecated productId is not supported anymore\n id?: string;\n}\n\nexport type AssetImageData = z.infer<typeof assetImageData>;\nexport type AssetERC20Data = z.infer<typeof assetERC20Data>;\nexport type AssetData = z.infer<typeof assetData>;\nexport type Asset = z.infer<typeof asset>;\nexport type RouteToken = z.infer<typeof routeToken>;\nexport type SwapSubstep = z.infer<typeof swapSubstep>;\nexport type DepositSubstep = z.infer<typeof depositSubstep>;\nexport type RouterSubstep = z.infer<typeof routerSubstep>;\nexport type StepTx = z.infer<typeof stepTx>;\nexport type ApproveStep = z.infer<typeof approveStep>;\nexport type EnsoStep = z.infer<typeof ensoStep>;\nexport type RouterStep = z.infer<typeof routerStep>;\nexport type EarnRouteResponse = z.infer<typeof earnRouteResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { EarnRouteResponse, EarnRouteParams } from \"./schema\";\nimport { earnRouteResponseSchema } from \"./schema\";\n\n// GET /v1/route\nexport async function getEarnRoute(\n params: EarnRouteParams,\n context?: QueryFunctionContext\n): Promise<EarnRouteResponse> {\n const searchParams = new URLSearchParams({\n user: params.user,\n chain: params.chain.toString(),\n slippage: params.slippage.toString(),\n token_in: params.token_in,\n token_out: params.token_out,\n amount: params.amount,\n distributor_id: params.distributor_id,\n ...(params.referral_code && { referral_code: params.referral_code }),\n ...(params.id && { id: params.id }),\n });\n\n const response = await apiClient.fetch<{ data: unknown }>(`/v1/route/?${searchParams.toString()}`, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const data = response.data;\n const result = earnRouteResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse earn route: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { checkMembership } from \"./api\";\nimport type { CheckMembershipParams } from \"./schema\";\n\nexport const earnMembershipQueries = createQueryKeys(\"earnMembership\", {\n // Check membership status\n check: (params: CheckMembershipParams) => ({\n queryKey: [params],\n queryFn: (context) => checkMembership(params, context),\n }),\n});\n","import { z } from \"zod\";\n\n// Wallet Ecosystem Enum\nexport const walletEcosystemEnum = z.enum([\"evm\", \"solana\", \"ton\"]);\n\n// GET /v1/membership/ - Check Membership\nexport interface CheckMembershipParams {\n address: string;\n walletEcosystem?: \"evm\" | \"solana\" | \"ton\";\n}\n\nexport const checkMembershipResponseSchema = z.object({\n isMember: z.boolean(),\n});\n\n// POST /v1/membership/agreement - Create Agreement\nexport const createAgreementRequestSchema = z.object({\n address: z.string(),\n walletEcosystem: walletEcosystemEnum,\n url: z.string(),\n chainId: z.string().default(\"1\"),\n});\n\nexport const createAgreementResponseSchema = z.object({\n message: z.string(),\n nonce: z.string(),\n});\n\n// POST /v1/membership/ - Create Membership\nexport const createMembershipRequestSchema = z.object({\n address: z.string(),\n walletEcosystem: z.string(),\n signature: z.string(),\n nonce: z.string(),\n});\n\nexport const createMembershipResponseSchema = z.object({\n isMember: z.boolean(),\n error: z.string().optional(),\n});\n\nexport type WalletEcosystem = z.infer<typeof walletEcosystemEnum>;\nexport type CheckMembershipResponse = z.infer<typeof checkMembershipResponseSchema>;\nexport type CreateAgreementRequest = z.infer<typeof createAgreementRequestSchema>;\nexport type CreateAgreementResponse = z.infer<typeof createAgreementResponseSchema>;\nexport type CreateMembershipRequest = z.infer<typeof createMembershipRequestSchema>;\nexport type CreateMembershipResponse = z.infer<typeof createMembershipResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type {\n CheckMembershipParams,\n CheckMembershipResponse,\n CreateAgreementRequest,\n CreateAgreementResponse,\n CreateMembershipRequest,\n CreateMembershipResponse,\n} from \"./schema\";\nimport {\n checkMembershipResponseSchema,\n createAgreementResponseSchema,\n createMembershipResponseSchema,\n} from \"./schema\";\n\n// GET /v1/membership/ - Check if wallet is a member\nexport async function checkMembership(\n params: CheckMembershipParams,\n context?: QueryFunctionContext\n): Promise<CheckMembershipResponse> {\n const searchParams = new URLSearchParams({\n address: params.address,\n ...(params.walletEcosystem && { walletEcosystem: params.walletEcosystem }),\n });\n\n const data = await apiClient.fetch(`/v1/membership/?${searchParams.toString()}`, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = checkMembershipResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse check membership: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /v1/membership/agreement - Create membership agreement\nexport async function createMembershipAgreement(\n request: CreateAgreementRequest\n): Promise<CreateAgreementResponse> {\n const data = await apiClient.fetch(\"/v1/membership/agreement\", {\n method: \"POST\",\n domain: \"earn\",\n body: request,\n });\n\n const result = createAgreementResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse create agreement: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /v1/membership/ - Create membership\nexport async function createMembership(\n request: CreateMembershipRequest\n): Promise<CreateMembershipResponse> {\n const data = await apiClient.fetch(\"/v1/membership/\", {\n method: \"POST\",\n domain: \"earn\",\n body: request,\n });\n\n const result = createMembershipResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse create membership: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getDeposits } from \"./api\";\nimport type { GetDepositsParams } from \"./schema\";\n\nexport const earnDepositsQueries = createQueryKeys(\"earnDeposits\", {\n byParams: (params: GetDepositsParams) => ({\n queryKey: [params],\n queryFn: (context) => getDeposits(params, context),\n }),\n});\n","import { z } from \"zod\";\n\n// Deposit Schema\nexport const depositSchema = z.object({\n chain: z.number().int(),\n deposited_amount_usd: z.string(),\n deposited_token_address: z.string(),\n deposited_token_decimals: z.number().int(),\n deposited_token_logo: z.string(),\n deposited_token_name: z.string(),\n deposited_token_symbol: z.string(),\n deposited_value: z.string(),\n depositor: z.string(),\n target: z.string(),\n timestamp: z.string(),\n tx_hash: z.string(),\n});\n\n// Deposits Response Schema\nexport const depositsResponseSchema = z.object({\n deposits: z.array(depositSchema).nullable(),\n});\n\n// Deposits Request Params\nexport interface GetDepositsParams {\n distributor_id: string;\n depositor?: string;\n limit?: number;\n offset?: number;\n}\n\nexport type Deposit = z.infer<typeof depositSchema>;\nexport type DepositsResponse = z.infer<typeof depositsResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GetDepositsParams, DepositsResponse } from \"./schema\";\nimport { depositsResponseSchema } from \"./schema\";\n\n// GET /v1/deposit/{distributor_id}\nexport async function getDeposits(\n params: GetDepositsParams,\n context?: QueryFunctionContext\n): Promise<DepositsResponse> {\n const { distributor_id, depositor, limit, offset } = params;\n\n const searchParams = new URLSearchParams({\n ...(depositor && { depositor }),\n ...(limit && { limit: limit.toString() }),\n ...(offset && { offset: offset.toString() }),\n });\n\n const queryString = searchParams.toString();\n const endpoint = `/v1/deposit/${distributor_id}${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = depositsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse deposits: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\n// Note: Actions are mutations (POST), so no query keys are needed for fetching.\n// This file exists for consistency and potential future GET endpoints.\n\nexport const earnActionsQueries = createQueryKeys(\"earnActions\", {\n // Placeholder for potential future GET endpoints\n // e.g., getting action history\n});\n\n// Legacy alias\nexport const earnInteractionsQueries = earnActionsQueries;\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getProduct, getProducts } from \"./api\";\nimport type { ProductFilters } from \"./schema\";\n\nexport const productsQueries = createQueryKeys(\"products\", {\n // Get all products (no filters)\n all: () => ({\n queryKey: [\"all\"],\n queryFn: () => getProducts(),\n }),\n\n list: (filters?: ProductFilters) => ({\n queryKey: [{ filters }],\n queryFn: () => getProducts(filters),\n }),\n byId: (id: string) => ({\n queryKey: [id],\n queryFn: () => getProduct(id),\n }),\n});\n","import { apiClient } from \"../lib/api-client\";\nimport {\n CreateProductInput,\n ProductFilters,\n CreateProductResponse,\n createProductResponseSchema,\n ProductResponse,\n productResponseSchema,\n ProductsResponse,\n productsResponseSchema,\n UpdateProductInput,\n UpdateProductResponse,\n updateProductResponseSchema,\n UploadProductLogoRequest,\n UploadProductLogoResponse,\n uploadProductLogoResponseSchema,\n} from \"./schema\";\n\n// GET /turtle/products\nexport async function getProducts(filters?: ProductFilters): Promise<ProductsResponse> {\n const params = new URLSearchParams();\n\n if (filters?.organizationId) params.append(\"organizationId\", filters.organizationId);\n\n const queryString = params.toString();\n const endpoint = `/turtle/products${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = productsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse products: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/products/:id\nexport async function getProduct(id: string): Promise<ProductResponse> {\n const endpoint = `/turtle/products/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = productResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse product: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /admin/products\nexport async function createProduct(input: CreateProductInput): Promise<CreateProductResponse> {\n const endpoint = `/admin/products`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: input,\n });\n\n // Validate response with Zod\n const result = createProductResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to create product: ${result.error.message}`);\n }\n return result.data;\n}\n\n// PUT /admin/products/:id\nexport async function updateProduct(input: UpdateProductInput): Promise<UpdateProductResponse> {\n const endpoint = `/admin/products/${input.product.id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"PUT\",\n body: input,\n });\n\n // Validate response with Zod\n const result = updateProductResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to update product: ${result.error.message}`);\n }\n return result.data;\n}\n\n// DELETE /admin/products/:id\nexport async function deleteProduct(id: string): Promise<void> {\n const endpoint = `/admin/products/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"DELETE\",\n });\n\n // Validate response with Zod\n const result = productResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to delete product: ${result.error.message}`);\n }\n}\n\n// POST /admin/products/upload-logo\nexport async function uploadProductLogo({\n file,\n filename,\n}: UploadProductLogoRequest): Promise<UploadProductLogoResponse> {\n const endpoint = `/admin/products/upload-logo`;\n\n const formData = new FormData();\n formData.append(\"file\", file as File, filename || file.name);\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: formData,\n });\n\n // Validate response with Zod\n const result = uploadProductLogoResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to upload product logo: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getWalletBalances } from \"./api\";\nimport type { GetWalletBalancesParams } from \"./schemas\";\n\nexport const ensoBalancesQueries = createQueryKeys(\"ensoBalances\", {\n byParams: (params: GetWalletBalancesParams) => ({\n queryKey: [params],\n queryFn: (context) => getWalletBalances(params, context),\n }),\n});\n","import { z } from \"zod\";\n\nexport const balanceTokenSchema = z.object({\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n logos: z.array(z.string()),\n decimals: z.number(),\n chain: z.number(),\n price: z.number().nullable().optional(),\n});\n\nexport const walletBalanceSchema = z.object({\n token: balanceTokenSchema,\n amount: z.string(),\n});\n\nexport interface GetWalletBalancesParams {\n user: string;\n chain: number;\n}\n\nexport const walletBalancesResponseSchema = z.object({\n balances: z.array(walletBalanceSchema),\n});\n\nexport type BalanceToken = z.infer<typeof balanceTokenSchema>;\nexport type WalletBalance = z.infer<typeof walletBalanceSchema>;\nexport type WalletBalancesResponse = z.infer<typeof walletBalancesResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GetWalletBalancesParams, WalletBalancesResponse } from \"./schemas\";\nimport { walletBalancesResponseSchema } from \"./schemas\";\n\n// GET /v1/api/wallet_balances\nexport async function getWalletBalances(\n params: GetWalletBalancesParams,\n context?: QueryFunctionContext\n): Promise<WalletBalancesResponse> {\n const { user, chain } = params;\n\n const searchParams = new URLSearchParams({\n user,\n chain: chain.toString(),\n });\n\n const endpoint = `/v1/api/wallet_balances?${searchParams.toString()}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = walletBalancesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse wallet balances: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getWidgetOpportunities } from \"./api\";\n\nexport const widgetQueries = createQueryKeys(\"widget\", {\n opportunities: (distributorId: string) => ({\n queryKey: [distributorId],\n queryFn: (context) => getWidgetOpportunities(distributorId, context),\n }),\n});\n","import { z } from \"zod\";\nimport { opportunitySchema } from \"../opportunities\";\n\n// Widget Opportunities Response Schema\nexport const widgetOpportunitiesResponseSchema = z.object({\n opportunities: z.array(opportunitySchema).nullable(),\n total: z.number().int(),\n});\n\nexport type WidgetOpportunitiesResponse = z.infer<typeof widgetOpportunitiesResponseSchema>;\n","import { useQuery, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport { opportunitiesQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type {\n OpportunitiesResponse,\n OpportunityFilters,\n GetOpportunitiesPaginatedInput,\n GetOpportunitiesPaginatedResponse,\n GetOpportunitiesFilterOptionsResponse,\n Opportunity,\n} from \"./schema\";\n\nexport interface UseOpportunitiesOptions extends Omit<\n UseQueryOptions<OpportunitiesResponse>,\n \"queryKey\" | \"queryFn\"\n> {\n filters?: OpportunityFilters;\n}\n\nexport function useOpportunities(options?: UseOpportunitiesOptions) {\n return useQuery({\n ...opportunitiesQueries.all,\n ...queryDefaults,\n select: (data: OpportunitiesResponse) => {\n const uniqueChainsMap = new Map(\n data.opportunities\n .map((opportunity) => opportunity.receiptToken?.chain)\n .filter((chain) => chain !== undefined)\n .map((chain) => [chain.id, chain])\n );\n\n const chains = Array.from(uniqueChainsMap.values());\n\n return {\n ...data,\n chains,\n };\n },\n });\n}\n\nexport interface UseOpportunityOptions extends Omit<\n UseQueryOptions<Opportunity>,\n \"queryKey\" | \"queryFn\"\n> {\n id: string;\n}\n\nexport function useOpportunity({ id, ...options }: UseOpportunityOptions) {\n return useQuery({\n ...opportunitiesQueries.byId(id),\n ...queryDefaults,\n select: (data: Opportunity) => {\n return {\n ...data,\n chain: data.receiptToken?.chain,\n };\n },\n });\n}\n\nexport interface UseOpportunitiesPaginatedOptions {\n params?: GetOpportunitiesPaginatedInput;\n enabled?: boolean;\n}\n\nexport function useOpportunitiesPaginated({\n params,\n enabled = true,\n}: UseOpportunitiesPaginatedOptions = {}) {\n return useQuery({\n ...opportunitiesQueries.paginated(params),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseOpportunitiesFilterOptionsOptions {\n enabled?: boolean;\n}\n\nexport function useOpportunitiesFilterOptions({\n enabled = true,\n}: UseOpportunitiesFilterOptionsOptions = {}) {\n return useQuery({\n ...opportunitiesQueries.filterOptions,\n ...queryDefaults,\n enabled,\n });\n}\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { WidgetOpportunitiesResponse } from \"./schema\";\nimport { widgetOpportunitiesResponseSchema } from \"./schema\";\n\n// GET /v1/widget/{distributorId}/opportunities\nexport async function getWidgetOpportunities(\n distributorId: string,\n context?: QueryFunctionContext\n): Promise<WidgetOpportunitiesResponse> {\n const data = await apiClient.fetch(`/widget/${distributorId}/opportunities`, {\n method: \"GET\",\n signal: context?.signal,\n });\n\n const result = widgetOpportunitiesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse widget opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getUserById, getUserPortfolio } from \"./api\";\nimport type { GetUserByIdInput, GetUserTurtlePortfolioInput } from \"./schemas\";\n\nexport const usersQueries = createQueryKeys(\"users\", {\n byId: (input: GetUserByIdInput) => ({\n queryKey: [input.userId],\n queryFn: () => getUserById(input),\n }),\n portfolio: (input: GetUserTurtlePortfolioInput) => ({\n queryKey: [\"portfolio\", input.userId],\n queryFn: () => getUserPortfolio(input),\n }),\n});\n","import { z } from \"zod\";\nimport { chainSchema } from \"../supported-chains\";\nimport { tokenSchema } from \"../supported-tokens\";\n\n// Wallet Data Schema\nconst walletDataSchema = z.object({\n address: z.string(),\n totalAmountInUSD: z.string(),\n tokens: z.array(tokenSchema),\n});\n\n// Holdings Data Schema\nconst holdingsDataSchema = z.object({\n totalAmountInUSD: z.string(),\n chains: z.array(chainSchema).nullish(),\n wallets: z.array(walletDataSchema).nullish(),\n});\n\n// User Earnings Schema\nconst userEarningsSchema = z.object({\n productId: z.string().uuid(),\n value: z.number(),\n referralsEarnings: z.number().nullish(),\n rewardName: z.string().nullish(),\n rewardType: z.string().nullish(),\n});\n\n// Portfolio Schema\nconst portfolioSchema = z.object({\n productsEarnings: z.array(userEarningsSchema),\n holdings: holdingsDataSchema.nullish(),\n});\n\n// Holding Info Schema\nconst holdingInfoSchema = z.object({\n amount: z.number(),\n usdValue: z.number(),\n token: tokenSchema.nullish(),\n});\n\n// Wallet Info Schema\nconst walletInfoSchema = z.object({\n address: z.string().nullish(),\n ecosystem: z.string().nullish(),\n isMain: z.boolean().nullish(),\n holdings: z.array(holdingInfoSchema).nullish(),\n});\n\n// User With Details Schema\nconst userWithDetailsSchema = z.object({\n id: z.string(),\n email: z.string().nullable(),\n username: z.string().nullish(),\n firstName: z.string().nullish(),\n lastName: z.string().nullish(),\n avatarUrl: z.string().nullish(),\n telegramHandle: z.string().nullish(),\n xUsername: z.string().nullish(),\n role: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n tags: z.array(z.string()).nullish(),\n wallets: z.array(walletInfoSchema).nullish(),\n});\n\n// GetUserTurtlePortfolioHandler Input Schema\nexport const getUserTurtlePortfolioInputSchema = z.object({\n userId: z.string().uuid(),\n});\n\n// GetUserTurtlePortfolioHandler Output Schema\nexport const getUserTurtlePortfolioOutputSchema = z.object({\n portfolio: portfolioSchema,\n});\n\n// Path Parameters Schema (for URL params)\nexport const getUserTurtlePortfolioPathSchema = z.object({\n userId: z.string().uuid(),\n});\n\n// GetUserByIDHandler Input Schema\nexport const getUserByIdInputSchema = z.object({\n userId: z.string().uuid(),\n});\n\n// GetUserByIDHandler Output Schema\nexport const getUserByIdOutputSchema = z.object({\n user: userWithDetailsSchema.nullable(),\n error: z.string().optional(),\n});\n\n// Type exports\nexport type GetUserByIdInput = z.infer<typeof getUserByIdInputSchema>;\nexport type GetUserByIdOutput = z.infer<typeof getUserByIdOutputSchema>;\nexport type GetUserTurtlePortfolioInput = z.infer<typeof getUserTurtlePortfolioInputSchema>;\nexport type GetUserTurtlePortfolioOutput = z.infer<typeof getUserTurtlePortfolioOutputSchema>;\nexport type UserWithDetails = z.infer<typeof userWithDetailsSchema>;\nexport type WalletData = z.infer<typeof walletDataSchema>;\nexport type HoldingsData = z.infer<typeof holdingsDataSchema>;\nexport type Portfolio = z.infer<typeof portfolioSchema>;\nexport type UserEarnings = z.infer<typeof userEarningsSchema>;\n\n// Export individual schemas if needed\nexport {\n walletDataSchema,\n holdingsDataSchema,\n userEarningsSchema,\n portfolioSchema,\n userWithDetailsSchema,\n};\n","import { apiClient } from \"../lib/api-client\";\nimport {\n GetUserByIdInput,\n GetUserByIdOutput,\n getUserByIdOutputSchema,\n GetUserTurtlePortfolioInput,\n GetUserTurtlePortfolioOutput,\n getUserTurtlePortfolioOutputSchema,\n} from \"./schemas\";\n\n// GET /admin/users/:userId\nexport async function getUserById(input: GetUserByIdInput): Promise<GetUserByIdOutput> {\n console.log(\"input\", input);\n const endpoint = `/admin/users/${input.userId}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = getUserByIdOutputSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse user: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /admin/users/:userId/portfolio\nexport async function getUserPortfolio(\n input: GetUserTurtlePortfolioInput\n): Promise<GetUserTurtlePortfolioOutput> {\n const endpoint = `/admin/users/${input.userId}/portfolio`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = getUserTurtlePortfolioOutputSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse user portfolio: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { fetchUserNfts } from \"./api\";\n\nexport const nftsQueries = createQueryKeys(\"nfts\", {\n byUser: (userAddress: string, chain: number) => ({\n queryKey: [userAddress, chain],\n queryFn: () => fetchUserNfts(userAddress, chain),\n }),\n});\n\n","import type { UserNft } from \"./schema\";\n\n\nconst LUMON_API_BASE_URL = \"https://lumon.turtle.xyz\";\n\nexport async function fetchUserNfts(userAddress: string, chain: number): Promise<UserNft[]> {\n const endpoint = `${LUMON_API_BASE_URL}/query/token/erc721_portfolio`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n user: userAddress,\n chain,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch user NFTs\");\n }\n\n return response.json();\n}\n\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { checkCoverRequest } from \"./api\";\n\nexport const coversQueries = createQueryKeys(\"covers\", {\n check: (protocolName: string) => ({\n queryKey: [{ protocolName }],\n queryFn: () => checkCoverRequest({ protocolName }),\n }),\n});\n","import { z } from \"zod\";\n\nexport const coverRequestDataSchema = z.object({\n protocolName: z.string(),\n coverageAmount: z.string(),\n periodDays: z.number(),\n desiredApySacrifice: z.string(),\n calculatedEstimatedPremium: z.string(),\n tokenSymbol: z.string(),\n});\n\n\nexport const submitCoverRequestResponseSchema = z.object({\n success: z.boolean(),\n});\n\n\nexport const checkCoverRequestResponseSchema = z.object({\n canSubmit: z.boolean(),\n existingRequest: coverRequestDataSchema.nullable(),\n});\n\nexport type CoverRequestData = z.infer<typeof coverRequestDataSchema>;\nexport type SubmitCoverRequestResponse = z.infer<typeof submitCoverRequestResponseSchema>;\nexport type CheckCoverRequestResponse = z.infer<typeof checkCoverRequestResponseSchema>;\n\n// --- Nexus Cover Purchase Tracking ---\n\nexport const submitCoverPurchaseDataSchema = z.object({\n walletAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, \"Invalid Ethereum address\"),\n txHash: z.string().regex(/^0x[a-fA-F0-9]{64}$/, \"Invalid transaction hash\"),\n});\n\nexport const submitCoverPurchaseResponseSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n id: z.string(),\n});\n\nexport type SubmitCoverPurchaseData = z.infer<typeof submitCoverPurchaseDataSchema>;\nexport type SubmitCoverPurchaseResponse = z.infer<typeof submitCoverPurchaseResponseSchema>;\n\n","import { apiClient } from \"../lib/api-client\";\nimport type { CoverRequestData, SubmitCoverRequestResponse, CheckCoverRequestResponse, SubmitCoverPurchaseData, SubmitCoverPurchaseResponse } from \"./schema\";\nimport { submitCoverRequestResponseSchema, checkCoverRequestResponseSchema, submitCoverPurchaseResponseSchema } from \"./schema\";\n\n// POST /turtle/nexus-cover-requests\nexport async function submitCoverRequest(\n data: CoverRequestData\n): Promise<SubmitCoverRequestResponse> {\n const response = await apiClient.fetch(\"/turtle/nexus-cover-requests\", {\n method: \"POST\",\n body: data,\n });\n\n const result = submitCoverRequestResponseSchema.safeParse(response);\n\n if (!result.success) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to submit cover request due to an invalid server response.`);\n }\n\n return result.data;\n}\n\n// POST /turtle/nexus-cover-purchases\nexport async function submitCoverPurchase(\n data: SubmitCoverPurchaseData\n): Promise<SubmitCoverPurchaseResponse> {\n const response = await apiClient.fetch(\"/turtle/nexus-cover-purchases\", {\n method: \"POST\",\n body: data,\n });\n\n const result = submitCoverPurchaseResponseSchema.safeParse(response);\n\n if (!result.success) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(\"Failed to submit cover purchase tracking due to an invalid server response.\");\n }\n\n return result.data;\n}\n\n// GET /turtle/nexus-cover-requests?protocolName=X\nexport async function checkCoverRequest({\n protocolName,\n}: {\n protocolName: string;\n}): Promise<CheckCoverRequestResponse> {\n const params = new URLSearchParams();\n params.append(\"protocolName\", protocolName);\n\n const response = await apiClient.fetch(\n `/turtle/nexus-cover-requests?${params.toString()}`,\n { method: \"GET\" }\n );\n\n const result = checkCoverRequestResponseSchema.safeParse(response);\n\n if (!result.success) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(\"Failed to check cover request due to an invalid server response.\");\n }\n\n return result.data;\n}\n\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getPortfolioBalance } from \"./api\";\n\nexport const balanceQueries = createQueryKeys(\"balance\", {\n // Portfolio balance by address\n portfolio: (address: string) => ({\n queryKey: [address],\n queryFn: () => getPortfolioBalance(address),\n }),\n});\n","import { z } from \"zod\";\nimport { chainSchema } from \"../supported-chains\";\n\n/**\n * Portfolio API schemas for /wallet/{address}/balance endpoint\n */\n\n// Portfolio API returns a subset of Token fields with some optional\nexport const portfolioTokenSchema = z.object({\n id: z.string(),\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n isNative: z.boolean(),\n logoUrl: z.string().nullable(),\n amount: z.string(), // Portfolio-specific field (decimal format)\n rawAmount: z.string(),\n price: z\n .string()\n .nullable()\n .transform((val) => (val ? parseFloat(val) : null)), // Portfolio-specific field\n // Chain with optional fields to match Portfolio API response\n chain: chainSchema.partial().required({ chainId: true }),\n});\n\nexport type PortfolioToken = z.infer<typeof portfolioTokenSchema>;\n\nexport const portfolioWalletSchema = z.object({\n id: z.string().optional(),\n address: z.string(),\n blockchain: z.string().optional(),\n tokens: z.array(portfolioTokenSchema),\n});\n\nexport type PortfolioWallet = z.infer<typeof portfolioWalletSchema>;\n\nexport const portfolioHoldingsSchema = z.object({\n wallets: z.array(portfolioWalletSchema),\n});\n\nexport type PortfolioHoldings = z.infer<typeof portfolioHoldingsSchema>;\n\nexport const portfolioBalanceResponseSchema = z.object({\n portfolio: z.object({\n holdings: portfolioHoldingsSchema,\n }),\n});\n\nexport type PortfolioBalanceResponse = z.infer<typeof portfolioBalanceResponseSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport type { PortfolioBalanceResponse } from \"./schema\";\nimport { portfolioBalanceResponseSchema } from \"./schema\";\n\nexport async function getPortfolioBalance(\n address: string,\n options?: { debug?: boolean }\n): Promise<PortfolioBalanceResponse> {\n const data = await apiClient.fetch(`/wallet/${address}/balance`, {\n method: \"GET\",\n domain: \"api\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = portfolioBalanceResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse portfolio balance: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getDeposits } from \"./api\";\nimport type { GetDepositsRequest } from \"./schemas\";\n\nexport const depositsQueries = createQueryKeys(\"deposits\", {\n list: (filters: GetDepositsRequest) => ({\n queryKey: [{ filters }],\n queryFn: () => getDeposits(filters),\n }),\n});\n","import { z } from \"zod\";\nimport { paginationMetadataSchema } from \"../schemas/pagination\";\n\n// UUID validation schema\nconst uuidSchema = z.string().uuid();\n\n// Enum schemas for validation\nconst sortBySchema = z.enum([\"date\", \"usd_value\"]).optional();\nconst sortOrderSchema = z.enum([\"asc\", \"desc\"]).optional();\n\n// Request schema for GetDepositsHandler\nexport const getDepositsRequestSchema = z\n .object({\n // Filter by product or opportunity (optional, not mutually exclusive)\n product_id: z.string().uuid().optional(),\n opportunity_id: z.string().uuid().optional(),\n\n // Search query\n search: z.string().optional(),\n\n // Sorting options\n sort_by: sortBySchema,\n sort_order: sortOrderSchema,\n\n // Additional filters\n distributor_id: z.string().optional(),\n depositor_address: z.string().optional(),\n referral: z.string().optional(),\n\n // Pagination\n page: z.number().int().min(1).optional().default(1),\n page_limit: z.number().int().min(1).max(100).optional().default(20),\n })\n .refine(\n (data) => {\n // Exactly one of product_id or opportunity_id must be provided\n const hasProductId = !!data.product_id;\n const hasOpportunityId = !!data.opportunity_id;\n return hasProductId !== hasOpportunityId; // XOR logic\n },\n {\n message: \"Either product_id or opportunity_id must be provided (but not both)\",\n path: [\"product_id\", \"opportunity_id\"],\n }\n );\n\n// Individual deposit response schema\nexport const depositResponseSchema = z.object({\n id: uuidSchema,\n opportunityId: uuidSchema,\n walletId: uuidSchema.nullable().optional(),\n crmWalletId: uuidSchema.nullable().optional(),\n depositorAddress: z.string(),\n amount: z.number(),\n usdValue: z.number(),\n depositTimestamp: z.string().datetime(), // ISO 8601 format\n txHash: z.string(),\n verified: z.boolean().nullable().optional(),\n distributorId: z.string().nullable().optional(),\n referral: z.string().nullable().optional(),\n explorerUrl: z.string().url().nullable().optional(),\n createdAt: z.string().datetime(), // ISO 8601 format\n updatedAt: z.string().datetime(), // ISO 8601 format\n});\n\nexport const depositsMetadataSchema = z.object({\n totalUsdValue: z.number().int().min(0),\n});\n\n// Response schema for GetDepositsHandler\nexport const getDepositsResponseSchema = z.object({\n deposits: z.array(depositResponseSchema),\n pagination: paginationMetadataSchema.partial(),\n metadata: depositsMetadataSchema,\n});\n\n// Type exports for TypeScript\nexport type GetDepositsRequest = z.infer<typeof getDepositsRequestSchema>;\nexport type DepositResponse = z.infer<typeof depositResponseSchema>;\nexport type GetDepositsResponse = z.infer<typeof getDepositsResponseSchema>;\n\n// Validation functions\nexport const validateGetDepositsRequest = (data: unknown): GetDepositsRequest => {\n return getDepositsRequestSchema.parse(data);\n};\n\nexport const validateGetDepositsResponse = (data: unknown): GetDepositsResponse => {\n return getDepositsResponseSchema.parse(data);\n};\n\n// Helper function to validate query parameters from URL\nexport const validateGetDepositsQuery = (\n queryParams: Record<string, string | string[]>\n): GetDepositsRequest => {\n // Convert string values to appropriate types\n const processedParams = {\n product_id: queryParams.product_id as string,\n opportunity_id: queryParams.opportunity_id as string,\n search: queryParams.search as string,\n sort_by: queryParams.sort_by as string,\n sort_order: queryParams.sort_order as string,\n distributor_id: queryParams.distributor_id as string,\n depositor_address: queryParams.depositor_address as string,\n referral: queryParams.referral as string,\n page: queryParams.page ? parseInt(queryParams.page as string) : undefined,\n page_limit: queryParams.page_limit ? parseInt(queryParams.page_limit as string) : undefined,\n };\n\n return getDepositsRequestSchema.parse(processedParams);\n};\n","import { apiClient } from \"../lib/api-client\";\nimport type { GetDepositsRequest, GetDepositsResponse } from \"./schemas\";\nimport { getDepositsResponseSchema } from \"./schemas\";\n\n// GET /turtle/deposits\nexport async function getDeposits(filters: GetDepositsRequest): Promise<GetDepositsResponse> {\n const params = new URLSearchParams();\n\n // Filter by product or opportunity\n if (filters.product_id) params.append(\"product_id\", filters.product_id);\n if (filters.opportunity_id) params.append(\"opportunity_id\", filters.opportunity_id);\n\n // Search query\n if (filters.search) params.append(\"search\", filters.search);\n\n // Sorting options\n if (filters.sort_by) params.append(\"sort_by\", filters.sort_by);\n if (filters.sort_order) params.append(\"sort_order\", filters.sort_order);\n\n // Additional filters\n if (filters.distributor_id) params.append(\"distributor_id\", filters.distributor_id);\n if (filters.depositor_address) params.append(\"depositor_address\", filters.depositor_address);\n if (filters.referral) params.append(\"referral\", filters.referral);\n\n // Pagination\n if (filters.page) params.append(\"page\", filters.page.toString());\n if (filters.page_limit) params.append(\"page_limit\", filters.page_limit.toString());\n\n const queryString = params.toString();\n const endpoint = `/turtle/deposits${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = getDepositsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse deposits: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from '@lukemorales/query-key-factory'\nimport { getIncentive, getIncentives } from './api'\n\nexport const incentivesQueries = createQueryKeys('incentives', {\n // Get all incentives (no filters)\n all: {\n queryKey: null,\n queryFn: () => getIncentives(),\n },\n\n byId: (id: string) => ({\n queryKey: [id],\n queryFn: () => getIncentive(id),\n }),\n})\n","import { apiClient } from \"../lib/api-client\";\nimport {\n CreateIncentiveInput,\n IncentiveResponse,\n incentiveSchema,\n IncentivesResponse,\n incentivesResponseSchema,\n UpdateIncentiveInput,\n UploadIncentiveIconRequest,\n UploadIncentiveIconResponse,\n uploadIncentiveIconResponseSchema,\n} from \"./schema\";\n\n// GET /turtle/incentives\nexport async function getIncentives(): Promise<IncentivesResponse> {\n const params = new URLSearchParams();\n\n const queryString = params.toString();\n const endpoint = `/turtle/incentives${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = incentivesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse incentives: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /admin/incentives/:id\nexport async function getIncentive(id: string): Promise<IncentiveResponse> {\n const endpoint = `/admin/incentives/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse incentive: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /admin/incentives\nexport async function createIncentive(input: CreateIncentiveInput): Promise<IncentiveResponse> {\n const endpoint = `/admin/incentives`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: JSON.stringify(input),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to create incentive: ${result.error.message}`);\n }\n return result.data;\n}\n\n// PUT /admin/incentives/:id\nexport async function updateIncentive(input: UpdateIncentiveInput): Promise<IncentiveResponse> {\n const endpoint = `/admin/incentives/${input.id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"PUT\",\n body: JSON.stringify({ incentive: input }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to update incentive: ${result.error.message}`);\n }\n return result.data;\n}\n\n// DELETE /admin/incentives/:id\nexport async function deleteIncentive(id: string): Promise<void> {\n const endpoint = `/admin/incentives/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to delete incentive: ${result.error.message}`);\n }\n}\n\n// POST /admin/incentives/upload\nexport async function uploadIncentiveIcon({\n file,\n filename,\n overwrite,\n}: UploadIncentiveIconRequest): Promise<UploadIncentiveIconResponse> {\n // Hitting same as products, cause handler is missing\n const endpoint = `/admin/products/upload-logo`;\n\n const formData = new FormData();\n formData.append(\"file\", file as File, filename || file.name);\n\n if (overwrite) {\n formData.append(\"overwrite\", \"true\");\n }\n\n if (filename) {\n formData.append(\"filename\", filename);\n }\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: formData,\n // Don't set Content-Type header - let the browser set it with boundary for multipart/form-data\n });\n\n // Validate response with Zod\n const result = uploadIncentiveIconResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to upload incentive icon: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from '@lukemorales/query-key-factory'\nimport { getLiquidityProviders } from './api'\nimport type { GetLiquidityProvidersInput } from './schema'\n\nexport const liquidityProvidersQueries = createQueryKeys(\n 'liquidityProviders',\n {\n // Get liquidity providers with filters\n list: (input: GetLiquidityProvidersInput) => ({\n queryKey: [{ input }],\n queryFn: () => getLiquidityProviders(input),\n }),\n }\n)\n","import { z } from \"zod\";\nimport { paginationMetadataSchema } from \"../schemas/pagination\";\n\n// Enum schemas for validation\nconst sortBySchema = z\n .enum([\"username\", \"telegram\", \"total_tvl\", \"active_tvl\", \"first_deposit\", \"wallet_count\"])\n .optional();\n\nconst sortOrderSchema = z.enum([\"asc\", \"desc\"]).optional();\n\n// Request schema for GetLiquidityProvidersInput\nexport const getLiquidityProvidersInputSchema = z.object({\n organizationId: z.string().uuid().optional(),\n productId: z.string().uuid().optional(),\n opportunityId: z.string().uuid().optional(),\n sortBy: sortBySchema,\n sortOrder: sortOrderSchema,\n limit: z.number().int().min(1).max(100).optional().default(20),\n offset: z.number().int().min(0).optional().default(0),\n});\n\n// Liquidity Provider schema - matches Go LiquidityProvider struct\nexport const liquidityProviderSchema = z.object({\n username: z.string(),\n totalTvl: z.number(),\n activeTvl: z.number(),\n opportunities: z.array(z.string().uuid()),\n telegram: z.string(),\n firstDeposit: z.string().datetime(), // ISO 8601 format (time.Time in Go)\n walletCount: z.number().int(),\n});\n\n// Response schema for GetLiquidityProvidersResponse\nexport const GetLiquidityProvidersResponseSchema = z.object({\n liquidityProviders: z.array(liquidityProviderSchema),\n pagination: paginationMetadataSchema,\n});\n\n// Type exports for TypeScript\nexport type GetLiquidityProvidersInput = z.infer<typeof getLiquidityProvidersInputSchema>;\nexport type LiquidityProvider = z.infer<typeof liquidityProviderSchema>;\nexport type GetLiquidityProvidersResponse = z.infer<typeof GetLiquidityProvidersResponseSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport type { GetLiquidityProvidersInput, GetLiquidityProvidersResponse } from \"./schema\";\nimport { GetLiquidityProvidersResponseSchema } from \"./schema\";\n\n// GET /deposits/liquidity-providers\nexport async function getLiquidityProviders(\n input: GetLiquidityProvidersInput\n): Promise<GetLiquidityProvidersResponse> {\n const params = new URLSearchParams();\n\n // Filter by organization, product, or opportunity\n if (input.organizationId) params.append(\"organization_id\", input.organizationId);\n if (input.productId) params.append(\"product_id\", input.productId);\n if (input.opportunityId) params.append(\"opportunity_id\", input.opportunityId);\n\n // Sorting options\n if (input.sortBy) params.append(\"sort_by\", input.sortBy);\n if (input.sortOrder) params.append(\"sort_order\", input.sortOrder);\n\n // Pagination\n if (input.limit !== undefined) params.append(\"limit\", input.limit.toString());\n if (input.offset !== undefined) params.append(\"offset\", input.offset.toString());\n\n const queryString = params.toString();\n const endpoint = `/admin/deposits/liquidity-providers${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = GetLiquidityProvidersResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse liquidity providers: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getGeocheck } from \"./api\";\n\nexport const geocheckQueries = createQueryKeys(\"geocheck\", {\n check: {\n queryKey: null,\n queryFn: (context) => getGeocheck(context),\n },\n});\n","import { z } from \"zod\";\n\n// GeoCheck Response Schema\nexport const geoCheckResponseSchema = z.object({\n canInteract: z.boolean(),\n});\n\n// Type exports for TypeScript\nexport type GeoCheckResponse = z.infer<typeof geoCheckResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GeoCheckResponse } from \"./schema\";\nimport { geoCheckResponseSchema } from \"./schema\";\n\n// GET /turtle/geocheck\nexport async function getGeocheck(\n context?: QueryFunctionContext\n): Promise<GeoCheckResponse> {\n const endpoint = `/turtle/geocheck`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n signal: context?.signal,\n });\n\n const result = geoCheckResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse geocheck: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getOrgLeaderboard, getOrgUserLeaderboard } from \"./api\";\nimport type { GetOrgLeaderboardParams } from \"./schema\";\n\nexport const orgLeaderboardQueries = createQueryKeys(\"orgLeaderboard\", {\n list: (orgId: string, params?: GetOrgLeaderboardParams) => ({\n queryKey: [orgId, params],\n queryFn: ({ signal }) => getOrgLeaderboard(orgId, params, { signal }),\n }),\n user: (orgId: string, userId: string) => ({\n queryKey: [orgId, userId],\n queryFn: ({ signal }) => getOrgUserLeaderboard(orgId, userId, { signal }),\n }),\n});\n","import { z } from \"zod\";\n\n// API sortBy values (matches backend)\nexport const orgLeaderboardSortBySchema = z.enum([\n \"rank\",\n \"points\",\n \"username\",\n \"referredValue\",\n \"userTvl\",\n \"dailyPoints\",\n]);\nexport type OrgLeaderboardSortBy = z.infer<typeof orgLeaderboardSortBySchema>;\n\nexport const orgLeaderboardSortOrderSchema = z.enum([\"asc\", \"desc\"]);\nexport type OrgLeaderboardSortOrder = z.infer<typeof orgLeaderboardSortOrderSchema>;\n\n// GET /turtle/leaderboard/organization/:orgId – query params\nexport const getOrgLeaderboardParamsSchema = z.object({\n limit: z.number().int().min(1).max(100).optional().default(20),\n offset: z.number().int().min(0).optional().default(0),\n searchUsername: z.string().optional(),\n onlyWithReferral: z.boolean().optional(),\n minTotalPoints: z.number().optional(),\n maxTotalPoints: z.number().optional(),\n sortBy: orgLeaderboardSortBySchema.optional(),\n sortOrder: orgLeaderboardSortOrderSchema.optional(),\n date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(), // YYYY-MM-DD for historical daily points\n});\nexport type GetOrgLeaderboardParams = z.infer<typeof getOrgLeaderboardParamsSchema>;\n\n// Row shape (list response)\nexport const orgLeaderboardRowSchema = z.object({\n rank: z.number(),\n userId: z.string(),\n turtleUser: z\n .object({\n username: z.string().optional(),\n avatarUrl: z.string().optional(),\n })\n .optional(),\n totalPoints: z.number(),\n userTvl: z.number(),\n dailyPoints: z.number(),\n referredValue: z.number(),\n});\nexport type OrgLeaderboardRow = z.infer<typeof orgLeaderboardRowSchema>;\n\n// List response\nexport const orgLeaderboardResponseSchema = z.object({\n rows: z.array(orgLeaderboardRowSchema),\n total: z.number().optional(),\n totalPages: z.number().optional(),\n});\nexport type OrgLeaderboardResponse = z.infer<typeof orgLeaderboardResponseSchema>;\n\n// GET /turtle/leaderboard/organization/:orgId/user/:userId – response\nexport const orgUserLeaderboardInfoSchema = z.object({\n userId: z.string(),\n username: z.string().optional(),\n rank: z.number(),\n totalUsers: z.number(),\n totalPoints: z.number(),\n userTvl: z.number(),\n dailyPoints: z.number(),\n referredValue: z.number(),\n referralBoostApplied: z.number().optional(),\n});\nexport type OrgUserLeaderboardInfo = z.infer<typeof orgUserLeaderboardInfoSchema>;\n\nexport const orgUserLeaderboardResponseSchema = z.object({\n userInfo: orgUserLeaderboardInfoSchema.optional(),\n});\nexport type OrgUserLeaderboardResponse = z.infer<typeof orgUserLeaderboardResponseSchema>;\n\n// —— White-label config (consumed by org-leaderboard UI package) ——\n\n/** Column id for table/banner. \"username\" is derived from turtleUser in the row. */\nexport type OrgLeaderboardColumnId =\n | keyof OrgLeaderboardRow\n | \"username\";\n\nexport interface OrgLeaderboardColumnConfig {\n id: OrgLeaderboardColumnId;\n label: string;\n showInTable?: boolean;\n showInUserBanner?: boolean;\n}\n\nexport interface OrgLeaderboardConfig {\n orgId: string;\n slug: string;\n name: string;\n logoFallbackUrl?: string;\n productId?: string;\n pointsLabel?: string;\n rewardPoolDescription?: string;\n /** Optional divisor for points (e.g. 1e18 for Nunchi cHIPs). Applied when rendering totalPoints, dailyPoints, referredValue. */\n pointsDivisor?: number;\n columns: OrgLeaderboardColumnConfig[];\n /** Column ids to exclude from mobile grid/card layout (e.g. [\"rank\", \"userTvl\", \"referredValue\"] for Kintsu). */\n mobileGridExcludeColumns?: string[];\n /** Total points column header on desktop (e.g. \"Points\"). */\n pointsColumnLabelDesktop?: string;\n /** Total points column header on mobile (e.g. \"Total Kintsu Points\"). */\n pointsColumnLabelMobile?: string;\n}\n","import { apiClient } from \"../lib/api-client\";\nimport type {\n GetOrgLeaderboardParams,\n OrgLeaderboardResponse,\n OrgUserLeaderboardResponse,\n} from \"./schema\";\nimport {\n orgLeaderboardResponseSchema,\n orgUserLeaderboardResponseSchema,\n} from \"./schema\";\n\n/**\n * GET /turtle/leaderboard/organization/:orgId\n * Paginated, sortable, filterable org leaderboard list.\n */\nexport async function getOrgLeaderboard(\n orgId: string,\n params?: GetOrgLeaderboardParams,\n options?: { signal?: AbortSignal }\n): Promise<OrgLeaderboardResponse> {\n const searchParams = new URLSearchParams();\n if (params?.limit !== undefined) searchParams.set(\"limit\", String(params.limit));\n if (params?.offset !== undefined) searchParams.set(\"offset\", String(params.offset));\n if (params?.searchUsername) searchParams.set(\"searchUsername\", params.searchUsername);\n if (params?.onlyWithReferral !== undefined)\n searchParams.set(\"onlyWithReferral\", String(params.onlyWithReferral));\n if (params?.minTotalPoints !== undefined)\n searchParams.set(\"minTotalPoints\", String(params.minTotalPoints));\n if (params?.maxTotalPoints !== undefined)\n searchParams.set(\"maxTotalPoints\", String(params.maxTotalPoints));\n if (params?.sortBy) searchParams.set(\"sortBy\", params.sortBy);\n if (params?.sortOrder) searchParams.set(\"sortOrder\", params.sortOrder);\n if (params?.date) searchParams.set(\"date\", params.date);\n\n const query = searchParams.toString();\n const endpoint = `/turtle/leaderboard/organization/${orgId}${query ? `?${query}` : \"\"}`;\n\n const data = await apiClient.fetch<unknown>(endpoint, {\n method: \"GET\",\n signal: options?.signal,\n });\n\n const result = orgLeaderboardResponseSchema.safeParse(data);\n if (!result.success) {\n console.error(\"[org-leaderboard] list parse error\", result.error);\n throw new Error(`Failed to parse org leaderboard response: ${result.error.message}`);\n }\n return result.data;\n}\n\n/**\n * GET /turtle/leaderboard/organization/:orgId/user/:userId\n * User rank/stats for the \"your stats\" banner.\n */\nexport async function getOrgUserLeaderboard(\n orgId: string,\n userId: string,\n options?: { signal?: AbortSignal }\n): Promise<OrgUserLeaderboardResponse> {\n const endpoint = `/turtle/leaderboard/organization/${orgId}/user/${userId}`;\n const data = await apiClient.fetch<unknown>(endpoint, {\n method: \"GET\",\n signal: options?.signal,\n });\n\n const result = orgUserLeaderboardResponseSchema.safeParse(data);\n if (!result.success) {\n console.error(\"[org-leaderboard] user parse error\", result.error);\n throw new Error(`Failed to parse org user leaderboard response: ${result.error.message}`);\n }\n return result.data;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { earnOpportunitiesQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\n\nexport function useEarnOpportunities() {\n return useQuery({\n ...earnOpportunitiesQueries.all,\n ...queryDefaults,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { earnRouteQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { EarnRouteParams } from \"./schema\";\n\nexport interface UseEarnRouteOptions {\n params?: EarnRouteParams;\n enabled?: boolean;\n}\n\nexport function useEarnRoute({ params, enabled = true }: UseEarnRouteOptions) {\n return useQuery({\n // Null assertion is safe because the query is enable only if params is provided\n ...earnRouteQueries.byParams(params!),\n ...queryDefaults,\n enabled: !!params && enabled,\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { earnMembershipQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport { createMembershipAgreement, createMembership } from \"./api\";\nimport type {\n CheckMembershipParams,\n CreateAgreementRequest,\n CreateMembershipRequest,\n} from \"./schema\";\n\n// Query hook for checking membership\nexport interface UseCheckMembershipOptions {\n params: CheckMembershipParams;\n enabled?: boolean;\n}\n\nexport function useCheckMembership({\n params,\n enabled = true,\n}: UseCheckMembershipOptions) {\n return useQuery({\n ...earnMembershipQueries.check(params),\n ...queryDefaults,\n enabled,\n });\n}\n\n// Mutation hook for creating membership agreement\nexport function useCreateMembershipAgreement() {\n return useMutation({\n mutationFn: (request: CreateAgreementRequest) =>\n createMembershipAgreement(request),\n });\n}\n\n// Mutation hook for creating membership\nexport function useCreateMembership() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (request: CreateMembershipRequest) => createMembership(request),\n onSuccess: (data, variables) => {\n queryClient.invalidateQueries({\n queryKey: earnMembershipQueries.check({\n address: variables.address,\n walletEcosystem: variables.walletEcosystem as \"evm\" | \"solana\" | \"ton\",\n }).queryKey,\n });\n },\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { earnDepositsQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetDepositsParams } from \"./schema\";\n\nexport interface UseDepositsOptions {\n params: GetDepositsParams;\n enabled?: boolean;\n}\n\nexport function useDeposits({ params, enabled = true }: UseDepositsOptions) {\n return useQuery({\n ...earnDepositsQueries.byParams(params),\n ...queryDefaults,\n enabled,\n });\n}\n\n// Re-export validation hook\nexport {\n useDepositValidation,\n type UseDepositValidationOptions,\n type DepositValidationResult,\n} from \"./hooks/useDepositValidation\";\n\n// Re-export selection hook\nexport {\n useDepositSelection,\n type UseDepositSelectionOptions,\n type UseDepositSelectionReturn,\n} from \"./hooks/useDepositSelection\";\n\n// Re-export flow orchestrator hook\nexport {\n useDepositFlow,\n type UseDepositFlowOptions,\n type UseDepositFlowReturn,\n} from \"./hooks/useDepositFlow\";\n\n// Re-export actions default params hook\nexport {\n useActionsDefaultParams,\n type UseActionsDefaultParamsOptions,\n type UseActionsDefaultParamsReturn,\n} from \"./hooks/useActionsDefaultParams\";\n\n// Re-export deposit mode utilities\nexport {\n getDepositModeFlags,\n resolveEffectiveDepositMode,\n type DepositMode,\n type DepositModeFlags,\n} from \"./hooks/utils\";\n","import { useMemo } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport { formatUnits } from \"viem\";\nimport { Opportunity } from \"../../opportunities\";\nimport { getDepositModeFlags } from \"./utils\";\n\nexport interface UseDepositValidationOptions {\n opportunity: Opportunity | null;\n selectedTokenBalance: TokenBalance | null;\n amountBigInt: bigint | undefined;\n isPending?: boolean;\n isConfirming?: boolean;\n /** Current wallet chain ID */\n walletChainId?: number;\n}\n\nexport interface DepositValidationResult {\n // Main validation state\n canDeposit: boolean;\n\n // Individual validations\n isBelowMinimum: boolean;\n isAboveMaximum: boolean;\n hasInsufficientBalance: boolean;\n isDepositDisabled: boolean;\n isZeroAmount: boolean;\n isNoTokenSelected: boolean;\n isVaultFull: boolean;\n\n // Validation limits\n minDepositUSD: number;\n maxDepositUSD: number | null;\n depositCapUSD: number | null;\n depositCapPercentFilled: number | null;\n depositDisabledReason: string | null;\n\n // Fee information\n depositFee: number | null;\n performanceFee: number | null;\n managementFee: number | null;\n withdrawalFee: number | null;\n\n // Timing information\n withdrawalCooldownSecs: number | null;\n\n // Computed values\n inputAmountUSD: number | null;\n balanceUSD: number | null;\n\n // Vault config flags\n hasAsyncDeposit: boolean;\n isSecondaryOnly: boolean;\n\n // Chain validation\n isWrongChain: boolean;\n requiredChainId: number | null;\n\n // Button state\n buttonText: string;\n validationMessage: string | null;\n}\n\n/**\n * Calculates the USD value for a given amount and token\n */\nfunction calculateUsdValue(amount: bigint, token: TokenBalance[\"token\"]): number | null {\n if (!token.priceUsd) return null;\n const formatted = parseFloat(formatUnits(amount, token.decimals));\n return formatted * token.priceUsd;\n}\n\n/**\n * Hook for deposit validation logic\n * Consolidates all validation checks for deposit operations\n */\nexport function useDepositValidation({\n opportunity,\n selectedTokenBalance,\n amountBigInt,\n isPending = false,\n isConfirming = false,\n walletChainId,\n}: UseDepositValidationOptions): DepositValidationResult {\n return useMemo(() => {\n if (!opportunity) {\n return {\n canDeposit: false,\n isBelowMinimum: false,\n isAboveMaximum: false,\n hasInsufficientBalance: false,\n isDepositDisabled: false,\n isZeroAmount: true,\n isNoTokenSelected: true,\n isVaultFull: false,\n minDepositUSD: 0,\n maxDepositUSD: null,\n depositCapUSD: null,\n depositCapPercentFilled: null,\n depositDisabledReason: null,\n depositFee: null,\n performanceFee: null,\n managementFee: null,\n withdrawalFee: null,\n withdrawalCooldownSecs: null,\n inputAmountUSD: null,\n balanceUSD: null,\n hasAsyncDeposit: false,\n isSecondaryOnly: false,\n isWrongChain: false,\n requiredChainId: null,\n buttonText: \"Select opportunity\",\n validationMessage: \"Please select an opportunity\",\n };\n }\n\n const vaultConfig = opportunity.vaultConfig;\n const { noModesEnabled } = getDepositModeFlags(opportunity);\n const depositDisabled = (opportunity.depositDisabled ?? false) || noModesEnabled;\n const depositDisabledReason = opportunity.depositDisabledReason || null;\n\n const depositFee = vaultConfig?.depositFee ?? null;\n const performanceFee = vaultConfig?.performanceFee ?? null;\n const managementFee = vaultConfig?.managementFee ?? null;\n const withdrawalFee = vaultConfig?.withdrawalFee ?? null;\n const withdrawalCooldownSecs = vaultConfig?.withdrawalCooldownSecs ?? null;\n\n const hasAsyncDeposit = vaultConfig?.asyncDeposit === true;\n const isSecondaryOnly = vaultConfig?.secondaryOnly === true;\n\n // Chain validation\n const requiredChainId = Number(opportunity.receiptToken.chain.chainId);\n const isWrongChain = walletChainId !== undefined && walletChainId !== requiredChainId;\n\n const isNoTokenSelected = !selectedTokenBalance;\n const isZeroAmount = !amountBigInt || amountBigInt <= 0n;\n\n // Price of the selected token (for input amount USD calculation)\n const selectedTokenPrice = selectedTokenBalance?.token.priceUsd ?? null;\n\n // Price of the primary deposit token (for min/max deposit validation)\n // minDepositAmount is expressed in units of the primary depositToken, not the selected token\n const primaryDepositToken = opportunity.depositTokens?.[0];\n const primaryDepositTokenPrice = primaryDepositToken?.priceUsd ?? null;\n\n let inputAmountUSD: number | null = null;\n let balanceUSD: number | null = null;\n\n if (selectedTokenBalance && amountBigInt) {\n inputAmountUSD = calculateUsdValue(amountBigInt, selectedTokenBalance.token);\n }\n\n if (selectedTokenBalance) {\n const balanceAmount = BigInt(selectedTokenBalance.amount);\n balanceUSD = calculateUsdValue(balanceAmount, selectedTokenBalance.token);\n }\n\n // Calculate minDepositUSD using the primary deposit token price\n // minDepositAmount is expressed in the primary deposit token's units\n const minDepositAmount = vaultConfig?.minDepositAmount ?? 0;\n const minDepositValueUSD = vaultConfig?.minDepositValueUSD ?? 0;\n const minDepositUSD = Math.max(\n minDepositAmount * (primaryDepositTokenPrice ?? 0),\n minDepositValueUSD\n );\n\n // Calculate maxDepositUSD (deposit cap) - prioritize USD value from vaultConfig\n const depositCapAmount = vaultConfig?.depositCapAmount;\n // depositCapValueUSD is the authoritative source for deposit cap in USD\n const depositCapValueUSD = vaultConfig?.depositCapValueUSD;\n\n // Calculate the cap in USD - prioritize USD value, fallback to amount * price\n const depositCapUSD =\n depositCapValueUSD ??\n (depositCapAmount && primaryDepositTokenPrice\n ? depositCapAmount * primaryDepositTokenPrice\n : null);\n\n // maxDepositUSD is used for per-deposit validation\n const maxDepositUSD = depositCapUSD;\n\n // Calculate vault fullness\n const tvl = opportunity.tvl ?? 0;\n const isVaultFull = depositCapUSD !== null && tvl >= depositCapUSD;\n const depositCapPercentFilled =\n depositCapUSD !== null && depositCapUSD > 0\n ? Math.min((tvl / depositCapUSD) * 100, 100)\n : null;\n\n let hasInsufficientBalance = false;\n if (selectedTokenBalance && amountBigInt) {\n const balanceAmount = BigInt(selectedTokenBalance.amount);\n hasInsufficientBalance = amountBigInt > balanceAmount;\n }\n\n const isBelowMinimum = !!(\n inputAmountUSD !== null &&\n minDepositUSD > 0 &&\n inputAmountUSD < minDepositUSD\n );\n\n const isAboveMaximum = !!(\n inputAmountUSD !== null &&\n maxDepositUSD !== null &&\n inputAmountUSD > maxDepositUSD\n );\n\n let buttonText: string;\n let validationMessage: string | null = null;\n\n if (isWrongChain) {\n buttonText = \"Switch chain\";\n } else if (isPending) {\n buttonText = \"Confirming...\";\n } else if (isConfirming) {\n buttonText = \"Processing...\";\n } else if (depositDisabled) {\n buttonText = depositDisabledReason || \"Deposits disabled\";\n validationMessage =\n depositDisabledReason || \"Deposits are currently disabled for this opportunity\";\n } else if (isVaultFull) {\n buttonText = \"Deposit cap reached\";\n validationMessage = \"This vault has reached its deposit cap\";\n } else if (isNoTokenSelected) {\n buttonText = \"Select token\";\n validationMessage = \"Please select a token to deposit\";\n } else if (isZeroAmount) {\n buttonText = \"Enter amount\";\n } else if (hasInsufficientBalance) {\n buttonText = \"Insufficient balance\";\n validationMessage = \"Your balance is insufficient for this deposit amount\";\n } else if (isBelowMinimum) {\n buttonText = `Minimum $${minDepositUSD.toLocaleString()}`;\n validationMessage = `Minimum deposit is $${minDepositUSD.toLocaleString()}`;\n } else if (isAboveMaximum && maxDepositUSD != null) {\n buttonText = `Maximum $${maxDepositUSD.toLocaleString()}`;\n validationMessage = `Maximum deposit is $${maxDepositUSD.toLocaleString()}`;\n } else if (isSecondaryOnly) {\n buttonText = \"Buy\";\n } else if (hasAsyncDeposit) {\n buttonText = \"Request deposit\";\n } else {\n buttonText = \"Deposit\";\n }\n\n const isDepositing = isPending || isConfirming;\n const canDeposit =\n !depositDisabled &&\n !isVaultFull &&\n !isDepositing &&\n !isNoTokenSelected &&\n !isZeroAmount &&\n !hasInsufficientBalance &&\n !isBelowMinimum &&\n !isAboveMaximum;\n\n return {\n canDeposit,\n isBelowMinimum,\n isAboveMaximum,\n hasInsufficientBalance,\n isDepositDisabled: depositDisabled,\n isZeroAmount,\n isNoTokenSelected,\n isVaultFull,\n minDepositUSD,\n maxDepositUSD,\n depositCapUSD,\n depositCapPercentFilled,\n depositDisabledReason,\n depositFee,\n performanceFee,\n managementFee,\n withdrawalFee,\n withdrawalCooldownSecs,\n inputAmountUSD,\n balanceUSD,\n hasAsyncDeposit,\n isSecondaryOnly,\n isWrongChain,\n requiredChainId,\n buttonText,\n validationMessage,\n };\n }, [opportunity, selectedTokenBalance, amountBigInt, isPending, isConfirming, walletChainId]);\n}\n","import type { Opportunity } from \"../../opportunities\";\n\nexport type DepositMode = \"native\" | \"route\";\n\nexport interface DepositModeFlags {\n isSecondaryOnly: boolean;\n routeModeEnabled: boolean;\n directModeEnabled: boolean;\n noModesEnabled: boolean;\n}\n\nexport function getDepositModeFlags(opportunity: Opportunity | null): DepositModeFlags {\n const isSecondaryOnly = opportunity?.vaultConfig?.secondaryOnly === true;\n const routeModeEnabled = opportunity?.swapRouteEnabled ?? false;\n const directModeEnabled = opportunity?.swapDirectEnabled ?? true;\n const noModesEnabled = !routeModeEnabled && !directModeEnabled;\n return { isSecondaryOnly, routeModeEnabled, directModeEnabled, noModesEnabled };\n}\n\nexport function resolveEffectiveDepositMode(\n depositMode: DepositMode,\n flags: DepositModeFlags\n): DepositMode {\n if (flags.isSecondaryOnly) return \"route\";\n if (!flags.directModeEnabled && flags.routeModeEnabled) return \"route\";\n return depositMode;\n}\n","import { useState, useEffect, useMemo, useCallback } from \"react\";\nimport type { TokenBalance } from \"../../balance/types\";\nimport { useTokenBalance } from \"../../balance/hooks/useTokenBalance\";\n\nexport interface UseDepositSelectionOptions {\n /** Available token balances to select from */\n balances: TokenBalance[];\n /** Opportunity ID - used to reset selection when opportunity changes */\n opportunityId: string | undefined;\n}\n\nexport interface UseDepositSelectionReturn {\n /** Currently selected token address */\n selectedTokenAddress: string | undefined;\n /** Set the selected token address */\n setSelectedTokenAddress: (address: string | undefined) => void;\n /** Current input amount as string */\n amount: string | undefined;\n /** Set the input amount */\n setAmount: (amount: string | undefined) => void;\n /** The selected token's balance data */\n selectedTokenBalance: TokenBalance | null;\n /** Amount converted to bigint (wei) */\n amountBigInt: bigint | undefined;\n /** USD value of the current amount (formatted string) */\n usdValue: string | undefined;\n /** Whether current amount exceeds balance */\n hasInsufficientBalance: boolean;\n /** Handler for max button click */\n handleMaxClick: () => void;\n /** Reset selection to initial state */\n reset: () => void;\n}\n\n/**\n * Hook to manage token and amount selection for deposits.\n * Handles:\n * - Token selection state with auto-select first token\n * - Amount input state with bigint conversion\n * - USD value calculation\n * - Balance validation\n * - Reset on opportunity change\n */\nexport function useDepositSelection({\n balances,\n opportunityId,\n}: UseDepositSelectionOptions): UseDepositSelectionReturn {\n const [selectedTokenAddress, setSelectedTokenAddress] = useState<string | undefined>();\n const [amount, setAmount] = useState<string | undefined>();\n\n // Reset selection when opportunity changes\n useEffect(() => {\n setSelectedTokenAddress(undefined);\n setAmount(undefined);\n }, [opportunityId]);\n\n // Auto-select first token when balances change and current selection is invalid\n useEffect(() => {\n if (balances.length === 0) return;\n\n const tokenExistsInBalances = balances.some(\n (b) => b.token.address === selectedTokenAddress\n );\n\n if (!selectedTokenAddress || !tokenExistsInBalances) {\n setSelectedTokenAddress(balances[0].token.address);\n }\n }, [selectedTokenAddress, balances]);\n\n // Find selected token balance\n const selectedTokenBalance = useMemo(\n () => balances.find((b) => b.token.address === selectedTokenAddress) ?? null,\n [balances, selectedTokenAddress]\n );\n\n // Use existing token balance hook for calculations\n const { handleMaxClick, amountBigInt, usdValue, hasInsufficientBalance } = useTokenBalance({\n tokenBalance: selectedTokenBalance,\n amount,\n setAmount,\n });\n\n // Reset function\n const reset = useCallback(() => {\n setSelectedTokenAddress(undefined);\n setAmount(undefined);\n }, []);\n\n return {\n selectedTokenAddress,\n setSelectedTokenAddress,\n amount,\n setAmount,\n selectedTokenBalance,\n amountBigInt,\n usdValue,\n hasInsufficientBalance,\n handleMaxClick,\n reset,\n };\n}\n","import { useCallback, useMemo } from \"react\";\nimport { parseUnits } from \"viem\";\nimport { calculateUsdValue, calculateMaxAmount } from \"@turtleclub/utils\";\nimport { TokenBalance } from \"../types\";\n\ninterface UseTokenBalanceProps {\n tokenBalance: TokenBalance | null;\n amount: string | undefined;\n setAmount: (amount: string | undefined) => void;\n}\n\nfunction checkInsufficientBalance(\n tokenBalance: TokenBalance | null,\n amount: string | undefined\n): boolean {\n if (!tokenBalance || !amount) return false;\n\n try {\n const balance = BigInt(tokenBalance.amount);\n const amountBigInt = parseUnits(amount, tokenBalance.token.decimals);\n return balance < amountBigInt;\n } catch (error) {\n console.error(\"[Balance Check Error]\", error, { tokenBalance, amount });\n return true; // Assume insufficient if there's an error\n }\n}\n\n/**\n * Hook to calculate the USD value of a token balance\n * - Calculate the USD value of the token balance\n * - Check if the balance is insufficient\n * - Calculate the maximum amount that can be used\n * - Convert the amount to a bigint\n */\nexport function useTokenBalance({ tokenBalance, amount, setAmount }: UseTokenBalanceProps) {\n const token = tokenBalance?.token;\n const usdValue = useMemo(\n () => calculateUsdValue(amount, token?.priceUsd),\n [amount, token?.priceUsd]\n );\n\n const hasInsufficientBalance = useMemo(\n () => checkInsufficientBalance(tokenBalance, amount),\n [tokenBalance, amount]\n );\n\n const handleMaxClick = useCallback(() => {\n if (!tokenBalance?.token || !tokenBalance.amount) return;\n const maxAmount = calculateMaxAmount(tokenBalance.amount, tokenBalance.token.decimals);\n setAmount(maxAmount);\n }, [tokenBalance, setAmount]);\n\n const amountBigInt = useMemo(() => {\n if (!token || !amount) return undefined;\n try {\n return parseUnits(amount, token.decimals);\n } catch {\n return undefined;\n }\n }, [amount, token]);\n\n return {\n usdValue,\n hasInsufficientBalance,\n handleMaxClick,\n amountBigInt,\n };\n}\n","import { useCallback } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport type { TransactionRequest } from \"../../earn-actions/useEarnDeposit\";\nimport type { ActionMode, RouteMetadata } from \"../../earn-actions/schema\";\nimport { useEarnDeposit } from \"../../earn-actions/useEarnDeposit\";\nimport { useDepositSelection, type UseDepositSelectionReturn } from \"./useDepositSelection\";\nimport { useDepositValidation, type DepositValidationResult } from \"./useDepositValidation\";\nimport { Opportunity } from \"../../opportunities\";\n\nexport interface UseDepositFlowOptions {\n mode: ActionMode;\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n balances: TokenBalance[];\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onDepositSuccess?: () => void;\n refetchBalances?: () => void;\n /** Slippage in basis points (e.g., 50 = 0.5%). If not provided, uses default. */\n slippageBps?: number;\n /** Current wallet chain ID for chain validation */\n walletChainId?: number;\n}\n\nexport interface UseDepositFlowReturn {\n selection: UseDepositSelectionReturn;\n validation: DepositValidationResult;\n deposit: {\n execute: () => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n isDepositing: boolean;\n error: Error | null;\n metadata: RouteMetadata | null;\n hasApprove: boolean;\n resetMetadata: () => void;\n };\n}\n\n/** Orchestrates token selection, validation, and deposit execution */\nexport function useDepositFlow({\n mode,\n opportunity,\n userAddress,\n distributorId,\n balances,\n executeTransactionAndWait,\n onDepositSuccess,\n refetchBalances,\n slippageBps,\n walletChainId,\n}: UseDepositFlowOptions): UseDepositFlowReturn {\n const selection = useDepositSelection({\n balances,\n opportunityId: opportunity?.id,\n });\n\n const {\n deposit: executeDeposit,\n isPending,\n isConfirming,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n } = useEarnDeposit({\n mode,\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess: () => {\n selection.setAmount(undefined);\n resetMetadata();\n refetchBalances?.();\n onDepositSuccess?.();\n },\n });\n\n const isDepositing = isPending || isConfirming;\n\n const validation = useDepositValidation({\n opportunity,\n selectedTokenBalance: selection.selectedTokenBalance,\n amountBigInt: selection.amountBigInt,\n isPending,\n isConfirming,\n walletChainId,\n });\n\n const execute = useCallback(async () => {\n if (!selection.amountBigInt || !selection.selectedTokenAddress) {\n return undefined;\n }\n return executeDeposit(selection.amountBigInt, selection.selectedTokenAddress, slippageBps);\n }, [selection.amountBigInt, selection.selectedTokenAddress, executeDeposit, slippageBps]);\n\n return {\n selection,\n validation,\n deposit: {\n execute,\n isPending,\n isConfirming,\n isDepositing,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n },\n };\n}\n","import { useState, useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useDepositAction, useAttributeAction } from \"./hooks\";\nimport { balanceQueries } from \"../balance/queries\";\n\nimport type { TxResponseItem, RouteMetadata, ActionMode } from \"./schema\";\nimport { Opportunity } from \"../opportunities\";\n\nexport interface TransactionRequest {\n to: string;\n data: string;\n value?: string;\n gasLimit?: string;\n type?: string;\n}\n\nexport interface UseEarnDepositOptions {\n mode: ActionMode;\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onSuccess?: () => void;\n referralCode?: string;\n}\n\nexport interface UseEarnDepositReturn {\n deposit: (amount: bigint, tokenAddress: string, slippage?: number) => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n error: Error | null;\n metadata: RouteMetadata | null;\n hasApprove: boolean;\n resetMetadata: () => void;\n}\n\nconst DEFAULT_SLIPPAGE_BPS = 50;\n\nexport function useEarnDeposit(options: UseEarnDepositOptions): UseEarnDepositReturn {\n const {\n mode,\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess,\n referralCode,\n } = options;\n\n const queryClient = useQueryClient();\n const [isConfirming, setIsConfirming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [metadata, setMetadata] = useState<RouteMetadata | null>(null);\n const [hasApprove, setHasApprove] = useState(false);\n\n const depositAction = useDepositAction();\n const attributeAction = useAttributeAction();\n\n const toTransactionRequest = useCallback((txItem: TxResponseItem): TransactionRequest => {\n return {\n to: txItem.transaction.to,\n data: txItem.transaction.data,\n value: txItem.transaction.value,\n gasLimit: txItem.transaction.gasLimit,\n type: txItem.type,\n };\n }, []);\n\n const executeTransactionsSequentially = useCallback(\n async (transactions: TxResponseItem[]): Promise<string | undefined> => {\n let lastTxHash: string | undefined;\n\n for (const txItem of transactions) {\n const txRequest = toTransactionRequest(txItem);\n // executeTransactionAndWait should wait for receipt before returning\n const txHash = await executeTransactionAndWait(txRequest);\n\n if (!txHash) {\n throw new Error(`Transaction failed: ${txItem.description || \"Unknown transaction\"}`);\n }\n\n lastTxHash = txHash;\n }\n\n return lastTxHash;\n },\n [executeTransactionAndWait, toTransactionRequest]\n );\n\n const attributeTransactionSafely = useCallback(\n async (actionId: string, txHash: string): Promise<void> => {\n try {\n await attributeAction.mutateAsync({ actionId, txHash });\n } catch (attributeError) {\n console.warn(\"[useEarnDeposit] Attribution failed (non-blocking):\", attributeError);\n }\n },\n [attributeAction]\n );\n\n const deposit = useCallback(\n async (\n amount: bigint,\n tokenAddress: string,\n slippage: number = DEFAULT_SLIPPAGE_BPS\n ): Promise<string | undefined> => {\n setError(null);\n\n if (!opportunity?.id) {\n const err = new Error(\"No opportunity selected\");\n setError(err);\n throw err;\n }\n\n if (!userAddress) {\n const err = new Error(\"No wallet connected\");\n setError(err);\n throw err;\n }\n\n if (amount <= 0n) {\n const err = new Error(\"Amount must be greater than 0\");\n setError(err);\n throw err;\n }\n\n try {\n const actionResponse = await depositAction.mutateAsync({\n mode,\n opportunityId: opportunity.id,\n userAddress,\n tokenIn: tokenAddress,\n amount: amount.toString(),\n distributorId,\n referralCode,\n slippageBps: slippage,\n });\n\n const { actionId, transactions } = actionResponse;\n\n if (!transactions || transactions.length === 0) {\n throw new Error(\"No transactions returned from deposit action\");\n }\n\n const txWithMetadata = transactions.find((tx) => tx.metadata);\n if (txWithMetadata?.metadata) {\n setMetadata(txWithMetadata.metadata);\n }\n\n const hasApproveTx = transactions.some((tx) => tx.type === \"approve\");\n setHasApprove(hasApproveTx);\n\n setIsConfirming(true);\n const finalTxHash = await executeTransactionsSequentially(transactions);\n\n if (actionId && finalTxHash) {\n await attributeTransactionSafely(actionId, finalTxHash);\n }\n\n if (userAddress) {\n queryClient.invalidateQueries({\n queryKey: balanceQueries.portfolio(userAddress).queryKey,\n });\n }\n onSuccess?.();\n\n return finalTxHash;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsConfirming(false);\n }\n },\n [\n opportunity?.id,\n userAddress,\n distributorId,\n referralCode,\n depositAction,\n executeTransactionsSequentially,\n attributeTransactionSafely,\n queryClient,\n onSuccess,\n ]\n );\n\n const resetMetadata = useCallback(() => {\n setMetadata(null);\n setHasApprove(false);\n }, []);\n\n return {\n deposit,\n isPending: depositAction.isPending,\n isConfirming,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n };\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport {\n createDepositAction,\n createWithdrawAction,\n createClaimWithdrawAction,\n createClaimDepositAction,\n createCancelDepositAction,\n createCancelWithdrawAction,\n attributeAction,\n} from \"./api\";\nimport type {\n ActionResponse,\n ActionParams,\n CancelDepositActionParams,\n ClaimDepositActionParams,\n WithdrawActionParams,\n AttributeActionParams,\n AttributeActionResponse,\n} from \"./schema\";\n\n// Re-export param types for convenience\nexport type {\n ActionParams,\n ActionResponse,\n AttributeActionParams,\n AttributeActionResponse,\n DepositActionParams,\n WithdrawActionParams,\n ClaimWithdrawActionParams,\n ClaimDepositActionParams,\n CancelDepositActionParams,\n CancelWithdrawActionParams,\n // Legacy\n InteractionParams,\n InteractionResponse,\n CreateDepositInteractionParams,\n CreateWithdrawInteractionParams,\n CreateClaimWithdrawInteractionParams,\n} from \"./schema\";\n\n// Hook options type aliases\ntype ActionMutationOptions = Omit<\n UseMutationOptions<ActionResponse, Error, ActionParams>,\n \"mutationFn\"\n>;\n\ntype AttributeActionMutationOptions = Omit<\n UseMutationOptions<AttributeActionResponse, Error, AttributeActionParams>,\n \"mutationFn\"\n>;\n\n// Higher-order function to create action hooks - DRY helper\nfunction createActionHook<TParams = ActionParams>(\n mutationFn: (params: TParams) => Promise<ActionResponse>\n) {\n return function useAction(\n options?: Omit<UseMutationOptions<ActionResponse, Error, TParams>, \"mutationFn\">\n ) {\n return useMutation({\n mutationFn,\n ...options,\n });\n };\n}\n\n/**\n * Hook for creating a deposit action\n * POST /v1/actions/deposit/{opportunityId}\n */\nexport const useDepositAction = createActionHook(createDepositAction);\n\n/**\n * Hook for creating a withdraw action\n * POST /v1/actions/withdraw/{opportunityId}\n */\nexport const useWithdrawAction = createActionHook<WithdrawActionParams>(createWithdrawAction);\n\n/**\n * Hook for creating a claim-withdraw action\n * POST /v1/actions/claim-withdraw/{opportunityId}\n */\nexport const useClaimWithdrawAction = createActionHook(createClaimWithdrawAction);\n\n/**\n * Hook for creating a claim-deposit action\n * POST /v1/actions/claim-deposit/{opportunityId}\n */\nexport const useClaimDepositAction = createActionHook<ClaimDepositActionParams>(createClaimDepositAction);\n\n/**\n * Hook for creating a cancel-deposit action\n * POST /v1/actions/cancel-deposit/{opportunityId}\n */\nexport const useCancelDepositAction = createActionHook<CancelDepositActionParams>(createCancelDepositAction);\n\n/**\n * Hook for creating a cancel-withdraw action\n * POST /v1/actions/cancel-withdraw/{opportunityId}\n */\nexport const useCancelWithdrawAction = createActionHook(createCancelWithdrawAction);\n\n/**\n * Hook for attributing a transaction hash to an action\n * POST /v1/actions/attribute/{actionId}\n */\nexport function useAttributeAction(options?: AttributeActionMutationOptions) {\n return useMutation({\n mutationFn: attributeAction,\n ...options,\n });\n}\n\n// Legacy aliases for backwards compatibility\nexport const useCreateDepositInteraction = useDepositAction;\nexport const useCreateWithdrawInteraction = useWithdrawAction;\nexport const useCreateClaimWithdrawInteraction = useClaimWithdrawAction;\n","import { z } from \"zod\";\n\nexport const transactionSchema = z.object({\n chainId: z.number().int(),\n data: z.string(),\n to: z.string(),\n value: z.string(),\n gasLimit: z.string().optional(),\n});\n\nexport const routeTokenSchema = z.object({\n address: z.string(),\n symbol: z.string(),\n decimals: z.number().int(),\n logoUrl: z.string(),\n});\n\nexport const routeStepSchema = z.object({\n action: z.string(),\n from: routeTokenSchema,\n to: routeTokenSchema,\n});\n\nexport const routeMetadataSchema = z.object({\n provider: z.string(),\n providerImg: z.string(),\n amountOut: z.string(),\n gas: z.string(),\n route: z.array(routeStepSchema),\n});\n\nexport const txResponseItemSchema = z.object({\n type: z.string().optional(),\n description: z.string().optional(),\n transaction: transactionSchema,\n metadata: routeMetadataSchema.optional(),\n});\n\nexport const actionResponseSchema = z.object({\n actionId: z.string().uuid().optional(),\n transactions: z.array(txResponseItemSchema).nullable(),\n});\n\nexport const attributeActionResponseSchema = z.object({\n success: z.boolean(),\n message: z.string().optional(),\n});\n\nexport type ActionMode = \"direct\" | \"swap\";\nexport interface ActionParams {\n mode: ActionMode;\n opportunityId: string;\n userAddress: string;\n tokenIn: string;\n amount: string;\n distributorId: string;\n referralCode?: string;\n slippageBps?: number;\n}\n\nexport interface AttributeActionParams {\n actionId: string;\n txHash: string;\n}\n\nexport type DepositActionParams = ActionParams;\nexport interface WithdrawActionParams {\n opportunityId: string;\n userAddress: string;\n amount: string;\n distributorId: string;\n tokenOut?: string;\n slippageBps?: number;\n}\nexport type ClaimWithdrawActionParams = ActionParams;\nexport interface ClaimDepositActionParams {\n opportunityId: string;\n userAddress: string;\n distributorId: string;\n}\nexport interface CancelDepositActionParams {\n opportunityId: string;\n userAddress: string;\n distributorId: string;\n}\nexport type CancelWithdrawActionParams = ActionParams;\n\n// Legacy aliases\nexport type InteractionParams = ActionParams;\nexport type CreateDepositInteractionParams = ActionParams;\nexport type CreateWithdrawInteractionParams = ActionParams;\nexport type CreateClaimWithdrawInteractionParams = ActionParams;\n\nexport type Transaction = z.infer<typeof transactionSchema>;\nexport type TxResponseItem = z.infer<typeof txResponseItemSchema>;\nexport type ActionResponse = z.infer<typeof actionResponseSchema>;\nexport type AttributeActionResponse = z.infer<typeof attributeActionResponseSchema>;\n\nexport type ActionRouteToken = z.infer<typeof routeTokenSchema>;\nexport type ActionRouteStep = z.infer<typeof routeStepSchema>;\nexport type RouteMetadata = z.infer<typeof routeMetadataSchema>;\n\nexport type InteractionResponse = ActionResponse;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n actionResponseSchema,\n attributeActionResponseSchema,\n type ActionResponse,\n type ActionParams,\n type CancelDepositActionParams,\n type ClaimDepositActionParams,\n type WithdrawActionParams,\n type AttributeActionParams,\n type AttributeActionResponse,\n} from \"./schema\";\n\n// Supported action types\ntype ActionType =\n | \"deposit\"\n | \"withdraw\"\n | \"claim-withdraw\"\n | \"claim-deposit\"\n | \"cancel-deposit\"\n | \"cancel-withdraw\";\n\n// Generic action creator - DRY helper\nasync function createAction<T extends { opportunityId: string }>(\n actionType: ActionType,\n params: T\n): Promise<ActionResponse> {\n const { opportunityId, ...body } = params;\n\n const data = await apiClient.fetch(\n `/v1/actions/${actionType}/${opportunityId}`,\n {\n method: \"POST\",\n domain: \"earn\",\n body,\n }\n );\n\n const result = actionResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(\n `Failed to parse ${actionType} action: ${result.error.message}`\n );\n }\n return result.data;\n}\n\n// POST /v1/actions/deposit/{opportunityId}\nexport const createDepositAction = (params: ActionParams) =>\n createAction(\"deposit\", params);\n\n// POST /v1/actions/withdraw/{opportunityId}\nexport const createWithdrawAction = (params: WithdrawActionParams) =>\n createAction(\"withdraw\", params);\n\n// POST /v1/actions/claim-withdraw/{opportunityId}\nexport const createClaimWithdrawAction = (params: ActionParams) =>\n createAction(\"claim-withdraw\", params);\n\n// POST /v1/actions/claim-deposit/{opportunityId}\nexport const createClaimDepositAction = (params: ClaimDepositActionParams) =>\n createAction(\"claim-deposit\", params);\n\n// POST /v1/actions/cancel-deposit/{opportunityId}\nexport const createCancelDepositAction = (params: CancelDepositActionParams) =>\n createAction(\"cancel-deposit\", params);\n\n// POST /v1/actions/cancel-withdraw/{opportunityId}\nexport const createCancelWithdrawAction = (params: ActionParams) =>\n createAction(\"cancel-withdraw\", params);\n\n// POST /v1/actions/attribute/{actionId}\nexport async function attributeAction(\n params: AttributeActionParams\n): Promise<AttributeActionResponse> {\n const { actionId, txHash } = params;\n\n const data = await apiClient.fetch(`/v1/actions/attribute/${actionId}`, {\n method: \"POST\",\n domain: \"earn\",\n body: { txHash },\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const result = attributeActionResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse attribute action: ${result.error.message}`);\n }\n return result.data;\n}\n\n// Legacy aliases for backwards compatibility\nexport const createDepositInteraction = createDepositAction;\nexport const createWithdrawInteraction = createWithdrawAction;\nexport const createClaimWithdrawInteraction = createClaimWithdrawAction;\n","import { useMemo } from \"react\";\nimport { useGetOnChainBalance } from \"../../balance/hooks/useGetOnChainBalance\";\nimport { useBalance } from \"../../balance/hooks/useBalance\";\nimport { filterExcludedTokens } from \"../../balance/utils\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport { Opportunity } from \"../../opportunities\";\nimport { getDepositModeFlags, resolveEffectiveDepositMode } from \"./utils\";\n\nexport interface UseActionsDefaultParamsOptions {\n opportunity: Opportunity | null;\n address: string | undefined;\n depositMode: \"native\" | \"route\";\n}\n\nexport interface UseActionsDefaultParamsReturn {\n balances: TokenBalance[];\n isBalancesLoading: boolean;\n refetchBalances: () => void;\n}\n\nfunction sortByBalance(balances: TokenBalance[]): TokenBalance[] {\n return [...balances].sort((a, b) => {\n const aValue = BigInt(a.amount);\n const bValue = BigInt(b.amount);\n if (bValue > aValue) return 1;\n if (bValue < aValue) return -1;\n return 0;\n });\n}\n\n/**\n * Hook that encapsulates balance fetching logic for deposit actions.\n * Handles on-chain balances for native mode and portfolio balances for route mode.\n */\nexport function useActionsDefaultParams({\n opportunity,\n address,\n depositMode,\n}: UseActionsDefaultParamsOptions): UseActionsDefaultParamsReturn {\n const opportunityChainId = opportunity\n ? Number(opportunity.receiptToken.chain.chainId)\n : undefined;\n\n // Determine effective deposit mode based on swap flags\n const flags = getDepositModeFlags(opportunity);\n const effectiveDepositMode = resolveEffectiveDepositMode(depositMode, flags);\n const useOnChainBalances = effectiveDepositMode === \"native\";\n\n // Fetch deposit token balances (on-chain)\n const {\n balances: depositTokenBalances,\n isLoading: isDepositBalancesLoading,\n refetch: refetchDepositBalances,\n } = useGetOnChainBalance({\n tokens: opportunity?.depositTokens ?? [],\n chainId: opportunityChainId!,\n address,\n enabled: !!address && !!opportunity && opportunityChainId != null,\n });\n\n // Fetch all balances for route/swap mode\n const {\n balances: allChainBalances,\n isLoading: isAllChainBalancesLoading,\n refetchAll: refetchAllBalances,\n } = useBalance({\n address,\n chainIds: opportunityChainId ? [opportunityChainId] : [],\n depositOpportunity: opportunity ?? undefined,\n });\n\n const rawBalances = useMemo(() => {\n if (useOnChainBalances) {\n if (depositTokenBalances.length > 0) {\n return depositTokenBalances;\n }\n // Fallback: create TokenBalance entries from deposit tokens with 0 balance\n if (opportunity?.depositTokens) {\n return opportunity.depositTokens.map((token) => ({\n token,\n amount: \"0\",\n source: \"onchain\" as const,\n }));\n }\n return [];\n }\n return allChainBalances;\n }, [useOnChainBalances, depositTokenBalances, allChainBalances, opportunity?.depositTokens]);\n\n const isBalancesLoading = useOnChainBalances\n ? isDepositBalancesLoading\n : isAllChainBalancesLoading;\n\n const refetchBalances = useOnChainBalances ? refetchDepositBalances : refetchAllBalances;\n\n const balances = useMemo(() => {\n let filtered = rawBalances;\n\n // Filter by opportunity chain (only for route mode)\n if (!useOnChainBalances && opportunityChainId) {\n filtered = filtered.filter((b) => {\n const tokenChainId = Number(b.token.chain?.chainId);\n return tokenChainId === opportunityChainId;\n });\n }\n\n // Filter zero balances (only for route mode)\n if (!useOnChainBalances) {\n filtered = filtered.filter((b) => BigInt(b.amount) > 0n);\n }\n\n // Filter excluded tokens\n filtered = filterExcludedTokens(filtered);\n\n return sortByBalance(filtered);\n }, [rawBalances, useOnChainBalances, opportunityChainId]);\n\n return {\n balances,\n isBalancesLoading,\n refetchBalances,\n };\n}\n","import { useReadContracts, useBalance } from \"wagmi\";\nimport { erc20Abi } from \"viem\";\nimport { useMemo, useCallback } from \"react\";\nimport type { TokenBalance } from \"../types\";\nimport { queryDefaults } from \"../../lib/query-config\";\nimport { Token } from \"../../supported-tokens\";\n\n/**\n * Well-known native token addresses used across chains\n */\nconst NATIVE_TOKEN_ADDRESSES = [\n \"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\n \"0x0000000000000000000000000000000000000000\",\n];\n\nconst QUERY_REFETCH_INTERVAL = 5_000;\n\n/**\n * Determines if a token is a native token (ETH, MATIC, etc.)\n * Uses the token's isNative flag as primary detection,\n * with fallback to well-known native token addresses\n */\nfunction isNativeToken(token: Token): boolean {\n return token.isNative || NATIVE_TOKEN_ADDRESSES.includes(token.address.toLowerCase());\n}\n\nexport interface UseGetOnChainBalanceOptions {\n tokens: Token[];\n chainId: number;\n address?: string;\n enabled?: boolean;\n}\n\nexport interface UseGetOnChainBalanceResult {\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport function useGetOnChainBalance({\n tokens,\n chainId,\n address,\n enabled = true,\n}: UseGetOnChainBalanceOptions): UseGetOnChainBalanceResult {\n // Separate tokens into native and ERC20\n const { nativeTokens, erc20Tokens } = useMemo(() => {\n const native: Token[] = [];\n const erc20: Token[] = [];\n\n for (const token of tokens) {\n if (isNativeToken(token)) {\n native.push(token);\n } else {\n erc20.push(token);\n }\n }\n\n return { nativeTokens: native, erc20Tokens: erc20 };\n }, [tokens]);\n\n // Fetch native token balance using wagmi's useBalance\n // Note: Only one native token per chain, so we take the first one\n const nativeToken = nativeTokens[0];\n const {\n data: nativeBalanceData,\n isLoading: isNativeLoading,\n error: nativeError,\n refetch: refetchNative,\n } = useBalance({\n address: address as `0x${string}`,\n chainId,\n query: {\n ...queryDefaults,\n enabled: enabled && !!address && nativeTokens.length > 0,\n refetchInterval: QUERY_REFETCH_INTERVAL,\n refetchOnWindowFocus: true,\n },\n });\n\n // Build multicall contracts array for ERC20 tokens\n const contracts = useMemo(() => {\n if (!address || !enabled) return [];\n\n return erc20Tokens.map(\n (token) =>\n ({\n address: token.address as `0x${string}`,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [address as `0x${string}`],\n chainId,\n }) as const\n );\n }, [erc20Tokens, address, chainId, enabled]);\n\n // Fetch ERC20 balances with multicall\n const {\n data: erc20Results,\n isLoading: isErc20Loading,\n error: erc20Error,\n refetch: refetchErc20,\n } = useReadContracts({\n contracts,\n query: {\n ...queryDefaults,\n enabled: enabled && !!address && erc20Tokens.length > 0,\n refetchInterval: QUERY_REFETCH_INTERVAL,\n refetchOnWindowFocus: true,\n },\n });\n\n // Combine results into TokenBalance format\n const balances = useMemo(() => {\n const result: TokenBalance[] = [];\n\n // Add native token balance if present\n if (nativeToken && nativeBalanceData) {\n result.push({\n token: nativeToken,\n amount: nativeBalanceData.value.toString(),\n source: \"onchain\" as const,\n });\n }\n\n // Add ERC20 token balances\n if (erc20Results && erc20Results.length > 0) {\n erc20Tokens.forEach((token, index) => {\n const erc20Result = erc20Results[index];\n\n let balance = \"0\";\n if (erc20Result?.status === \"success\" && typeof erc20Result.result === \"bigint\") {\n balance = erc20Result.result.toString();\n }\n\n result.push({\n token,\n amount: balance,\n source: \"onchain\" as const,\n });\n });\n }\n\n return result;\n }, [nativeToken, nativeBalanceData, erc20Results, erc20Tokens]);\n\n // Aggregate loading states\n const isLoading =\n (nativeTokens.length > 0 && isNativeLoading) || (erc20Tokens.length > 0 && isErc20Loading);\n\n // Return first error encountered\n const error = nativeError || erc20Error;\n\n // Unified refetch function\n const refetch = useCallback(() => {\n if (nativeTokens.length > 0) {\n refetchNative();\n }\n if (erc20Tokens.length > 0) {\n refetchErc20();\n }\n }, [nativeTokens.length, erc20Tokens.length, refetchNative, refetchErc20]);\n\n return {\n balances,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n };\n}\n","import { useMemo } from \"react\";\nimport type { UseBalanceParams } from \"../types\";\nimport type { TokenBalance } from \"../types\";\nimport { useGetOnChainBalance } from \"../hooks/useGetOnChainBalance\";\nimport { usePortfolioBalance } from \"./usePortfolioBalance\";\nimport { mergeBalancesByPriority, filterNonZeroBalances, filterExcludedTokens } from \"../utils\";\n\nexport interface UseBalanceResult {\n /** Consolidated token balances from all sources */\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n /** Refetch all balance sources */\n refetchAll: () => void;\n}\n\n/**\n * Consolidated balance hook that fetches from multiple sources with priority merge\n *\n * Priority order:\n * 1. On-chain (if depositOpportunity provided) - most accurate\n * 2. Portfolio API - server-aggregated\n *\n * Features:\n * - Priority-based merge (higher priority sources override lower)\n * - Automatic receipt token filtering\n * - Multi-chain support\n * - Zero balance filtering\n * - Excluded token filtering (internal/wrapped tokens)\n */\nexport function useBalance({\n address,\n chainIds,\n depositOpportunity,\n}: UseBalanceParams): UseBalanceResult {\n // Fetch on-chain balances only if depositOpportunity is provided\n const {\n balances: onChainBalances,\n isLoading: isOnChainLoading,\n error: onChainError,\n refetch: refetchOnChain,\n } = useGetOnChainBalance({\n tokens: depositOpportunity?.depositTokens || [],\n chainId: depositOpportunity?.depositTokens[0]\n ? Number(depositOpportunity.depositTokens[0].chain.chainId)\n : chainIds[0],\n address,\n enabled: !!depositOpportunity && !!address,\n });\n\n // Fetch portfolio balances (always enabled when address exists)\n const {\n balances: portfolioBalances,\n isLoading: isPortfolioLoading,\n error: portfolioError,\n refetch: refetchPortfolio,\n } = usePortfolioBalance({\n address,\n });\n\n // Merge balances by priority and filter receipt token\n const consolidatedBalances = useMemo(() => {\n const sources: TokenBalance[][] = [];\n\n // Add sources in priority order (will be reversed in merge logic)\n if (depositOpportunity && onChainBalances.length > 0) {\n sources.push(onChainBalances); // Priority 1\n }\n if (portfolioBalances.length > 0) {\n sources.push(portfolioBalances); // Priority 2\n }\n\n // Merge with receipt token filtering\n const merged = mergeBalancesByPriority(sources, depositOpportunity?.receiptToken);\n\n // Filter out zero balances\n const nonZero = filterNonZeroBalances(merged);\n\n // Filter out excluded tokens (internal/wrapped tokens)\n return filterExcludedTokens(nonZero);\n }, [onChainBalances, portfolioBalances, depositOpportunity]);\n\n // Aggregate loading states\n const isLoading = isOnChainLoading || isPortfolioLoading;\n\n // Return first error encountered\n const error = onChainError || portfolioError;\n\n // Refetch all sources\n const refetchAll = () => {\n if (depositOpportunity) {\n refetchOnChain();\n }\n refetchPortfolio();\n };\n\n return {\n balances: consolidatedBalances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport { useMemo } from \"react\";\nimport type { TokenBalance } from \"../types\";\nimport { balanceQueries } from \"../queries\";\nimport { queryDefaults } from \"../../lib/query-config\";\nimport { useSupportedChains } from \"../../supported-chains\";\nimport { Token, useSupportedTokens } from \"../../supported-tokens\";\nimport { parseUnits } from \"viem\";\n\nexport interface UsePortfolioBalanceOptions {\n address?: string;\n}\n\nexport interface UsePortfolioBalanceResult {\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Hook to fetch portfolio balances from /wallet/{address}/balance endpoint\n */\nexport function usePortfolioBalance({\n address,\n}: UsePortfolioBalanceOptions): UsePortfolioBalanceResult {\n const { getChainByChainId } = useSupportedChains();\n const { getToken } = useSupportedTokens();\n\n const {\n data: portfolioData,\n isLoading,\n error,\n refetch,\n } = useQuery({\n ...balanceQueries.portfolio(address || \"\"),\n ...queryDefaults,\n enabled: !!address,\n refetchInterval: 1 * 60 * 1000, // 1 minute\n });\n\n const balances = useMemo(() => {\n if (!portfolioData) return [];\n\n const tokenBalances: TokenBalance[] = [];\n\n portfolioData.portfolio.holdings.wallets.forEach((wallet) => {\n wallet.tokens.forEach((portfolioToken) => {\n const chainId = portfolioToken.chain.chainId;\n\n // Try to get full token data from supported tokens first\n const supportedToken = getToken(portfolioToken.address, chainId);\n\n // Build token from portfolio data, enriching with supported token/chain data if available\n const token: Token = supportedToken ?? {\n id: portfolioToken.id,\n symbol: portfolioToken.symbol,\n name: portfolioToken.name,\n address: portfolioToken.address,\n decimals: portfolioToken.decimals,\n logoUrl: portfolioToken.logoUrl ?? undefined,\n chain: getChainByChainId(chainId) ?? {\n id: portfolioToken.chain.id ?? \"0\", // zero as default for an empty value\n chainId: portfolioToken.chain.chainId,\n name: portfolioToken.chain.name ?? \"\",\n slug: portfolioToken.chain.slug,\n status: portfolioToken.chain.status,\n logoUrl: portfolioToken.chain.logoUrl,\n ecosystem: portfolioToken.chain.ecosystem,\n explorerUrl: portfolioToken.chain.explorerUrl,\n },\n isNative: portfolioToken.isNative,\n priceUsd: portfolioToken.price ?? undefined,\n };\n\n // Convert amount from decimal to wei format\n let amountInWei: string;\n try {\n amountInWei = parseUnits(portfolioToken.amount, token.decimals).toString();\n } catch (error) {\n console.error(\"[Portfolio Balance] Failed to parse amount:\", {\n amount: portfolioToken.amount,\n decimals: token.decimals,\n error,\n });\n amountInWei = \"0\";\n }\n\n tokenBalances.push({\n token,\n amount: amountInWei,\n source: \"portfolio\",\n });\n });\n });\n\n return tokenBalances;\n }, [portfolioData, getChainByChainId, getToken]);\n\n return {\n balances,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n };\n}\n","import { Opportunity } from \"../opportunities\";\nimport { Token } from \"../supported-tokens\";\n\n/**\n * Unified token balance type for multi-source balance system\n * Compatible with on-chain, portfolio API, and Enso balance sources\n */\nexport interface TokenBalance {\n token: Token;\n amount: string;\n source: \"onchain\" | \"portfolio\" | \"enso\";\n}\n\n/**\n * Balance source priority for merge strategy\n */\nexport enum BalanceSourcePriority {\n ONCHAIN = 1,\n PORTFOLIO = 2,\n ENSO = 3,\n}\n\nexport interface UseBalanceParams {\n /** User wallet address */\n address?: string;\n /** Chain IDs to fetch balances for */\n chainIds: number[];\n /** Optional deposit opportunity for on-chain fetching */\n depositOpportunity?: Opportunity | null;\n}\n","import type { TokenBalance } from \"./types\";\nimport { BalanceSourcePriority } from \"./types\";\nimport { formatUnits } from \"viem\";\nimport { EXCLUDE_TOKEN_ADDRESS_LIST } from \"./constants\";\nimport { Token } from \"../supported-tokens\";\n\n/**\n * Helper to get priority value for a source\n */\nexport function getSourcePriority(source: TokenBalance[\"source\"]): number {\n switch (source) {\n case \"onchain\":\n return BalanceSourcePriority.ONCHAIN;\n case \"portfolio\":\n return BalanceSourcePriority.PORTFOLIO;\n case \"enso\":\n return BalanceSourcePriority.ENSO;\n }\n}\n\n/**\n * Merge multiple balance sources by priority (lower priority value = higher precedence)\n * Uses outer join strategy to include all unique tokens across sources\n * Filters out receipt token if provided\n */\nexport function mergeBalancesByPriority(\n sources: TokenBalance[][],\n receiptToken?: Token | null\n): TokenBalance[] {\n // Create a map to store the best balance for each token\n // Key: `${chainId}-${address.toLowerCase()}`\n const balanceMap = new Map<string, TokenBalance>();\n\n // Process all sources\n sources.forEach((sourceBalances) => {\n sourceBalances.forEach((balance) => {\n const key = `${balance.token.chain.chainId}-${balance.token.address.toLowerCase()}`;\n\n // Skip receipt token if provided\n if (receiptToken) {\n const receiptKey = `${receiptToken.chain.chainId}-${receiptToken.address.toLowerCase()}`;\n if (key === receiptKey) {\n return;\n }\n }\n\n const existingBalance = balanceMap.get(key);\n\n // If no existing balance or current source has higher priority, update\n if (\n !existingBalance ||\n getSourcePriority(balance.source) < getSourcePriority(existingBalance.source)\n ) {\n balanceMap.set(key, balance);\n }\n });\n });\n\n // Convert map to array and sort by chain, then balance\n return Array.from(balanceMap.values()).sort((a, b) => {\n // First sort by chain\n if (a.token.chain.chainId !== b.token.chain.chainId) {\n return Number(a.token.chain.chainId) - Number(b.token.chain.chainId);\n }\n // Then sort by balance (highest first)\n const balanceA = Number(formatUnits(BigInt(a.amount), a.token.decimals));\n const balanceB = Number(formatUnits(BigInt(b.amount), b.token.decimals));\n return balanceB - balanceA;\n });\n}\n\nexport function filterBalancesByChains(\n balances: TokenBalance[],\n chainIds: number[]\n): TokenBalance[] {\n const chainSet = new Set(chainIds);\n return balances.filter((balance) => chainSet.has(Number(balance.token.chain.chainId)));\n}\n\nexport function filterNonZeroBalances(balances: TokenBalance[]): TokenBalance[] {\n return balances.filter((balance) => {\n const amount = BigInt(balance.amount);\n return amount > 0n;\n });\n}\n\n/**\n * Filter out excluded tokens (internal/wrapped tokens that shouldn't be shown to users)\n */\nexport function filterExcludedTokens(balances: TokenBalance[]): TokenBalance[] {\n const excludedSet = new Set(EXCLUDE_TOKEN_ADDRESS_LIST.map((addr) => addr.toLowerCase()));\n return balances.filter((balance) => {\n const tokenAddress = balance.token.address.toLowerCase();\n return !excludedSet.has(tokenAddress);\n });\n}\n","/**\n * List of token addresses that should be excluded from balance results\n * These are typically internal/wrapped tokens that shouldn't be displayed to users\n */\nexport const EXCLUDE_TOKEN_ADDRESS_LIST = [\n \"0x7b5a0182e400b241b317e781a4e9dedfc1429822\", // kpdUSDC\n \"0x48c03b6ffd0008460f8657db1037c7e09deedfcb\", // kpdUSDT\n \"0x92c82f5f771f6a44cfa09357dd0575b81bf5f728\", // kpdWBTC\n \"0xcc6a16be713f6a714f68b0e1f4914fd3db15fbef\", // kpdWETH\n \"0xf470eb50b4a60c9b069f7fd6032532b8f5cc014d\", // kpdUSDC\n \"0xa5dab32dbe68e6fa784e1e50e4f620a0477d3896\", // kpdUSDT\n \"0xe1ac97e2616ad80f69f705ff007a4bbb3655544a\", // kpdWBTC\n \"0x77570cfecf83bc6bb08e2cd9e8537aea9f97ea2f\", // kpdWETH\n];\n","import { useState, useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useWithdrawAction, useAttributeAction } from \"./hooks\";\nimport { balanceQueries } from \"../balance/queries\";\n\nimport type { TxResponseItem, RouteMetadata } from \"./schema\";\nimport type { TransactionRequest } from \"./useEarnDeposit\";\nimport { Opportunity } from \"../opportunities\";\n\nexport interface UseEarnWithdrawOptions {\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onSuccess?: () => void;\n}\n\nexport interface UseEarnWithdrawReturn {\n withdraw: (amount: bigint, tokenOut?: string, slippageBps?: number) => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n error: Error | null;\n metadata: RouteMetadata | null;\n hasApprove: boolean;\n resetMetadata: () => void;\n}\n\nexport function useEarnWithdraw(options: UseEarnWithdrawOptions): UseEarnWithdrawReturn {\n const {\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess,\n } = options;\n\n const queryClient = useQueryClient();\n const [isConfirming, setIsConfirming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [metadata, setMetadata] = useState<RouteMetadata | null>(null);\n const [hasApprove, setHasApprove] = useState(false);\n\n const withdrawAction = useWithdrawAction();\n const attributeAction = useAttributeAction();\n\n const toTransactionRequest = useCallback((txItem: TxResponseItem): TransactionRequest => {\n return {\n to: txItem.transaction.to,\n data: txItem.transaction.data,\n value: txItem.transaction.value,\n gasLimit: txItem.transaction.gasLimit,\n type: txItem.type,\n };\n }, []);\n\n const executeTransactionsSequentially = useCallback(\n async (transactions: TxResponseItem[]): Promise<string | undefined> => {\n let lastTxHash: string | undefined;\n\n for (const txItem of transactions) {\n const txRequest = toTransactionRequest(txItem);\n // executeTransactionAndWait should wait for receipt before returning\n const txHash = await executeTransactionAndWait(txRequest);\n\n if (!txHash) {\n throw new Error(`Transaction failed: ${txItem.description || \"Unknown transaction\"}`);\n }\n\n lastTxHash = txHash;\n }\n\n return lastTxHash;\n },\n [executeTransactionAndWait, toTransactionRequest]\n );\n\n const attributeTransactionSafely = useCallback(\n async (actionId: string, txHash: string): Promise<void> => {\n try {\n await attributeAction.mutateAsync({ actionId, txHash });\n } catch (attributeError) {\n console.warn(\"[useEarnWithdraw] Attribution failed (non-blocking):\", attributeError);\n }\n },\n [attributeAction]\n );\n\n const withdraw = useCallback(\n async (\n amount: bigint,\n tokenOut?: string,\n slippageBps?: number,\n ): Promise<string | undefined> => {\n setError(null);\n\n if (!opportunity?.id) {\n throw new Error(\"No opportunity selected\");\n }\n\n if (!userAddress) {\n throw new Error(\"No wallet connected\");\n }\n\n if (amount <= 0n) {\n throw new Error(\"Amount must be greater than 0\");\n }\n\n try {\n const actionResponse = await withdrawAction.mutateAsync({\n opportunityId: opportunity.id,\n userAddress,\n amount: amount.toString(),\n distributorId,\n tokenOut,\n slippageBps,\n });\n\n const { actionId, transactions } = actionResponse;\n\n if (!transactions || transactions.length === 0) {\n throw new Error(\"No transactions returned from withdraw action\");\n }\n\n const txWithMetadata = transactions.find((tx) => tx.metadata);\n if (txWithMetadata?.metadata) {\n setMetadata(txWithMetadata.metadata);\n }\n\n const hasApproveTx = transactions.some((tx) => tx.type === \"approve\");\n setHasApprove(hasApproveTx);\n\n setIsConfirming(true);\n const finalTxHash = await executeTransactionsSequentially(transactions);\n\n if (actionId && finalTxHash) {\n await attributeTransactionSafely(actionId, finalTxHash);\n }\n\n if (userAddress) {\n queryClient.invalidateQueries({\n queryKey: balanceQueries.portfolio(userAddress).queryKey,\n });\n }\n onSuccess?.();\n\n return finalTxHash;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsConfirming(false);\n }\n },\n [\n opportunity?.id,\n userAddress,\n distributorId,\n withdrawAction,\n executeTransactionsSequentially,\n attributeTransactionSafely,\n queryClient,\n onSuccess,\n ]\n );\n\n const resetMetadata = useCallback(() => {\n setMetadata(null);\n setHasApprove(false);\n }, []);\n\n return {\n withdraw,\n isPending: withdrawAction.isPending,\n isConfirming,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n };\n}\n","import { useState, useEffect, useMemo, useCallback } from \"react\";\nimport type { TokenBalance } from \"../../balance/types\";\nimport type { Token } from \"../../supported-tokens\";\nimport { useTokenBalance } from \"../../balance/hooks/useTokenBalance\";\n\nexport interface UseWithdrawSelectionOptions {\n /** Receipt token balance (input token for withdrawals) */\n receiptTokenBalance: TokenBalance | null;\n /** Available tokens the user can withdraw into */\n withdrawTokens: Token[];\n /** Opportunity ID - used to reset selection when opportunity changes */\n opportunityId: string | undefined;\n}\n\nexport interface UseWithdrawSelectionReturn {\n /** Current input amount as string */\n amount: string | undefined;\n /** Set the input amount */\n setAmount: (amount: string | undefined) => void;\n /** Currently selected withdraw token address */\n selectedWithdrawTokenAddress: string | undefined;\n /** Set the selected withdraw token address */\n setSelectedWithdrawTokenAddress: (address: string | undefined) => void;\n /** The selected withdraw token data */\n selectedWithdrawToken: Token | null;\n /** Receipt token balance data */\n receiptTokenBalance: TokenBalance | null;\n /** Amount converted to bigint (wei) */\n amountBigInt: bigint | undefined;\n /** USD value of the current amount (formatted string) */\n usdValue: string | undefined;\n /** Whether current amount exceeds balance */\n hasInsufficientBalance: boolean;\n /** Handler for max button click */\n handleMaxClick: () => void;\n /** Reset selection to initial state */\n reset: () => void;\n}\n\n/**\n * Hook to manage receipt token balance and amount input for withdrawals.\n * Handles:\n * - Amount input state with bigint conversion\n * - Withdraw token selection (output token user wants to receive)\n * - USD value calculation\n * - Balance validation\n * - Reset on opportunity change\n */\nexport function useWithdrawSelection({\n receiptTokenBalance,\n withdrawTokens,\n opportunityId,\n}: UseWithdrawSelectionOptions): UseWithdrawSelectionReturn {\n const [amount, setAmount] = useState<string | undefined>();\n const [selectedWithdrawTokenAddress, setSelectedWithdrawTokenAddress] = useState<\n string | undefined\n >();\n\n // Reset selection when opportunity changes\n useEffect(() => {\n setAmount(undefined);\n setSelectedWithdrawTokenAddress(undefined);\n }, [opportunityId]);\n\n // Auto-select first withdraw token when tokens change and current selection is invalid\n useEffect(() => {\n if (withdrawTokens.length === 0) return;\n\n const tokenExists = withdrawTokens.some(\n (t) => t.address === selectedWithdrawTokenAddress\n );\n\n if (!selectedWithdrawTokenAddress || !tokenExists) {\n setSelectedWithdrawTokenAddress(withdrawTokens[0].address);\n }\n }, [selectedWithdrawTokenAddress, withdrawTokens]);\n\n // Find selected withdraw token\n const selectedWithdrawToken = useMemo(\n () => withdrawTokens.find((t) => t.address === selectedWithdrawTokenAddress) ?? null,\n [withdrawTokens, selectedWithdrawTokenAddress]\n );\n\n // Use existing token balance hook for calculations — passing receiptTokenBalance\n const { handleMaxClick, amountBigInt, usdValue, hasInsufficientBalance } = useTokenBalance({\n tokenBalance: receiptTokenBalance,\n amount,\n setAmount,\n });\n\n // Reset function\n const reset = useCallback(() => {\n setAmount(undefined);\n setSelectedWithdrawTokenAddress(undefined);\n }, []);\n\n return {\n amount,\n setAmount,\n selectedWithdrawTokenAddress,\n setSelectedWithdrawTokenAddress,\n selectedWithdrawToken,\n receiptTokenBalance,\n amountBigInt,\n usdValue,\n hasInsufficientBalance,\n handleMaxClick,\n reset,\n };\n}\n","import { useMemo } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport { Opportunity } from \"../../opportunities\";\n\nexport interface UseWithdrawValidationOptions {\n opportunity: Opportunity | null;\n receiptTokenBalance: TokenBalance | null;\n amountBigInt: bigint | undefined;\n hasInsufficientBalance: boolean;\n isPending?: boolean;\n isConfirming?: boolean;\n /** Current wallet chain ID */\n walletChainId?: number;\n}\n\nexport interface WithdrawValidationResult {\n // Main validation state\n canWithdraw: boolean;\n\n // Individual validations\n isWithdrawDisabled: boolean;\n hasInsufficientBalance: boolean;\n isZeroAmount: boolean;\n hasAsyncWithdraw: boolean;\n isSecondaryOnly: boolean;\n\n // Chain validation\n isWrongChain: boolean;\n requiredChainId: number | null;\n\n // Fee information\n withdrawalFee: number | null;\n withdrawalCooldownSecs: number | null;\n withdrawalDisabledReason: string | null;\n\n // Button state\n buttonText: string;\n validationMessage: string | null;\n}\n\n/**\n * Hook for withdraw validation logic.\n * Consolidates all validation checks for withdraw operations.\n */\nexport function useWithdrawValidation({\n opportunity,\n receiptTokenBalance,\n amountBigInt,\n hasInsufficientBalance,\n isPending = false,\n isConfirming = false,\n walletChainId,\n}: UseWithdrawValidationOptions): WithdrawValidationResult {\n return useMemo(() => {\n if (!opportunity) {\n return {\n canWithdraw: false,\n isWithdrawDisabled: false,\n hasInsufficientBalance: false,\n isZeroAmount: true,\n hasAsyncWithdraw: false,\n isSecondaryOnly: false,\n isWrongChain: false,\n requiredChainId: null,\n withdrawalFee: null,\n withdrawalCooldownSecs: null,\n withdrawalDisabledReason: null,\n buttonText: \"Select opportunity\",\n validationMessage: \"Please select an opportunity\",\n };\n }\n\n const vaultConfig = opportunity.vaultConfig;\n\n const isWithdrawDisabled = opportunity.withdrawalDisabled ?? false;\n const withdrawalDisabledReason = opportunity.withdrawalDisabledReason || null;\n\n const withdrawalFee = vaultConfig?.withdrawalFee ?? null;\n const withdrawalCooldownSecs = vaultConfig?.withdrawalCooldownSecs ?? null;\n\n const hasAsyncWithdraw = vaultConfig?.asyncWithdraw === true;\n const isSecondaryOnly = vaultConfig?.secondaryOnly === true;\n\n // Chain validation\n const requiredChainId = Number(opportunity.receiptToken.chain.chainId);\n const isWrongChain = walletChainId !== undefined && walletChainId !== requiredChainId;\n\n const isZeroAmount = !amountBigInt || amountBigInt <= 0n;\n\n // Button text priority\n let buttonText: string;\n let validationMessage: string | null = null;\n\n if (isWrongChain) {\n buttonText = \"Switch chain\";\n } else if (isPending) {\n buttonText = \"Confirming...\";\n } else if (isConfirming) {\n buttonText = \"Processing...\";\n } else if (isWithdrawDisabled) {\n buttonText = withdrawalDisabledReason || \"Withdrawals disabled\";\n validationMessage =\n withdrawalDisabledReason || \"Withdrawals are currently disabled for this opportunity\";\n } else if (isZeroAmount) {\n buttonText = \"Enter amount\";\n } else if (hasInsufficientBalance) {\n buttonText = \"Insufficient balance\";\n validationMessage = \"Your balance is insufficient for this withdrawal amount\";\n } else if (hasAsyncWithdraw) {\n buttonText = \"Request withdraw\";\n } else if (isSecondaryOnly) {\n buttonText = \"Sell\";\n } else {\n buttonText = \"Withdraw\";\n }\n\n const isWithdrawing = isPending || isConfirming;\n const canWithdraw =\n !isWithdrawDisabled &&\n !isZeroAmount &&\n !hasInsufficientBalance &&\n !isWithdrawing;\n\n return {\n canWithdraw,\n isWithdrawDisabled,\n hasInsufficientBalance,\n isZeroAmount,\n hasAsyncWithdraw,\n isSecondaryOnly,\n isWrongChain,\n requiredChainId,\n withdrawalFee,\n withdrawalCooldownSecs,\n withdrawalDisabledReason,\n buttonText,\n validationMessage,\n };\n }, [opportunity, amountBigInt, hasInsufficientBalance, isPending, isConfirming, walletChainId]);\n}\n","import { useCallback } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport type { Token } from \"../../supported-tokens\";\nimport type { TransactionRequest } from \"../../earn-actions/useEarnDeposit\";\nimport { Opportunity } from \"../../opportunities\";\nimport { useEarnWithdraw } from \"../../earn-actions/useEarnWithdraw\";\nimport { useWithdrawSelection, type UseWithdrawSelectionReturn } from \"./useWithdrawSelection\";\nimport { useWithdrawValidation, type WithdrawValidationResult } from \"./useWithdrawValidation\";\n\nexport interface UseWithdrawFlowOptions {\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n receiptTokenBalance: TokenBalance | null;\n withdrawTokens: Token[];\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onWithdrawSuccess?: () => void;\n refetchBalances?: () => void;\n /** Current wallet chain ID for chain validation */\n walletChainId?: number;\n}\n\nexport interface UseWithdrawFlowReturn {\n selection: UseWithdrawSelectionReturn;\n validation: WithdrawValidationResult;\n withdraw: {\n execute: () => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n isWithdrawing: boolean;\n error: Error | null;\n };\n}\n\n/** Orchestrates withdraw token selection, validation, and withdraw execution */\nexport function useWithdrawFlow({\n opportunity,\n userAddress,\n distributorId,\n receiptTokenBalance,\n withdrawTokens,\n executeTransactionAndWait,\n onWithdrawSuccess,\n refetchBalances,\n walletChainId,\n}: UseWithdrawFlowOptions): UseWithdrawFlowReturn {\n const selection = useWithdrawSelection({\n receiptTokenBalance,\n withdrawTokens,\n opportunityId: opportunity?.id,\n });\n\n const earnWithdraw = useEarnWithdraw({\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess: () => {\n selection.setAmount(undefined);\n refetchBalances?.();\n onWithdrawSuccess?.();\n },\n });\n\n const isWithdrawing = earnWithdraw.isPending || earnWithdraw.isConfirming;\n\n const validation = useWithdrawValidation({\n opportunity,\n receiptTokenBalance,\n amountBigInt: selection.amountBigInt,\n hasInsufficientBalance: selection.hasInsufficientBalance,\n isPending: earnWithdraw.isPending,\n isConfirming: earnWithdraw.isConfirming,\n walletChainId,\n });\n\n const execute = useCallback(async () => {\n if (!selection.amountBigInt || !opportunity || !selection.selectedWithdrawTokenAddress) {\n return undefined;\n }\n const tokenOut = withdrawTokens.length > 1\n ? selection.selectedWithdrawTokenAddress\n : undefined;\n return earnWithdraw.withdraw(selection.amountBigInt, tokenOut);\n }, [selection.amountBigInt, selection.selectedWithdrawTokenAddress, earnWithdraw, opportunity, withdrawTokens]);\n\n return {\n selection,\n validation,\n withdraw: {\n execute,\n isPending: earnWithdraw.isPending,\n isConfirming: earnWithdraw.isConfirming,\n isWithdrawing,\n error: earnWithdraw.error,\n },\n };\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { ensoBalancesQueries } from \"./queries\";\nimport type { WalletBalancesResponse } from \"./schemas\";\n\ninterface MultiChainBalancesParams {\n chainIds: number[];\n address?: string;\n}\n\ninterface MultiChainBalancesResult {\n balances: Record<number, WalletBalancesResponse[\"balances\"]>;\n isLoading: boolean;\n error: Error | null;\n refetchAll: () => void;\n}\n\nexport function useMultiChainBalances({\n chainIds,\n address,\n}: MultiChainBalancesParams): MultiChainBalancesResult {\n const queries = useQueries({\n queries: chainIds.map((chainId) => ({\n ...ensoBalancesQueries.byParams({ user: address || \"\", chain: chainId }),\n enabled: !!address,\n staleTime: 60 * 1000,\n refetchInterval: 3 * 60 * 1000,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n })),\n });\n\n const isLoading = queries.some((query) => query.isLoading);\n const error = queries.find((query) => query.error)?.error || null;\n\n const refetchAll = () => {\n queries.forEach((query) => {\n query.refetch();\n });\n };\n\n // Aggregate results\n const balances = useMemo(() => {\n const balanceMap: Record<number, WalletBalancesResponse[\"balances\"]> = {};\n\n queries.forEach((query, index) => {\n const chainId = chainIds[index];\n if (query.data && chainId !== undefined) {\n balanceMap[chainId] = query.data.balances;\n }\n });\n\n return balanceMap;\n }, [queries, chainIds]);\n\n return {\n balances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","import { useMutation, type UseMutationOptions, useQuery } from \"@tanstack/react-query\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type {\n CreateProductInput,\n UpdateProductInput,\n UploadProductLogoRequest,\n UploadProductLogoResponse,\n ProductFilters,\n} from \"./schema\";\nimport { productsQueries } from \"./queries\";\nimport { createProduct, deleteProduct, updateProduct, uploadProductLogo } from \"./api\";\n\nexport interface UseProductsOptions {\n filters?: ProductFilters;\n enabled?: boolean;\n}\n\nexport function useProducts({ filters, enabled = true }: UseProductsOptions) {\n return useQuery({\n ...productsQueries.list(filters),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseProductOptions {\n id: string;\n enabled?: boolean;\n}\n\nexport function useProduct({ id, enabled = true }: UseProductOptions) {\n return useQuery({\n ...productsQueries.byId(id),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport function useCreateProduct(\n options?: Omit<UseMutationOptions<unknown, Error, CreateProductInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: (input) => createProduct(input),\n ...options,\n });\n}\n\nexport function useUpdateProduct(\n options?: Omit<UseMutationOptions<unknown, Error, UpdateProductInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: (input) => updateProduct(input),\n ...options,\n });\n}\n\nexport function useDeleteProduct(\n options?: Omit<UseMutationOptions<unknown, Error, string>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: (id) => deleteProduct(id),\n ...options,\n });\n}\n\nexport function useUploadProductLogo(\n options?: Omit<\n UseMutationOptions<UploadProductLogoResponse, Error, UploadProductLogoRequest>,\n \"mutationFn\"\n >\n) {\n return useMutation({\n mutationFn: (request) => uploadProductLogo(request),\n ...options,\n });\n}\n","import { useMemo } from \"react\";\nimport { useMultiChainBalances } from \"../../enso-balances/hooks\";\nimport type { TokenBalance } from \"../types\";\nimport { useSupportedTokens } from \"../../supported-tokens\";\n\nexport interface UseEnsoBalancesOptions {\n address?: string;\n chainIds: number[];\n}\n\nexport interface UseEnsoBalancesResult {\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Hook to fetch Enso balances (adapter for existing useMultiChainBalances)\n * Priority 3 source - fallback balance source\n * Note: This is an adapter hook that doesn't use query factory directly\n * since it wraps the existing useMultiChainBalances hook\n */\nexport function useEnsoBalances({\n address,\n chainIds,\n}: UseEnsoBalancesOptions): UseEnsoBalancesResult {\n const { getToken, isLoading: isSupportedTokensLoading } = useSupportedTokens();\n\n const {\n balances: ensoBalances,\n isLoading,\n error,\n refetchAll,\n } = useMultiChainBalances({\n chainIds,\n address,\n });\n\n // Transform Enso balances to TokenBalance format\n const balances = useMemo(() => {\n if (isSupportedTokensLoading || isLoading) return [];\n\n const tokenBalances: TokenBalance[] = [];\n Object.entries(ensoBalances).forEach(([, chainBalances]) => {\n chainBalances.forEach((walletBalance) => {\n const chainId = walletBalance.token.chain.toString();\n\n // Try to get full token data from supported tokens\n const token = getToken(walletBalance.token.address, chainId);\n if (!token) return;\n\n tokenBalances.push({\n token,\n amount: walletBalance.amount,\n source: \"enso\",\n });\n });\n });\n\n return tokenBalances;\n }, [ensoBalances, getToken, isSupportedTokensLoading, isLoading]);\n\n return {\n balances,\n isLoading,\n error,\n refetch: refetchAll,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { widgetQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport { WidgetOpportunitiesResponse } from \"./schema\";\n\nexport function useWidgetOpportunities(distributorId: string) {\n return useQuery({\n ...widgetQueries.opportunities(distributorId),\n ...queryDefaults,\n select: (data: WidgetOpportunitiesResponse) => {\n const uniqueChainsMap = new Map(\n data.opportunities\n ?.map((opportunity) => opportunity.receiptToken?.chain)\n ?.filter((chain) => chain !== undefined)\n ?.map((chain) => [chain.id, chain]) || []\n );\n\n const chains = Array.from(uniqueChainsMap.values()) || [];\n const orderedOpportunities =\n data.opportunities?.sort((a, b) => {\n const chainDiff =\n Number(a.receiptToken.chain.chainId) - Number(b.receiptToken.chain.chainId);\n\n if (chainDiff === 0) {\n return b.turtleTvl - a.turtleTvl;\n }\n\n return chainDiff;\n }) || [];\n\n return {\n opportunities: orderedOpportunities,\n chains,\n };\n },\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { UseQueryResult } from \"@tanstack/react-query\";\nimport { geocheckQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GeoCheckResponse } from \"./schema\";\n\nexport interface UseGeocheckOptions {\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n}\n\n/**\n * Hook to check if the user's location allows interaction with the platform\n *\n * @example\n * ```tsx\n * const { data: geocheck, isLoading } = useGeocheck();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!geocheck?.canInteract) return <div>Service not available in your region</div>;\n * ```\n */\nexport function useGeocheck(options: UseGeocheckOptions = {}): UseQueryResult<GeoCheckResponse> {\n const { enabled = true, staleTime, gcTime } = options;\n const { disableGeocheck } = apiClient.getConfig();\n\n return useQuery({\n ...geocheckQueries.check,\n ...queryDefaults,\n enabled: enabled && !disableGeocheck,\n ...(disableGeocheck && { initialData: { canInteract: true } }),\n staleTime: staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: gcTime ?? 10 * 60 * 1000, // 10 minutes\n });\n}\n","import type { EarnRouteParams } from \"../earn-route\";\nimport { useEarnRoute } from \"../earn-route\";\nimport { useMemo } from \"react\";\nimport { processRouteDetails } from \"./route-processor\";\n\nconst NATIVE_TOKEN_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst ENSO_NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// Convert native token address (0x0000...) to Enso format (0xeeee...)\nfunction toEnsoTokenAddress(address: string): string {\n if (address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n return ENSO_NATIVE_TOKEN_ADDRESS;\n }\n return address;\n}\n\n// Simplified options type to inject context data from outside\nexport type UseSwapRouteProps = Omit<\n EarnRouteParams,\n \"user\" | \"id\" | \"distributor_id\" | \"referral_code\"\n>;\n\nexport function useSwapRoute(\n isEnabled: boolean,\n userAddress: string,\n distributorId: string,\n options: UseSwapRouteProps | undefined,\n referralCode?: string\n) {\n const params: EarnRouteParams | undefined = useMemo(() => {\n if (!options || !isEnabled) return undefined;\n\n return {\n ...options,\n user: userAddress,\n distributor_id: distributorId,\n referral_code: referralCode,\n };\n }, [options, userAddress, distributorId, referralCode]);\n\n // Validate required parameters\n const hasRequiredParams = useMemo(() => {\n return !!(\n userAddress &&\n params?.token_in &&\n params?.token_out &&\n params?.amount &&\n params?.chain &&\n params?.slippage &&\n params?.distributor_id\n );\n }, [options]);\n\n // Get the route\n const { data, isLoading, error } = useEarnRoute({\n params: {\n user: params?.user ?? \"\",\n chain: params?.chain ?? 1,\n slippage: params?.slippage ?? 1,\n distributor_id: params?.distributor_id ?? \"\",\n referral_code: params?.referral_code ?? \"\",\n id: params?.id ?? \"\",\n amount: params?.amount ?? \"\",\n token_in: toEnsoTokenAddress(params?.token_in ?? \"\") ?? \"\",\n token_out: toEnsoTokenAddress(options?.token_out ?? \"\") ?? \"\",\n },\n enabled: hasRequiredParams && isEnabled,\n });\n\n // Parse route details\n const routeDetails = useMemo(() => processRouteDetails(data ?? null), [data]);\n\n return {\n fetchedRoute: data ?? null,\n outputAmount: data?.amount_out ?? undefined,\n isReady: hasRequiredParams && data && !isLoading,\n hasRequiredParams,\n routeDetails,\n routeError: error,\n isLoadingRoute: isLoading,\n };\n}\n","import type {\n EarnRouteResponse,\n RouterStep,\n RouterSubstep,\n RouteToken,\n} from \"../earn-route\";\nimport { formatToken } from \"@turtleclub/utils\";\n\nexport interface SimpleToken {\n icon?: React.ReactNode | string;\n symbol: string;\n}\n\nexport interface TokenStep {\n in: SimpleToken;\n out: SimpleToken | null;\n type: \"approve\" | \"swap\" | \"deposit\";\n amount?: string;\n}\n\nconst parseEnsoStep = (\n kind: \"swap\" | \"deposit\",\n fromToken: RouteToken,\n toToken: RouteToken\n): TokenStep => {\n return {\n in: {\n icon: fromToken.logos[0],\n symbol: fromToken.symbol,\n },\n out: {\n icon: toToken.logos[0],\n symbol: toToken.symbol,\n },\n amount: undefined,\n type: kind,\n };\n};\n\nconst parseApproveStep = (token: RouteToken, amount: string): TokenStep => {\n return {\n in: {\n icon: token.logos[0],\n symbol: token.symbol,\n },\n out: null,\n amount: formatToken(amount, { decimals: token.decimals }, true, false, 4),\n type: \"approve\",\n };\n};\n\n/**\n * Process the route steps to extract token flow for RouteDetails component\n */\nexport function processRouteDetails(data: EarnRouteResponse | null): TokenStep[] {\n if (!data) return [];\n\n const tokens: TokenStep[] = [];\n data.steps.forEach((step: RouterStep) => {\n // Approve steps\n if (step.kind === \"approve\" && step.token) {\n const approveStep = parseApproveStep(step.token, step.amount);\n tokens.push(approveStep);\n }\n\n // Enso steps (swaps)\n if (step.kind === \"enso\" && step.substeps) {\n step.substeps.forEach((substep: RouterSubstep) => {\n const fromToken = substep.from[0];\n const toToken = substep.to[0];\n const step: TokenStep = parseEnsoStep(substep.kind, fromToken, toToken);\n tokens.push(step);\n });\n }\n });\n\n return tokens;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetUserByIdInput, GetUserTurtlePortfolioInput } from \"./schemas\";\nimport { usersQueries } from \"./queries\";\n\nexport interface UseUserByIdOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useUserById({ userId, enabled = true }: UseUserByIdOptions) {\n return useQuery({\n ...usersQueries.byId({ userId }),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseUserPortfolioOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useUserPortfolio({ userId, enabled = true }: UseUserPortfolioOptions) {\n const input: GetUserTurtlePortfolioInput = { userId };\n\n return useQuery({\n ...usersQueries.portfolio(input),\n ...queryDefaults,\n enabled,\n });\n}\n","import { skipToken, useQuery } from \"@tanstack/react-query\";\nimport { createQueryOptions } from \"../lib/query-config\";\nimport { nftsQueries } from \"./queries\";\nimport type { UserNft } from \"./schema\";\n\nexport interface UseUserNftsOptions {\n userAddress: string | undefined;\n chain: number;\n tokenAddress?: string;\n refetchInterval?: number | false;\n}\n\nexport function useUserNfts({ userAddress, chain, tokenAddress, refetchInterval }: UseUserNftsOptions) {\n return useQuery(\n userAddress\n ? createQueryOptions(nftsQueries.byUser(userAddress, chain), {\n select: (data: UserNft[]) =>\n tokenAddress\n ? data.filter((nft) => nft.token.toLowerCase() === tokenAddress.toLowerCase())\n : data,\n refetchInterval,\n })\n : { queryKey: [\"nfts\", \"byUser\", \"skip\"], queryFn: skipToken }\n );\n}\n\n","import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { submitCoverRequest } from \"./api\";\nimport { coversQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\n\nexport interface UseSubmitCoverRequestOptions {\n onSuccess?: (message: string) => void;\n onError?: (message: string) => void;\n}\n\nexport function useSubmitCoverRequest(options?: UseSubmitCoverRequestOptions) {\n return useMutation({\n mutationFn: submitCoverRequest,\n onSuccess: () => {\n options?.onSuccess?.(\"Cover request submitted successfully!\");\n },\n onError: (error) => {\n console.error(\"[useSubmitCoverRequest]\", error);\n options?.onError?.(\"Failed to submit Cover Request\");\n },\n });\n}\n\nexport interface UseCheckCoverRequestOptions {\n protocolName: string;\n enabled?: boolean;\n}\n\nexport function useCheckCoverRequest({\n protocolName,\n enabled,\n}: UseCheckCoverRequestOptions) {\n return useQuery({\n ...coversQueries.check(protocolName),\n ...queryDefaults,\n enabled: enabled ?? !!protocolName,\n });\n}\n","import { useEffect, useRef, useCallback } from \"react\";\nimport {\n useCheckMembership,\n useCreateMembershipAgreement,\n useCreateMembership,\n} from \"../earn-membership/hooks\";\nimport type { WalletEcosystem } from \"../earn-membership/schema\";\n\nexport interface UseTurtleMembershipFlowOptions {\n /** The wallet address to check/create membership for */\n address: string | undefined;\n /** The blockchain ecosystem (evm, solana, or ton) */\n walletEcosystem: WalletEcosystem;\n /** Function to sign the membership agreement message */\n signMessage: (message: string) => Promise<string>;\n /** The current chain ID (optional, defaults to \"1\" for Ethereum mainnet) */\n chainId?: string;\n /** The URL to include in the membership agreement (optional, defaults to current page URL) */\n url?: string;\n /** Whether the hook should automatically run the membership flow (default: true) */\n enabled?: boolean;\n /** Callback when membership flow fails or user rejects signing */\n onError?: (error: { type: 'signature_rejected' | 'membership_failed'; message: string }) => void | Promise<void>;\n}\n\nexport interface UseTurtleMembershipFlowReturn {\n /** Whether the user is a member */\n isMember: boolean | undefined;\n /** Whether the membership flow is currently processing */\n isLoading: boolean;\n /** Any error that occurred during the membership flow */\n error: string | null;\n /** Manually trigger the membership flow (useful when enabled is false) */\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to orchestrate the membership flow.\n * When an address is provided, it:\n * 1. Checks if the user is already a member\n * 2. If not, creates a membership agreement (gets message and nonce)\n * 3. Signs the message using the provided signMessage function\n * 4. Creates the membership with the signature\n *\n * @example\n * ```typescript\n * const { isMember, isLoading, error } = useTurtleMembershipFlow({\n * address: userWalletAddress,\n * walletEcosystem: \"evm\",\n * signMessage: async (message) => {\n * return await wallet.signMessage(message);\n * }\n * });\n * ```\n */\nexport const useTurtleMembershipFlow = ({\n address,\n walletEcosystem = \"evm\",\n signMessage,\n chainId = \"1\",\n url,\n enabled = true,\n onError,\n}: UseTurtleMembershipFlowOptions): UseTurtleMembershipFlowReturn => {\n const previousAddressRef = useRef<string | undefined>(undefined);\n const isProcessingRef = useRef(false);\n\n // Always check membership when address exists (regardless of enabled flag)\n // The enabled flag only controls auto-triggering the flow\n const {\n data: membershipData,\n isLoading: isCheckingMembership,\n } = useCheckMembership({\n params: {\n address: address || \"\",\n walletEcosystem,\n },\n enabled: !!address,\n });\n\n const {\n mutateAsync: createAgreement,\n isPending: isCreatingAgreement,\n error: agreementError,\n } = useCreateMembershipAgreement();\n\n const {\n mutateAsync: createMembership,\n isPending: isCreatingMembership,\n error: membershipError,\n } = useCreateMembership();\n\n const handleMembershipFlow = useCallback(async (memberAddress: string) => {\n if (isProcessingRef.current) return;\n isProcessingRef.current = true;\n\n try {\n // Create agreement to get message and nonce\n const agreementResult = await createAgreement({\n address: memberAddress,\n walletEcosystem,\n url: url || (typeof window !== \"undefined\" ? window.location.href : \"\"),\n chainId,\n });\n\n // Sign the message using the provided signMessage function\n let signature: string;\n try {\n signature = await signMessage(agreementResult.message);\n } catch (signError: any) {\n // User rejected the signature request\n const errorMessage = signError?.message || \"User rejected signature\";\n\n if (onError) {\n await onError({\n type: 'signature_rejected',\n message: errorMessage,\n });\n }\n return;\n }\n\n // Create membership with signature\n const membershipResult = await createMembership({\n address: memberAddress,\n walletEcosystem,\n signature,\n nonce: agreementResult.nonce,\n });\n\n if (!membershipResult.isMember && membershipResult.error) {\n const errorMessage = membershipResult.error;\n\n\n if (onError) {\n await onError({\n type: 'membership_failed',\n message: errorMessage,\n });\n }\n }\n } catch (error: any) {\n const errorMessage = error?.message || \"Unknown error during membership flow\";\n\n if (onError) {\n await onError({\n type: 'membership_failed',\n message: errorMessage,\n });\n }\n } finally {\n isProcessingRef.current = false;\n }\n }, [createAgreement, walletEcosystem, url, chainId, signMessage, createMembership, onError]);\n\n // Watch for address changes and initial membership data load\n useEffect(() => {\n if (!enabled) return;\n\n const currentAddress = address;\n\n // Only proceed if address exists\n if (!currentAddress) {\n // Reset when address becomes undefined\n if (previousAddressRef.current !== undefined) {\n previousAddressRef.current = undefined;\n }\n return;\n }\n\n // Wait for initial membership check to complete\n if (isCheckingMembership) {\n return;\n }\n\n // If address changed to a new value\n if (currentAddress !== previousAddressRef.current) {\n previousAddressRef.current = currentAddress;\n\n // Check if already a member from the initial query\n if (membershipData?.isMember) {\n return;\n }\n\n handleMembershipFlow(currentAddress);\n }\n }, [address, enabled, isCheckingMembership, membershipData, handleMembershipFlow]);\n\n const refetch = async () => {\n if (address) {\n await handleMembershipFlow(address);\n }\n };\n\n const isLoading = isCheckingMembership || isCreatingAgreement || isCreatingMembership;\n const error = agreementError?.message || membershipError?.message || null;\n\n return {\n isMember: membershipData?.isMember,\n isLoading,\n error,\n refetch,\n };\n};\n","import {\n useMutation,\n UseMutationOptions,\n useQuery,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type {\n CreateIncentiveInput,\n IncentivesResponse,\n UpdateIncentiveInput,\n IncentiveResponse,\n UploadIncentiveIconRequest,\n UploadIncentiveIconResponse,\n} from \"./schema\";\nimport { incentivesQueries } from \"./queries\";\nimport { createIncentive, deleteIncentive, updateIncentive, uploadIncentiveIcon } from \"./api\";\n\nexport function useIncentives({ enabled = true }: { enabled?: boolean }) {\n return useQuery({\n ...incentivesQueries.all,\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseIncentiveOptions {\n id: string;\n enabled?: boolean;\n}\n\nexport function useIncentive({ id, enabled = true }: UseIncentiveOptions) {\n return useQuery({\n ...incentivesQueries.byId(id),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport function useCreateIncentive(\n options?: Omit<UseMutationOptions<unknown, Error, CreateIncentiveInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: createIncentive,\n ...options,\n });\n}\n\nexport function useUpdateIncentive(\n options?: Omit<UseMutationOptions<unknown, Error, UpdateIncentiveInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: updateIncentive,\n ...options,\n });\n}\n\nexport function useDeleteIncentive(\n options?: Omit<UseMutationOptions<unknown, Error, string>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: deleteIncentive,\n ...options,\n });\n}\n\nexport function useUploadIncentiveIcon(\n options?: Omit<\n UseMutationOptions<UploadIncentiveIconResponse, Error, UploadIncentiveIconRequest>,\n \"mutationFn\"\n >\n) {\n return useMutation({\n mutationFn: uploadIncentiveIcon,\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from '@tanstack/react-query'\nimport type { UpdateDistributorEarnDetailsInput } from './schema'\nimport { updateDistributorEarnDetails } from './api'\n\nexport function useUpdateDistributorEarnDetails(\n options?: Omit<\n UseMutationOptions<unknown, Error, UpdateDistributorEarnDetailsInput>,\n 'mutationFn'\n >\n) {\n return useMutation({\n mutationFn: updateDistributorEarnDetails,\n ...options,\n })\n}\n","import { z } from \"zod\";\n\n// Update Distributor Earn Details Input schema\nexport const updateDistributorEarnDetailsInputSchema = z.object({\n organizationId: z.string().uuid(),\n distributorId: z.string().uuid(),\n earnDetails: z.any(), // JSONB value - using any for now as requested\n});\n\n// Update Distributor Earn Details Response schema\nexport const updateDistributorEarnDetailsResponseSchema = z.object({\n success: z.boolean(),\n});\n\n// Type exports\nexport type UpdateDistributorEarnDetailsInput = z.infer<\n typeof updateDistributorEarnDetailsInputSchema\n>;\nexport type UpdateDistributorEarnDetailsResponse = z.infer<\n typeof updateDistributorEarnDetailsResponseSchema\n>;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n UpdateDistributorEarnDetailsInput,\n UpdateDistributorEarnDetailsResponse,\n updateDistributorEarnDetailsResponseSchema,\n} from \"./schema\";\n\n// PUT /admin/organization/{organizationId}/distributors/{distributorId}/earn-details\nexport async function updateDistributorEarnDetails(\n input: UpdateDistributorEarnDetailsInput\n): Promise<UpdateDistributorEarnDetailsResponse> {\n const { organizationId, distributorId, earnDetails } = input;\n const endpoint = `/organization/${organizationId}/distributors/${distributorId}/earn-details`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"PUT\",\n body: JSON.stringify({ earnDetails }),\n });\n\n // Validate response with Zod\n const result = updateDistributorEarnDetailsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to update distributor earn details: ${result.error.message}`);\n }\n return result.data;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { liquidityProvidersQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetLiquidityProvidersInput } from \"./schema\";\n\nexport interface UseLiquidityProvidersOptions {\n input: GetLiquidityProvidersInput;\n enabled?: boolean;\n}\n\nexport function useLiquidityProviders({ input, enabled = true }: UseLiquidityProvidersOptions) {\n return useQuery({\n ...liquidityProvidersQueries.list(input),\n ...queryDefaults,\n enabled,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { orgLeaderboardQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetOrgLeaderboardParams } from \"./schema\";\n\n// Client cache for org leaderboard (list + user). Data is stream/snapshot based;\n// backend may not cache, so we keep responses fresh for 5 min and in cache for 10 min.\nconst orgLeaderboardCache = {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n} as const;\n\nexport interface UseOrgLeaderboardOptions {\n orgId: string;\n params?: GetOrgLeaderboardParams;\n enabled?: boolean;\n}\n\nexport function useOrgLeaderboard({\n orgId,\n params,\n enabled = true,\n}: UseOrgLeaderboardOptions) {\n const query = useQuery({\n ...orgLeaderboardQueries.list(orgId, params),\n ...queryDefaults,\n ...orgLeaderboardCache,\n enabled: enabled && !!orgId,\n });\n\n return {\n ...query,\n rows: query.data?.rows ?? [],\n total: query.data?.total,\n totalPages: query.data?.totalPages,\n };\n}\n\nexport interface UseOrgUserLeaderboardOptions {\n orgId: string;\n userId: string;\n enabled?: boolean;\n}\n\nexport function useOrgUserLeaderboard({\n orgId,\n userId,\n enabled = true,\n}: UseOrgUserLeaderboardOptions) {\n const query = useQuery({\n ...orgLeaderboardQueries.user(orgId, userId),\n ...queryDefaults,\n ...orgLeaderboardCache,\n enabled: enabled && !!orgId && !!userId,\n });\n\n return {\n ...query,\n userInfo: query.data?.userInfo,\n };\n}\n","\"use client\";\n\nimport { apiClient, type ApiClientConfig } from \"./api-client\";\nimport { ReactNode } from \"react\";\n\nexport interface TurtleHooksProviderProps extends ApiClientConfig {\n children: ReactNode;\n}\n\n/**\n * TurtleProvider - Configures the API client singleton with your settings.\n *\n * @example\n * ```tsx\n * function App() {\n * const { getAccessToken } = useAuth();\n *\n * return (\n * <TurtleProvider\n * apiUrl=\"https://api.turtle.club\"\n * earnUrl=\"https://earn.turtle.club\"\n * getToken={() => getAccessToken()}\n * earnApiKey=\"pk_live_xxxxx\"\n * debug={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </TurtleProvider>\n * );\n * }\n * ```\n */\nexport function TurtleHooksProvider({\n children,\n apiUrl,\n earnUrl,\n getToken,\n earnApiKey,\n debug,\n disableGeocheck,\n}: TurtleHooksProviderProps) {\n apiClient.configure({ apiUrl, earnUrl, getToken, earnApiKey, debug, disableGeocheck });\n\n return <>{children}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["useBalance","import_query_key_factory","import_query_key_factory","import_zod","import_zod","import_zod","import_query_key_factory","import_react_query","chainId","import_zod","import_zod","import_zod","import_zod","import_react_query","import_react_query","import_zod","chainSchema","import_query_key_factory","paginationMetadataSchema","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_query_key_factory","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_react_query","import_query_key_factory","import_zod","import_query_key_factory","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_zod","uuidSchema","getDeposits","getDeposits","import_query_key_factory","import_query_key_factory","import_zod","sortBySchema","sortOrderSchema","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_react_query","import_react_query","import_react_query","import_react_query","import_react","import_react","import_react","import_viem","import_utils","import_react","import_react","import_react_query","import_react_query","import_zod","attributeAction","error","import_react","import_viem","import_react","import_react","import_react_query","import_react","import_viem","error","BalanceSourcePriority","import_viem","useBalance","useBalance","import_react","import_react_query","attributeAction","error","import_react","import_react","import_react","import_react","import_react_query","queries","import_react_query","import_react","import_react_query","import_react_query","import_react","import_utils","approveStep","step","import_react_query","import_react_query","import_react_query","import_react","createMembership","error","import_react_query","import_react_query","import_zod","import_react_query","import_react_query"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/v2/index.ts","../src/v2/opportunities/queries.ts","../src/v2/lib/api-client.ts","../src/v2/opportunities/schema.ts","../src/v2/supported-tokens/schema.ts","../src/v2/supported-chains/schema.ts","../src/v2/schemas/pagination.ts","../src/v2/supported-chains/api.ts","../src/v2/supported-chains/queries.ts","../src/v2/supported-chains/hooks.ts","../src/v2/lib/query-config.ts","../src/v2/supported-tokens/api.ts","../src/v2/supported-tokens/queries.ts","../src/v2/supported-tokens/hooks.ts","../src/v2/incentives/schema.ts","../src/v2/products/schema.ts","../src/v2/schemas/shared.ts","../src/v2/organizations/schema.ts","../src/v2/organizations/api.ts","../src/v2/organizations/hooks.ts","../src/v2/organizations/queries.ts","../src/v2/streams/hooks.ts","../src/v2/streams/schemas.ts","../src/v2/streams/api.ts","../src/v2/streams/mutations.ts","../src/v2/streams/queries.ts","../src/v2/opportunities/api.ts","../src/v2/earn-opportunities/queries.ts","../src/v2/earn-opportunities/schema.ts","../src/v2/earn-opportunities/api.ts","../src/v2/earn-route/queries.ts","../src/v2/earn-route/schema.ts","../src/v2/earn-route/api.ts","../src/v2/earn-membership/queries.ts","../src/v2/earn-membership/schema.ts","../src/v2/earn-membership/api.ts","../src/v2/earn-deposits/queries.ts","../src/v2/earn-deposits/schema.ts","../src/v2/earn-deposits/api.ts","../src/v2/earn-actions/queries.ts","../src/v2/products/queries.ts","../src/v2/products/api.ts","../src/v2/enso-balances/queries.ts","../src/v2/enso-balances/schemas.ts","../src/v2/enso-balances/api.ts","../src/v2/widget/queries.ts","../src/v2/widget/schema.ts","../src/v2/opportunities/hooks.ts","../src/v2/widget/api.ts","../src/v2/users/queries.ts","../src/v2/users/schemas.ts","../src/v2/users/api.ts","../src/v2/nfts/queries.ts","../src/v2/nfts/api.ts","../src/v2/covers/queries.ts","../src/v2/covers/schema.ts","../src/v2/covers/api.ts","../src/v2/balance/queries.ts","../src/v2/balance/schema.ts","../src/v2/balance/api.ts","../src/v2/deposits/queries.ts","../src/v2/deposits/schemas.ts","../src/v2/deposits/api.ts","../src/v2/incentives/queries.ts","../src/v2/incentives/api.ts","../src/v2/liquidity-providers/queries.ts","../src/v2/liquidity-providers/schema.ts","../src/v2/liquidity-providers/api.ts","../src/v2/geocheck/queries.ts","../src/v2/geocheck/schema.ts","../src/v2/geocheck/api.ts","../src/v2/org-leaderboard/queries.ts","../src/v2/org-leaderboard/schema.ts","../src/v2/org-leaderboard/api.ts","../src/v2/earn-opportunities/hooks.ts","../src/v2/earn-route/hooks.ts","../src/v2/earn-membership/hooks.ts","../src/v2/earn-deposits/hooks.ts","../src/v2/earn-deposits/hooks/useDepositValidation.ts","../src/v2/earn-deposits/hooks/utils.ts","../src/v2/earn-deposits/hooks/useDepositSelection.ts","../src/v2/balance/hooks/useTokenBalance.ts","../src/v2/earn-deposits/hooks/useDepositFlow.ts","../src/v2/earn-actions/useEarnDeposit.ts","../src/v2/earn-actions/hooks.ts","../src/v2/earn-actions/schema.ts","../src/v2/earn-actions/api.ts","../src/v2/earn-deposits/hooks/useActionsDefaultParams.ts","../src/v2/balance/hooks/useGetOnChainBalance.ts","../src/v2/balance/hooks/useBalance.ts","../src/v2/balance/hooks/usePortfolioBalance.ts","../src/v2/balance/types.ts","../src/v2/balance/utils.ts","../src/v2/balance/constants.ts","../src/v2/earn-actions/useEarnWithdraw.ts","../src/v2/earn-withdrawals/hooks/useWithdrawSelection.ts","../src/v2/earn-withdrawals/hooks/useWithdrawValidation.ts","../src/v2/earn-withdrawals/hooks/useWithdrawFlow.ts","../src/v2/enso-balances/hooks.ts","../src/v2/products/hooks.ts","../src/v2/balance/hooks/useEnsoBalances.ts","../src/v2/widget/hooks.ts","../src/v2/geocheck/hooks.ts","../src/v2/swap/useSwapRoute.ts","../src/v2/swap/route-processor.ts","../src/v2/users/hooks.ts","../src/v2/nfts/hooks.ts","../src/v2/covers/hooks.ts","../src/v2/membership-flow/hooks.ts","../src/v2/incentives/hooks.ts","../src/v2/distributors/hooks.ts","../src/v2/distributors/schema.ts","../src/v2/distributors/api.ts","../src/v2/liquidity-providers/hooks.ts","../src/v2/org-leaderboard/hooks.ts","../src/v2/lib/turtle-provider.tsx"],"sourcesContent":["// v2 exports\nexport * from \"./v2\";\n","import { mergeQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { opportunitiesQueries } from \"./opportunities/queries\";\nimport { earnOpportunitiesQueries } from \"./earn-opportunities/queries\";\nimport { earnRouteQueries } from \"./earn-route/queries\";\nimport { earnMembershipQueries } from \"./earn-membership/queries\";\nimport { earnDepositsQueries } from \"./earn-deposits/queries\";\nimport { earnActionsQueries } from \"./earn-actions/queries\";\nimport { productsQueries } from \"./products/queries\";\nimport { ensoBalancesQueries } from \"./enso-balances/queries\";\nimport { widgetQueries } from \"./widget/queries\";\nimport { streamsQueries } from \"./streams/queries\";\nimport { supportedChainsQueries } from \"./supported-chains/queries\";\nimport { supportedTokensQueries } from \"./supported-tokens/queries\";\nimport { usersQueries } from \"./users/queries\";\nimport { nftsQueries } from \"./nfts/queries\";\nimport { coversQueries } from \"./covers/queries\";\nimport { balanceQueries } from \"./balance/queries\";\nimport { depositsQueries } from \"./deposits/queries\";\nimport { incentivesQueries } from \"./incentives/queries\";\nimport { liquidityProvidersQueries } from \"./liquidity-providers/queries\";\nimport { geocheckQueries } from \"./geocheck/queries\";\n\n// Org leaderboard\nimport { orgLeaderboardQueries } from \"./org-leaderboard/queries\";\n\n// Merged query keys for cache invalidation\nexport const queries = mergeQueryKeys(\n opportunitiesQueries,\n earnOpportunitiesQueries,\n earnRouteQueries,\n earnMembershipQueries,\n earnDepositsQueries,\n earnActionsQueries,\n productsQueries,\n ensoBalancesQueries,\n widgetQueries,\n streamsQueries,\n supportedChainsQueries,\n supportedTokensQueries,\n usersQueries,\n nftsQueries,\n coversQueries,\n balanceQueries,\n depositsQueries,\n incentivesQueries,\n liquidityProvidersQueries,\n geocheckQueries,\n orgLeaderboardQueries\n);\n\n// Features - Earn API\nexport * from \"./earn-opportunities\";\nexport * from \"./earn-route\";\nexport * from \"./earn-membership\";\nexport * from \"./earn-deposits\";\nexport * from \"./earn-actions\";\nexport * from \"./earn-withdrawals\";\nexport * from \"./enso-balances\";\n\n// Features\nexport * from \"./opportunities\";\nexport * from \"./products\";\nexport * from \"./balance\";\nexport * from \"./widget\";\nexport * from \"./supported-chains\";\nexport * from \"./supported-tokens\";\nexport * from \"./geocheck\";\nexport * from \"./streams\";\nexport * from \"./swap\";\nexport * from \"./users\";\nexport * from \"./nfts\";\nexport * from \"./covers\";\nexport * from \"./membership-flow\";\nexport * from \"./organizations\";\nexport * from \"./incentives\";\nexport * from \"./distributors\";\nexport * from \"./liquidity-providers\";\nexport * from \"./org-leaderboard\";\n// export * from \"./deposits\"; // Resolve conflicts\n\n// Shared schemas\nexport * from \"./schemas/shared\";\n\n// Provider & Client\nexport { TurtleHooksProvider } from \"./lib/turtle-provider\";\nexport type { TurtleHooksProviderProps } from \"./lib/turtle-provider\";\nexport { apiClient, ApiError } from \"./lib/api-client\";\nexport type { ApiClientConfig, ApiClientOptions, ApiDomain } from \"./lib/api-client\";\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport {\n getOpportunities,\n getOpportunityById,\n getOpportunitiesPaginated,\n getOpportunitiesFilterOptions,\n} from \"./api\";\nimport type {\n OpportunityFilters,\n GetOpportunitiesPaginatedInput,\n GetOpportunityByIdInput,\n} from \"./schema\";\n\nexport const opportunitiesQueries = createQueryKeys(\"opportunities\", {\n // Get all opportunities (no filters)\n all: {\n queryKey: null,\n queryFn: () => getOpportunities(),\n },\n\n // Get opportunities with filters\n list: (filters?: OpportunityFilters) => ({\n queryKey: [{ filters }],\n queryFn: () => getOpportunities(filters),\n }),\n\n // Get single opportunity by ID\n byId: (id: string, query?: GetOpportunityByIdInput) => ({\n queryKey: [id],\n queryFn: () => getOpportunityById(id, query),\n }),\n\n // Get paginated opportunities\n paginated: (params?: GetOpportunitiesPaginatedInput) => ({\n queryKey: [{ params }],\n queryFn: () => getOpportunitiesPaginated(params),\n }),\n\n // Get filter options for opportunities\n filterOptions: {\n queryKey: null,\n queryFn: () => getOpportunitiesFilterOptions(),\n },\n});\n","export const API_BASE_URL = \"https://api.turtle.xyz\";\nexport const EARN_BASE_URL = \"https://earn.turtle.xyz\";\n\nexport type ApiDomain = \"api\" | \"earn\";\n\nexport interface ApiClientConfig {\n apiUrl?: string;\n earnUrl?: string;\n getToken?: () => string | null;\n earnApiKey?: string;\n debug?: boolean;\n disableGeocheck?: boolean;\n}\n\nexport interface ApiClientOptions extends Omit<RequestInit, \"body\"> {\n debug?: boolean;\n domain?: ApiDomain;\n body?: unknown;\n}\n\nexport class ApiError extends Error {\n constructor(\n message: string,\n public status: number,\n public response?: unknown\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n\nclass ApiClient {\n private static instance: ApiClient;\n private config: ApiClientConfig = {};\n\n static getInstance(): ApiClient {\n if (!ApiClient.instance) {\n ApiClient.instance = new ApiClient();\n }\n return ApiClient.instance;\n }\n\n configure(config: ApiClientConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n getConfig(): ApiClientConfig {\n return this.config;\n }\n\n private getBaseUrl(domain: ApiDomain): string {\n if (domain === \"earn\") {\n return this.config.earnUrl || EARN_BASE_URL;\n }\n return this.config.apiUrl || API_BASE_URL;\n }\n\n async fetch<T = unknown>(endpoint: string, options?: ApiClientOptions): Promise<T> {\n const { domain = \"api\", debug = this.config.debug, body, ...fetchOptions } = options ?? {};\n\n const baseUrl = this.getBaseUrl(domain);\n const url = `${baseUrl}${endpoint}`;\n const token = this.config.getToken?.();\n\n const isFormData = body instanceof FormData;\n\n const headers: HeadersInit = {\n // Don't set Content-Type for FormData - browser sets it with boundary\n ...(!isFormData && { \"Content-Type\": \"application/json\" }),\n ...fetchOptions.headers,\n };\n\n if (token) {\n (headers as Record<string, string>)[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Add API key for Earn domain requests\n if (domain === \"earn\" && this.config.earnApiKey) {\n (headers as Record<string, string>)[\"X-API-Key\"] = this.config.earnApiKey;\n }\n\n if (debug) {\n console.log(\"[ApiClient Request]\", {\n method: fetchOptions.method ?? \"GET\",\n url,\n headers,\n body: isFormData ? \"[FormData]\" : body,\n });\n }\n\n try {\n const response = await fetch(url, {\n ...fetchOptions,\n headers,\n body: body ? (isFormData ? body : JSON.stringify(body)) : undefined,\n });\n\n const data = await response.json();\n\n if (debug) {\n console.log(\"[ApiClient Response]\", {\n status: response.status,\n ok: response.ok,\n data,\n });\n }\n\n if (!response.ok) {\n throw new ApiError(\n `API error: ${response.status} ${response.statusText}`,\n response.status,\n data\n );\n }\n\n return data as T;\n } catch (error) {\n if (debug) {\n console.error(\"[ApiClient Error]\", error);\n }\n\n if (error instanceof ApiError) {\n throw error;\n }\n\n throw new ApiError(error instanceof Error ? error.message : \"Unknown error\", 0, error);\n }\n }\n}\n\nexport const apiClient = ApiClient.getInstance();\n","import { z } from \"zod\";\nimport { tokenSchema } from \"../supported-tokens\";\nimport { incentiveSchema } from \"../incentives/schema\";\nimport { productSchema } from \"../products/schema\";\nimport { lendingConfigSchema, stakingConfigSchema, vaultConfigSchema } from \"../schemas/shared\";\nimport { streamSchema } from \"../streams\";\n\n// Opportunity Type Enum\nconst opportunityTypeEnum = z.enum([\"vault\", \"lending\", \"staking\", \"stablecoin\", \"draft\", \"\"]);\n\n// Opportunity Status Enum\nconst opportunityStatusEnum = z.enum([\"active\", \"paused\", \"deprecated\", \"draft\", \"ended\"]);\n\n// Main Opportunity Schema - matching backend API exactly\nexport const opportunitySchema = z.object({\n id: z.string().uuid().optional(),\n name: z.string(),\n shortName: z.string(),\n type: opportunityTypeEnum,\n description: z.string().optional().default(\"\"),\n curator: z.string().optional().default(\"\"),\n tvl: z.number().min(0, \"TVL must be positive\"),\n featured: z.boolean().optional().default(false),\n featuredOrder: z.number().int().optional().nullable(),\n originalConfig: z.any().optional().nullable(),\n exposures: z.array(z.string()).optional().default([]),\n tags: z.array(z.any()).optional().default([]),\n status: opportunityStatusEnum.optional().default(\"active\"),\n statusReason: z.string().optional().default(\"\"),\n depositDisabled: z.boolean().optional().default(false),\n depositDisabledReason: z.string().optional().default(\"\"),\n withdrawalDisabled: z.boolean().optional().default(false),\n withdrawalDisabledReason: z.string().optional().default(\"\"),\n docsUrl: z.string().optional().nullable(),\n auditsUrl: z.string().optional().nullable(),\n turtleTvl: z.number(),\n turtleUsers: z.number(),\n earnEnabled: z.boolean(),\n swapDirectEnabled: z.boolean().optional().default(true),\n swapRouteEnabled: z.boolean().optional().default(false),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n mainStreamId: z.string().optional(),\n\n // Relationships\n depositTokens: z.array(tokenSchema),\n withdrawTokens: z.array(tokenSchema).optional().default([]),\n baseTokens: tokenSchema,\n receiptToken: tokenSchema,\n incentives: z.array(incentiveSchema),\n products: z.array(productSchema),\n vaultConfig: vaultConfigSchema.optional().nullable(),\n lendingConfig: lendingConfigSchema.optional().nullable(),\n stakingConfig: stakingConfigSchema.optional().nullable(),\n mainStream: streamSchema.optional().nullable(),\n\n // Will be deprecated\n exposure: z.array(z.string()),\n explorerUrl: z.string().nullable(),\n});\n\nexport const opportunityFiltersSchema = z.object({\n tokenId: z.string().uuid().optional(),\n chain: z.string().optional(),\n productId: z.string().uuid().optional(),\n tags: z.string().optional(),\n withMainStream: z.boolean().optional(),\n});\nexport type OpportunityFilters = z.infer<typeof opportunityFiltersSchema>;\n\nexport const opportunitiesResponseSchema = z.object({\n opportunities: z.array(opportunitySchema),\n total: z.number().optional(),\n});\n\nexport type OpportunitiesResponse = z.infer<typeof opportunitiesResponseSchema>;\n\nexport const getOpportunitiesPaginatedInputSchema = z.object({\n page: z.number().min(1).default(1),\n limit: z.number().min(1).max(100).default(10),\n // Sorting\n sortBy: z\n .enum([\n \"turtleTvl\",\n \"tvl\",\n \"name\",\n \"turtleUsers\",\n \"type\",\n \"organization\",\n \"curator\",\n \"provider\",\n \"apr\",\n ])\n .optional(),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional(),\n // Filter by receipt token chain (comma-separated)\n receiptTokenChainId: z.string().optional(), // Comma-separated UUIDs\n receiptTokenChainSlug: z.string().optional(), // Comma-separated slugs\n // Filter by deposit token\n depositTokenGroup: z.string().optional(),\n depositTokenSymbols: z.string().optional(), // Comma-separated symbols\n depositTokenChainId: z.string().optional(),\n // Filter by tags (comma-separated)\n tags: z.string().optional(),\n // Filter by IDs (comma-separated UUIDs)\n productId: z.string().optional(), // Comma-separated UUIDs\n curatorId: z.string().optional(), // Comma-separated UUIDs\n providerId: z.string().optional(), // Comma-separated UUIDs\n partnerId: z.string().optional(), // Comma-separated UUIDs\n lendingProtocolId: z.string().optional(), // Comma-separated UUIDs\n // Status filters\n withdrawalDisabled: z.boolean().optional(),\n depositDisabled: z.boolean().optional(),\n status: z.string().optional(),\n earnEnabled: z.boolean().optional(),\n featured: z.boolean().optional(),\n // TVL filters\n tvlGreaterThan: z.number().optional(),\n turtleTvlGreaterThan: z.number().optional(),\n tvlMin: z.number().optional(),\n tvlMax: z.number().optional(),\n // APR filters\n minApr: z.number().optional(),\n maxApr: z.number().optional(),\n // Chain IDs (comma-separated)\n chainIds: z.string().optional(),\n // Search\n search: z.string().optional(),\n withMainStream: z.boolean().optional(),\n});\n\nexport type GetOpportunitiesPaginatedInput = z.infer<typeof getOpportunitiesPaginatedInputSchema>;\n\nconst paginationMetadataSchema = z.object({\n page: z.number(),\n limit: z.number(),\n total: z.number(),\n totalPages: z.number(),\n});\n\nexport const getOpportunitiesPaginatedSchema = z.object({\n opportunities: z.array(opportunitySchema),\n pagination: paginationMetadataSchema,\n});\n\nexport type GetOpportunitiesPaginatedResponse = z.infer<typeof getOpportunitiesPaginatedSchema>;\n\nconst filterChainSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n slug: z.string(),\n chainId: z.string(),\n logoUrl: z.string(),\n ecosystem: z.string(),\n status: z.string(),\n explorerUrl: z.string(),\n});\n\nexport const filterOrganizationSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n description: z.string(),\n landingUrl: z.string(),\n iconUrl: z.string(),\n organizationType: z.string(),\n turtleRefCode: z.string(),\n twitterHandle: z.string(),\n status: z.string(),\n featured: z.boolean(),\n});\n\nexport const filterTagSchema = z.object({\n id: z.string().uuid(),\n code: z.string(),\n name: z.string(),\n description: z.string().optional().nullable(),\n color: z.string().optional().nullable(),\n type: z.string().optional().nullable(),\n});\n\nconst depositTokenSymbolSchema = z.object({\n symbol: z.string(),\n logoUrl: z.string(),\n});\n\nexport const getOpportunitiesFilterOptionsSchema = z.object({\n chains: z.array(filterChainSchema),\n providers: z.array(filterOrganizationSchema),\n curators: z.array(filterOrganizationSchema).optional().nullable(),\n partners: z.array(filterOrganizationSchema).optional().nullable(),\n tags: z.array(filterTagSchema).optional().nullable(),\n lendingProtocols: z.array(filterOrganizationSchema),\n depositTokenSymbols: z.array(depositTokenSymbolSchema).optional().nullable(),\n});\n\nexport type GetOpportunitiesFilterOptionsResponse = z.infer<\n typeof getOpportunitiesFilterOptionsSchema\n>;\n\nexport const getOpportunityByIdInputSchema = z.object({\n withMainStream: z.boolean().optional(),\n});\n\nexport type GetOpportunityByIdInput = z.infer<typeof getOpportunityByIdInputSchema>;\n\nexport type Opportunity = z.infer<typeof opportunitySchema>;\n","import { z } from \"zod\";\nimport { chainSchema } from \"../supported-chains\";\n\nconst uuidSchema = z.string().uuid();\n\nexport const tokenSchema = z.object({\n id: uuidSchema,\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().int().nonnegative(),\n isNative: z.boolean(),\n logoUrl: z.string().optional(),\n chain: chainSchema,\n priceUsd: z.number().optional(),\n canonicalAssetId: uuidSchema.optional(),\n streamsMinAmount: z.string().nullable().optional(),\n totalTurtleTvl: z.number().optional(),\n price: z.string().optional(),\n amount: z.string().optional(),\n rawAmount: z.string().optional(),\n});\n\n// Supported token schema - extends base token with active field\nexport const supportedTokenSchema = tokenSchema.extend({\n active: z.boolean(),\n});\n\n// Supported tokens response schema\nexport const supportedTokensResponseSchema = z.object({\n tokens: z.array(supportedTokenSchema),\n total: z.number().optional(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n});\n\n// Supported token filters\nexport interface SupportedTokenFilters {\n chainId?: string;\n offset?: number;\n limit?: number;\n search?: string;\n ids?: string[];\n withStreamsMinAmount?: boolean;\n}\n\n// Types\nexport type Token = z.infer<typeof tokenSchema>;\nexport type SupportedToken = z.infer<typeof supportedTokenSchema>;\nexport type SupportedTokensResponse = z.infer<typeof supportedTokensResponseSchema>;\n","import { z } from \"zod\";\nimport { paginationMetadataSchema } from \"../schemas/pagination\";\n\nexport const supportedChainEcosystemSchema = z.enum([\"evm\", \"solana\"]);\nexport const supportedChainStatusSchema = z.enum([\"active\", \"inactive\"]);\n\nexport const chainSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n slug: z.string().optional(),\n chainId: z.string(),\n isTestnet: z.boolean().optional(),\n logoUrl: z.string().optional(),\n ecosystem: supportedChainEcosystemSchema.optional(),\n status: supportedChainStatusSchema.optional(),\n explorerUrl: z.string().optional(),\n});\n\n// Input schema for GET /turtle/chains\nexport const getSupportedChainsInputSchema = z.object({\n page: z.number().min(1).default(1).optional(),\n limit: z.number().min(1).max(100).default(50).optional(),\n // Sorting\n sortBy: z.enum([\"name\", \"chainId\", \"ecosystem\", \"slug\"]).optional(),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional(),\n // Filters\n ecosystem: z.string().optional(), // Filter by ecosystem\n status: z.string().optional(), // Filter by status\n chainId: z.string().optional(), // Filter by specific chainId\n slug: z.string().optional(), // Filter by slug\n search: z.string().optional(), // Search by name or slug\n});\n\nexport type GetSupportedChainsInput = z.infer<typeof getSupportedChainsInputSchema>;\n\n// Supported chains response schema with pagination\nexport const supportedChainsResponseSchema = z.object({\n chains: z.array(chainSchema),\n pagination: paginationMetadataSchema.optional(),\n});\n\n// Types\nexport type Chain = z.infer<typeof chainSchema>;\nexport type SupportedChainsResponse = z.infer<typeof supportedChainsResponseSchema>;\n","import { z } from \"zod\";\n\n// Pagination metadata schema used across hooks. Kept in a separate module to\n// avoid circular dependencies between shared schemas and feature schemas.\nexport const paginationMetadataSchema = z.object({\n page: z.number().int().min(1).catch(1),\n limit: z.number().int().min(1).max(100),\n total: z.number().int().min(0),\n total_pages: z.number().int().min(1).optional(),\n has_next: z.boolean().optional(),\n has_previous: z.boolean().optional(),\n});\n\nexport type PaginationMetadata = z.infer<typeof paginationMetadataSchema>;\n\n","import { apiClient } from \"../lib/api-client\";\nimport type { GetSupportedChainsInput, SupportedChainsResponse } from \"./schema\";\nimport { supportedChainsResponseSchema } from \"./schema\";\n\n// GET /turtle/chains\nexport async function getSupportedChains(\n params?: GetSupportedChainsInput,\n options?: { debug?: boolean }\n): Promise<SupportedChainsResponse> {\n const queryParams = new URLSearchParams();\n\n if (params) {\n // Pagination\n if (params.page !== undefined) queryParams.append(\"page\", params.page.toString());\n if (params.limit !== undefined) queryParams.append(\"limit\", params.limit.toString());\n\n // Sorting\n if (params.sortBy) queryParams.append(\"sortBy\", params.sortBy);\n if (params.sortOrder) queryParams.append(\"sortOrder\", params.sortOrder);\n\n // Filters\n if (params.ecosystem) queryParams.append(\"ecosystem\", params.ecosystem);\n if (params.status) queryParams.append(\"status\", params.status);\n if (params.chainId) queryParams.append(\"chainId\", params.chainId);\n if (params.slug) queryParams.append(\"slug\", params.slug);\n if (params.search) queryParams.append(\"search\", params.search);\n }\n\n const queryString = queryParams.toString();\n const endpoint = `/turtle/chains${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = supportedChainsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse supported chains: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getSupportedChains } from \"./api\";\nimport type { GetSupportedChainsInput } from \"./schema\";\n\nexport const supportedChainsQueries = createQueryKeys(\"supportedChains\", {\n all: (params?: GetSupportedChainsInput, options?: { debug?: boolean }) => ({\n queryKey: [params],\n queryFn: () => getSupportedChains(params, options),\n }),\n});\n","import { useQuery } from \"@tanstack/react-query\";\nimport { supportedChainsQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { PaginationMetadata } from \"../schemas/pagination\";\nimport type { Chain, GetSupportedChainsInput } from \"./schema\";\n\nexport interface UseSupportedChainsOptions extends GetSupportedChainsInput {\n /** Enable debug logging */\n debug?: boolean;\n /** Enable the query (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseSupportedChainsResult {\n /** List of supported chains */\n chains: Chain[];\n /** Pagination metadata */\n pagination?: PaginationMetadata;\n /** Get chain by chainId */\n getChainByChainId: (chainId: string) => Chain | undefined;\n /** Get chain by slug */\n getChainBySlug: (slug: string) => Chain | undefined;\n /** Get chains by ecosystem */\n getChainsByEcosystem: (ecosystem: string) => Chain[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n /** Is fetching (including background refetches) */\n isFetching: boolean;\n}\n\n/**\n * Hook to fetch all supported chains with helper methods\n *\n * @param options - Query options including pagination, sorting, and filtering\n * @returns Chains data with helper methods and query state\n *\n * @example\n * ```typescript\n * // Fetch all chains\n * const { chains, isLoading } = useSupportedChains();\n *\n * // Fetch chains with pagination\n * const { chains, pagination } = useSupportedChains({ page: 1, limit: 20 });\n *\n * // Filter by ecosystem\n * const { chains } = useSupportedChains({ ecosystem: \"evm\" });\n *\n * // Search and sort\n * const { chains } = useSupportedChains({\n * search: \"polygon\",\n * sortBy: \"name\",\n * sortOrder: \"asc\"\n * });\n * ```\n */\nexport function useSupportedChains(options?: UseSupportedChainsOptions): UseSupportedChainsResult {\n const { debug, enabled = true, ...params } = options || {};\n\n const { data, isLoading, error, refetch, isFetching } = useQuery({\n ...supportedChainsQueries.all(params, { debug }),\n ...queryDefaults,\n enabled,\n });\n\n const chains = data?.chains ?? [];\n const pagination = data?.pagination;\n\n return {\n chains,\n pagination,\n getChainByChainId: (chainId: string) => chains.find((chain) => chain.chainId === chainId),\n getChainBySlug: (slug: string) => chains.find((chain) => chain.slug === slug),\n getChainsByEcosystem: (ecosystem: string) =>\n chains.filter((chain) => chain.ecosystem === ecosystem),\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n isFetching,\n };\n}\n","import { QueryFunction, UseQueryOptions } from \"@tanstack/react-query\";\n\n// Default TanStack Query configuration\n// Override per-query as needed\nexport const queryDefaults = {\n staleTime: 5 * 60 * 1000, // 5 minutes - data is fresh\n gcTime: 10 * 60 * 1000, // 10 minutes - cache garbage collection (formerly cacheTime)\n retry: 1, // Retry failed requests once\n refetchOnWindowFocus: false, // Don't refetch on tab focus\n} as const;\n\nexport function createQueryOptions<TData, TError = Error>(\n queryConfig: { queryKey: readonly unknown[]; queryFn: QueryFunction<TData, any> },\n options?: Omit<UseQueryOptions<TData, TError>, \"queryKey\" | \"queryFn\">\n) {\n return {\n ...queryDefaults,\n ...queryConfig,\n ...options,\n } as UseQueryOptions<TData, TError, TData, any>;\n}\n","import { apiClient } from \"../lib/api-client\";\nimport type { SupportedTokenFilters, SupportedTokensResponse } from \"./schema\";\nimport { supportedTokensResponseSchema } from \"./schema\";\n\n// GET /turtle/tokens\nexport async function getSupportedTokens(\n filters?: SupportedTokenFilters,\n options?: { debug?: boolean }\n): Promise<SupportedTokensResponse> {\n const params = new URLSearchParams();\n\n if (filters?.offset !== undefined) params.append(\"offset\", filters.offset.toString());\n if (filters?.limit !== undefined) params.append(\"limit\", filters.limit.toString());\n if (filters?.search) params.append(\"search\", filters.search);\n if (filters?.chainId) params.append(\"chainId\", filters.chainId);\n if (filters?.withStreamsMinAmount) {\n params.append(\"withStreamsMinAmount\", String(filters.withStreamsMinAmount));\n }\n if (filters?.ids?.length) {\n filters.ids.forEach((id) => params.append(\"ids\", id));\n }\n\n const queryString = params.toString();\n const endpoint = `/turtle/tokens${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = supportedTokensResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse supported tokens: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getSupportedTokens } from \"./api\";\nimport type { SupportedTokenFilters } from \"./schema\";\n\nexport const supportedTokensQueries = createQueryKeys(\"supportedTokens\", {\n list: (filters?: SupportedTokenFilters) => ({\n queryKey: [filters],\n queryFn: () => getSupportedTokens(filters),\n }),\n});\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { supportedTokensQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { SupportedToken, SupportedTokenFilters } from \"./schema\";\n\nexport interface UseSupportedTokensOptions extends SupportedTokenFilters {\n enabled?: boolean;\n}\n\nexport interface UseSupportedTokensResult {\n tokens: SupportedToken[];\n total: number;\n limit: number;\n offset: number;\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n getTokenById: (id: string) => SupportedToken | undefined;\n getToken: (address: string, chainId: string) => SupportedToken | undefined;\n}\n\n/**\n * Hook to fetch supported tokens with pagination and search\n */\nexport function useSupportedTokens({\n offset = 0,\n limit = 20,\n search,\n chainId,\n withStreamsMinAmount,\n enabled = true,\n ids = [],\n}: UseSupportedTokensOptions = {}): UseSupportedTokensResult {\n const { data, isLoading, error, refetch } = useQuery({\n ...supportedTokensQueries.list({ offset, limit, search, chainId, withStreamsMinAmount, ids }),\n ...queryDefaults,\n staleTime: 5 * 60 * 1000, // 1 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n refetchOnWindowFocus: false, // Don't refetch on tab focus\n enabled,\n });\n\n const tokens: SupportedToken[] = useMemo(() => {\n if (!data?.tokens) return [];\n return data.tokens;\n }, [data?.tokens]);\n\n return {\n tokens,\n total: data?.total ?? 0,\n limit: data?.limit ?? limit,\n offset: data?.offset ?? offset,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n getTokenById: (id: string) => tokens.find((token) => token.id === id),\n getToken: (address: string, chainId: string) =>\n tokens.find(\n (token) =>\n token.address.toLowerCase() === address.toLowerCase() && token.chain.chainId === chainId\n ),\n };\n}\n","import { z } from \"zod\";\n\n// Incentive schema\nexport const incentiveSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n description: z.string(),\n iconUrl: z.string(),\n rewardType: z.string(),\n rewardTypeName: z.string(),\n boostPct: z.number().nullable(),\n totalCapacity: z.number().nullable(),\n maxCapacityPerLP: z.number().nullable(),\n lockup: z.string().nullable(),\n minCommitment: z.number().nullable(),\n baseYieldTarget: z.number().nullable(),\n baseYieldSource: z.string().nullable(),\n incentiveYieldTarget: z.number().nullable(),\n fdvEstimate: z.number().nullable(),\n isIncentiveYieldGuaranteed: z.boolean().nullable(),\n tokenSupplyAllocation: z.number().nullable(),\n yield: z.number().nullable(),\n indexed: z.boolean().nullable(),\n minApr: z.number().nullable().optional(),\n maxApr: z.number().nullable().optional(),\n});\n\n// Create Incentive Input schema\nexport const createIncentiveInputSchema = incentiveSchema.omit({\n id: true,\n});\n\n// Update Incentive Input schema\nexport const updateIncentiveInputSchema = incentiveSchema.partial().extend({\n id: z.string().uuid(),\n});\n\n// Incentives Response schema\nexport const incentivesResponseSchema = z.object({\n incentives: z.array(incentiveSchema),\n total: z.number().optional(),\n});\n\n// Upload Icon Request schema\nexport const uploadIncentiveIconRequestSchema = z.object({\n file: z.object({\n name: z.string(),\n size: z.number().positive(),\n type: z.string().refine((type) => type.startsWith(\"image/\"), {\n message: \"File must be an image type\",\n }),\n lastModified: z.number().optional(),\n }),\n filename: z.string().optional(),\n overwrite: z.boolean().optional(),\n});\n\n// Upload Icon Response schema\nexport const uploadIncentiveIconResponseSchema = z.object({\n publicUrl: z.string().url(),\n});\n\n// Type exports\nexport type Incentive = z.infer<typeof incentiveSchema>;\nexport type CreateIncentiveInput = z.infer<typeof createIncentiveInputSchema>;\nexport type UpdateIncentiveInput = z.infer<typeof updateIncentiveInputSchema>;\nexport type IncentivesResponse = z.infer<typeof incentivesResponseSchema>;\nexport type IncentiveResponse = z.infer<typeof incentiveSchema>;\nexport type UploadIncentiveIconRequest = z.infer<typeof uploadIncentiveIconRequestSchema>;\nexport type UploadIncentiveIconResponse = z.infer<typeof uploadIncentiveIconResponseSchema>;\n","import { z } from \"zod\";\n\n// Enum schemas\nconst productTypeSchema = z.enum([\"deal\", \"campaign\"]);\n\nconst productStatusSchema = z.enum([\"draft\", \"active\", \"paused\", \"ended\"]);\n\n// TurtleOrganization schema\nconst turtleOrganizationSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n iconUrl: z.string(),\n landingUrl: z.string(),\n});\n\n// Product schema\nexport const productSchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n title: z.string(),\n subtitle: z.string(),\n description: z.string(),\n logoUrl: z.string(),\n productUrl: z.string(),\n startedAt: z.string().optional().nullable(),\n endedAt: z.string().optional().nullable(),\n status: productStatusSchema,\n productType: productTypeSchema,\n organization: turtleOrganizationSchema.nullable(),\n opportunities: z.lazy(() => z.array(z.any())).nullish(),\n createdAt: z.string(),\n});\n\n// Create Product Request schema\nexport const createProductInputSchema = z.object({\n product: productSchema.omit({\n id: true,\n createdAt: true,\n organization: true,\n }),\n organizationId: z.string().uuid(),\n});\n// Update Product Request schema\nexport const updateProductInputSchema = z.object({\n product: productSchema.partial().omit({\n organization: true,\n }),\n // organizationId: z.string().uuid(),\n});\n\nexport const productsResponseSchema = z.object({\n products: z.array(productSchema),\n total: z.number().optional(),\n});\n\nexport const productResponseSchema = z.object({\n product: productSchema,\n stats: z\n .object({\n totalUsers: z.number(),\n activeUsers: z.number(),\n })\n .optional(),\n});\n\nexport const createProductResponseSchema = z.object({\n id: z.string().uuid(),\n});\n\nexport const updateProductResponseSchema = z.object({\n success: z.boolean(),\n});\n\n// File validation schema for multipart file upload\nconst fileSchema = z.any().refine((value) => {\n if (!value) return false;\n if (!(value instanceof File)) return false;\n if (value.size > 10 * 1024 * 1024) return false;\n return true;\n}, \"Invalid file\");\n\n// Request schema for UploadProductLogoHandler\nexport const uploadProductLogoRequestSchema = z.object({\n // Form data - file upload (required)\n file: fileSchema,\n\n // Form data - optional filename override\n filename: z.string().optional(),\n});\n\n// Response schema for UploadProductLogoHandler\nexport const uploadProductLogoResponseSchema = z.object({\n url: z.string().url(),\n error: z.string().optional(),\n});\n\nexport const productFiltersSchema = z.object({\n organizationId: z.string().uuid().optional(),\n});\nexport type ProductFilters = z.infer<typeof productFiltersSchema>;\n\n// Type exports\nexport type ProductsResponse = z.infer<typeof productsResponseSchema>;\nexport type ProductResponse = z.infer<typeof productResponseSchema>;\nexport type UpdateProductResponse = z.infer<typeof updateProductResponseSchema>;\nexport type CreateProductResponse = z.infer<typeof createProductResponseSchema>;\nexport type CreateProductInput = z.infer<typeof createProductInputSchema>;\nexport type UpdateProductInput = z.infer<typeof updateProductInputSchema>;\nexport type Product = z.infer<typeof productSchema>;\nexport type ProductType = z.infer<typeof productTypeSchema>;\nexport type ProductStatus = z.infer<typeof productStatusSchema>;\nexport type TurtleOrganization = z.infer<typeof turtleOrganizationSchema>;\nexport type UploadProductLogoRequest = z.infer<typeof uploadProductLogoRequestSchema>;\nexport type UploadProductLogoResponse = z.infer<typeof uploadProductLogoResponseSchema>;\n","import { z } from \"zod\";\nimport { organizationSchema } from \"../organizations\";\nimport { chainSchema } from \"../supported-chains\";\nimport type { PaginationMetadata } from \"./pagination\";\n\n// Vault Configuration Schema - matching backend\nexport const vaultConfigSchema = z.object({\n id: z.string().uuid().optional(),\n infraProvider: organizationSchema.optional().nullable(),\n curator: organizationSchema.optional().nullable(),\n withdrawalCooldownSecs: z.number().int().min(0).optional().nullable(),\n withdrawalContractAddress: z.string().optional().nullable(),\n withdrawalDetails: z.any().optional().nullable(),\n depositUrl: z.string().optional().nullable(),\n providerMetadata: z.any().optional().nullable(),\n performanceFee: z.number().min(0).max(100).optional().nullable(),\n managementFee: z.number().min(0).max(100).optional().nullable(),\n depositFee: z.number().min(0).max(100).optional().nullable(),\n withdrawalFee: z.number().min(0).max(100).optional().nullable(),\n minDepositAmount: z.number().optional().nullable(),\n minDepositValueUSD: z.number().optional().nullable(),\n depositCapAmount: z.number().optional().nullable(),\n depositCapValueUSD: z.number().optional().nullable(),\n depositFillSecs: z.number().int().optional().nullable(),\n lockupPeriodSecs: z.number().int().optional().nullable(),\n asyncDeposit: z.boolean().optional().nullable(),\n asyncWithdraw: z.boolean().optional().nullable(),\n secondaryOnly: z.boolean().optional().nullable(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\n\n// Lending Configuration Schema - matching backend\nexport const lendingConfigSchema = z.object({\n id: z.string().uuid(),\n protocol: organizationSchema.optional(),\n curator: organizationSchema.optional(),\n marketAddress: z.string().optional(),\n depositUrl: z.string().optional().nullable(),\n providerMetadata: z.any().optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\n// Staking Configuration Schema - matching backend\nexport const stakingConfigSchema = z.object({\n id: z.string().uuid(),\n protocol: organizationSchema.optional(),\n chainId: z.string().uuid().optional(),\n chain: chainSchema.optional(),\n stakingContractAddress: z.string().optional(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\nexport type VaultConfig = z.infer<typeof vaultConfigSchema>;\nexport type LendingConfig = z.infer<typeof lendingConfigSchema>;\nexport type { PaginationMetadata };\n","import { z } from \"zod\";\n\nexport const organizationSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().optional().nullable(),\n landingUrl: z.string().optional().nullable(),\n iconUrl: z.string().optional().nullable(),\n organizationType: z.string().optional().nullable(),\n organizationPermissions: z\n .array(\n z.object({\n id: z.string().uuid(),\n permissionId: z.string().uuid(),\n status: z.enum([\"pending\", \"approved\", \"rejected\", \"revoked\"]),\n permissionName: z.string(),\n })\n )\n .optional(),\n turtleRefCode: z.string().optional().nullable(),\n twitterHandle: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n featured: z.boolean().optional().nullable(),\n});\n\n// Request Schema (Path Parameter)\nexport const LeaveOrganizationInputSchema = z.object({\n organizationId: z.string().uuid(),\n});\n\nexport type LeaveOrganizationInput = z.infer<typeof LeaveOrganizationInputSchema>;\n\n// Response Schema\nexport const LeaveOrganizationOutputSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n});\n\nexport type LeaveOrganizationOutput = z.infer<typeof LeaveOrganizationOutputSchema>;\n\nexport type Organization = z.infer<typeof organizationSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n LeaveOrganizationInput,\n LeaveOrganizationOutput,\n LeaveOrganizationOutputSchema,\n} from \"./schema\";\n\n// POST /organization/{organizationId}/leave\nexport async function leaveOrganization(\n input: LeaveOrganizationInput\n): Promise<LeaveOrganizationOutput> {\n const endpoint = `/organization/${input.organizationId}/leave`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n });\n\n // Validate response with Zod\n const result = LeaveOrganizationOutputSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse leave organization response: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { UseMutationOptions } from \"@tanstack/react-query\";\nimport { leaveOrganization } from \"./api\";\nimport type { LeaveOrganizationInput, LeaveOrganizationOutput } from \"./schema\";\n\nexport interface UseLeaveOrganizationOptions extends Omit<\n UseMutationOptions<LeaveOrganizationOutput, Error, LeaveOrganizationInput>,\n \"mutationFn\"\n> {}\n\n/**\n * Hook for leaving an organization\n *\n * @example\n * ```tsx\n * function LeaveOrganizationButton({ organizationId }: { organizationId: string }) {\n * const leaveOrganization = useLeaveOrganization({\n * onSuccess: (data) => {\n * console.log(\"Successfully left organization\", data);\n * // Navigate away or show success message\n * },\n * onError: (error) => {\n * console.error(\"Failed to leave organization\", error);\n * }\n * });\n *\n * return (\n * <button\n * onClick={() => leaveOrganization.mutate({ organizationId })}\n * disabled={leaveOrganization.isPending}\n * >\n * {leaveOrganization.isPending ? \"Leaving...\" : \"Leave Organization\"}\n * </button>\n * );\n * }\n * ```\n */\nexport function useLeaveOrganization(options?: UseLeaveOrganizationOptions) {\n return useMutation({\n mutationFn: leaveOrganization,\n ...options,\n });\n}\n","import { leaveOrganization } from \"./api\";\nimport type { LeaveOrganizationInput } from \"./schema\";\n\nexport const organizationsMutations = {\n leave: (input: LeaveOrganizationInput) => leaveOrganization(input),\n};\n","import { useMutation, useQuery, UseMutationOptions, UseQueryOptions } from \"@tanstack/react-query\";\nimport { createQueryOptions } from \"../lib/query-config\";\nimport { streamsMutations } from \"./mutations\";\nimport { streamsQueries } from \"./queries\";\nimport {\n DeleteStreamOutput,\n DeleteStreamInput,\n GetStreamsQuery,\n Stream,\n UpdateStreamInput,\n UpdateStreamOutput,\n StreamsSupportedChainsResponse,\n StreamWallet,\n StreamWalletDetails,\n GetStreamsWalletsQuery,\n PaginationSchema,\n GetStreamPointsQuery,\n StreamPoint,\n} from \"./schemas\";\n\n// --- Types for Options ---\n\nexport type UseStreamsOptions = Omit<UseQueryOptions<Stream[], Error>, \"queryKey\" | \"queryFn\">;\n\nexport type UseStreamPointsOptions = Omit<\n UseQueryOptions<StreamPoint[], Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseStreamWalletsOptions = Omit<\n UseQueryOptions<{ data: StreamWallet[]; pagination: PaginationSchema }, Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseStreamWalletDetailsOptions = Omit<\n UseQueryOptions<StreamWalletDetails, Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseStreamSupportedChainsOptions = Omit<\n UseQueryOptions<StreamsSupportedChainsResponse[\"chains\"], Error>,\n \"queryKey\" | \"queryFn\"\n>;\n\nexport type UseUpdateStreamOptions = Omit<\n UseMutationOptions<UpdateStreamOutput, Error, UpdateStreamInput>,\n \"mutationFn\"\n>;\n\nexport type UseDeleteStreamOptions = Omit<\n UseMutationOptions<DeleteStreamOutput, Error, DeleteStreamInput>,\n \"mutationFn\"\n>;\n\n// --- Hooks ---\n\nexport function useStreams({\n query,\n options,\n}: {\n query?: GetStreamsQuery;\n options?: UseStreamsOptions;\n} = {}) {\n return useQuery(createQueryOptions(streamsQueries.list(query), options));\n}\n\nexport function useStreamPoints({\n query,\n options,\n}: {\n query?: GetStreamPointsQuery;\n options?: UseStreamPointsOptions;\n} = {}) {\n return useQuery(createQueryOptions(streamsQueries.points(query), options));\n}\n\nexport function useStreamWallets({\n query,\n options,\n}: {\n query: GetStreamsWalletsQuery;\n options?: UseStreamWalletsOptions;\n}) {\n return useQuery(createQueryOptions(streamsQueries.wallets(query), options));\n}\n\nexport function useStreamWalletDetails({\n query,\n options,\n}: {\n query: { streamId: string; userAddress: string };\n options?: UseStreamWalletDetailsOptions;\n}) {\n return useQuery(createQueryOptions(streamsQueries.walletDetails(query), options));\n}\n\nexport function useStreamSupportedChains({\n options,\n}: {\n options?: UseStreamSupportedChainsOptions;\n} = {}) {\n return useQuery(createQueryOptions(streamsQueries.supportedChains, options));\n}\n\nexport function useUpdateStream(options?: UseUpdateStreamOptions) {\n return useMutation({\n mutationFn: streamsMutations.update,\n ...options,\n });\n}\n\nexport function useDeleteStream(options?: UseDeleteStreamOptions) {\n return useMutation({\n mutationFn: streamsMutations.deleteStream,\n ...options,\n });\n}\n","import { z } from \"zod\";\nimport { organizationSchema } from \"../organizations\";\nimport { supportedTokenSchema } from \"../supported-tokens\";\n\nconst customArgsBaseSchema = z.object({\n targetTokenId: z.string().uuid(),\n});\n\n// Schemes for SNAPSHOTS (without targetToken)\nconst snapshotCustomArgsTokensPerUsdSchema = customArgsBaseSchema.extend({\n tokensPerUSD: z.string(),\n});\nconst snapshotCustomArgsAprSchema = customArgsBaseSchema.extend({\n apr: z.string(),\n});\nconst snapshotCustomArgsTokensPerDaySchema = customArgsBaseSchema.extend({\n tokensPerDay: z.string(),\n});\n\nconst snapshotCustomArgsSchema = z.union([\n snapshotCustomArgsTokensPerUsdSchema,\n snapshotCustomArgsAprSchema,\n snapshotCustomArgsTokensPerDaySchema,\n]);\n\n// Schemes for STREAM (with mandatory targetToken)\nconst streamCustomArgsTokensPerUsdSchema = snapshotCustomArgsTokensPerUsdSchema.extend({\n targetToken: supportedTokenSchema,\n});\nconst streamCustomArgsAprSchema = snapshotCustomArgsAprSchema.extend({\n targetToken: supportedTokenSchema,\n});\nconst streamCustomArgsTokensPerDaySchema = snapshotCustomArgsTokensPerDaySchema.extend({\n targetToken: supportedTokenSchema,\n});\n\nconst streamCustomArgsSchema = z.union([\n streamCustomArgsTokensPerUsdSchema,\n streamCustomArgsAprSchema,\n streamCustomArgsTokensPerDaySchema,\n]);\n\nconst updateStreamCustomArgsBaseSchema = z.object({\n targetTokenId: z.string().uuid().optional(),\n});\n\nconst updateStreamCustomArgsTokensPerUsdSchema = updateStreamCustomArgsBaseSchema.extend({\n tokensPerUSD: z.string(),\n});\nconst updateStreamCustomArgsAprSchema = updateStreamCustomArgsBaseSchema.extend({\n apr: z.string(),\n});\nconst updateStreamCustomArgsTokensPerDaySchema = updateStreamCustomArgsBaseSchema.extend({\n tokensPerDay: z.string(),\n});\n\nexport const updateStreamCustomArgsSchema = z.union([\n updateStreamCustomArgsTokensPerUsdSchema,\n updateStreamCustomArgsAprSchema,\n updateStreamCustomArgsTokensPerDaySchema,\n]);\n\nexport const snapshotSchema = z.object({\n amountBase: z.string(),\n amountDistributed: z.string(),\n createdAt: z.string().datetime(),\n rootHash: z.string().nullable(),\n timestamp: z.string().datetime(),\n updatedAt: z.string().datetime(),\n userCount: z.number().nullable().optional(),\n activeUserCount: z.number().optional(),\n tvl: z.string().nullable().optional(),\n baseTvl: z.string().nullable().optional(),\n netTvl: z.string().nullable().optional(),\n turtleTvl: z.string().nullable().optional(),\n turtleNetTvl: z.string().nullable().optional(),\n customMetrics: z.record(z.unknown()).optional(),\n customArgs: snapshotCustomArgsSchema.optional(),\n});\n\nexport const streamPointSchema = z.object({\n id: z.string(),\n orgId: z.string().optional(),\n symbol: z.string(),\n name: z.string(),\n decimals: z.coerce.number().optional(),\n logoUrl: z.string().url().nullable().optional(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n deletedAt: z.string().nullable().optional(),\n organization: organizationSchema.nullable().optional(),\n});\n\nconst chainSchema = z.object({\n chainId: z.coerce.number(),\n ecosystem: z.string(),\n explorerUrl: z.string(),\n id: z.string().uuid(),\n isTestnet: z.boolean(),\n logoUrl: z.string(),\n name: z.string(),\n slug: z.string(),\n status: z.string(),\n});\n\nconst rewardTokenSchema = z\n .object({\n active: z.boolean(),\n address: z.string(),\n canonicalAssetId: z.string().uuid(),\n chain: chainSchema,\n decimals: z.number(),\n id: z.string().uuid(),\n isNative: z.boolean(),\n logoUrl: z.string(),\n name: z.string(),\n priceUsd: z.number(),\n symbol: z.string(),\n streamsMinAmount: z.string().nullable().optional(),\n })\n .nullable();\n\nconst adaptersSchema = z.array(\n z.object({\n type: z.string(),\n params: z.record(z.string(), z.number()),\n })\n);\n\nconst feeTierSchema = z.object({\n maxTVL: z.string().nullable(), // represents a USD amount\n feePct: z.string(), // represents a percentage (e.g. 0.15 means 15%)\n});\n\nconst feeScheduleSchema = z.object({\n feeTiers: z.array(feeTierSchema),\n until: z.string().datetime().nullable(),\n});\n\nconst feeSnapshotSchema = z.object({\n timestamp: z.string().datetime(),\n tvl: z.string().nullable(), // means USD amount\n accumulatedFee: z.string(), // means USD amount\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n});\n\nconst feeSchema = z.object({\n managementFeeSchedules: z.array(feeScheduleSchema),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n lastFeeSnapshotTimestamp: z.string().datetime(),\n feeComputationPaused: z.boolean(),\n feeSnapshots: z.array(feeSnapshotSchema).optional(),\n lastFeeSnapshot: feeSnapshotSchema.nullable(),\n});\n\nexport const streamSchema = z.object({\n adapters: adaptersSchema,\n admin: z.string().nullable(),\n chainId: z.number().nullable(),\n chargedFee: z.string().nullable(),\n claimPaused: z.boolean(),\n committedSnapshot: snapshotSchema.nullable(),\n contractAddress: z.string().nullable(),\n createdAt: z.string().datetime(),\n creationConfirmedAt: z.string().datetime().nullable(),\n customArgs: streamCustomArgsSchema,\n endTimestamp: z.string().datetime().nullable(),\n fee: feeSchema.nullable(),\n hashCommitmentPaused: z.boolean(),\n id: z.string().uuid(),\n lastSnapshot: snapshotSchema.nullable(),\n merkleTreeComputationPaused: z.boolean(),\n orgId: z.string().uuid(),\n point: streamPointSchema.nullable().optional(),\n rewardToken: rewardTokenSchema,\n snapshotComputationPaused: z.boolean(),\n snapshots: z.array(snapshotSchema).optional(),\n startTimestamp: z.string().datetime(),\n strategy: z.string(),\n totalAmount: z.string().nullable(),\n type: z.number(),\n updatedAt: z.string().datetime(),\n userId: z.string().uuid(),\n});\n\n// --- API Request/Response Schemas ---\n\nexport const getStreamsOutputSchema = z.object({\n streams: z.array(streamSchema),\n});\n\nexport const getStreamPointsOutputSchema = z.object({\n points: z.array(streamPointSchema),\n});\n\nexport const createStreamPointBodySchema = z.object({\n name: z.string(),\n symbol: z.string(),\n decimals: z.number().optional(),\n logoUrl: z.string().url().nullable().optional(),\n});\n\nexport const createStreamPointOutputSchema = z.object({\n point: streamPointSchema,\n});\n\nexport const getStreamsSupportedChainsOutputSchema = z.object({\n success: z.boolean(),\n chains: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n chainId: z.number(),\n logoUrl: z.string(),\n ecosystem: z.string(),\n status: z.string(),\n explorerUrl: z.string(),\n streamFactory: z.string(), // Address as string\n })\n ),\n});\n\nexport const streamSignatureRequestInputSchema = z.object({\n adapters: adaptersSchema,\n chainId: z.number().nullable(),\n customArgs: snapshotCustomArgsSchema,\n endTimestamp: z.string().nullable(),\n pointId: z.string().uuid().nullable(),\n rewardToken: z.string().nullable(),\n startTimestamp: z.string(),\n totalAmount: z.string().nullable(),\n type: z.number(),\n walletAddress: z.string().nullable(),\n});\n\nexport const streamSignatureRequestOutputSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n txParams: z\n .object({\n chainId: z.number(),\n sender: z.string(),\n params: z.object({\n deadline: z.number(),\n params: z.object({\n StreamId: z.array(z.number()),\n RewardToken: z.string(),\n NetTotalAmount: z.string(),\n FeeAmount: z.string(),\n }),\n signature: z.string(),\n }),\n })\n .nullable(),\n});\n\nexport const getStreamsQuerySchema = z.object({\n streamId: z.string().optional(),\n userId: z.string().optional(),\n organizationId: z.string().optional(),\n withSnapshots: z.boolean().optional(),\n withFeeSnapshots: z.boolean().optional(),\n usersCount: z.boolean().optional(),\n});\n\nexport const getStreamPointsQuerySchema = z.object({\n id: z.string().optional().nullable(),\n organizationId: z.string().optional().nullable(),\n symbol: z.string().optional().nullable(),\n name: z.string().optional().nullable(),\n});\n\n// --- Wallets & Snapshots Schemas ---\n\nexport const streamWalletSnapshotSchema = z.object({\n timestamp: z.string().datetime(),\n rewardsAccumulated: z.string(),\n rewardsAccumulatedBase: z.string(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n tvl: z.string().nullable().optional(),\n});\n\nexport const streamWalletSchema = z.object({\n userAddress: z.string(),\n lastSnapshot: streamWalletSnapshotSchema,\n});\n\nexport const paginationSchema = z.object({\n limit: z.number(),\n page: z.number(),\n total: z.number(),\n totalPages: z.number(),\n});\n\nexport const getStreamWalletsResponseSchema = z.object({\n data: z.array(streamWalletSchema),\n pagination: paginationSchema,\n});\n\nexport const getStreamWalletsQuerySchema = z.object({\n streamId: z.string(),\n page: z.number().optional(),\n limit: z.number().optional(),\n});\n\nexport const streamWalletDetailsSchema = z.object({\n streamId: z.string(),\n userAddress: z.string(),\n snapshots: z.array(streamWalletSnapshotSchema),\n stream: streamSchema,\n});\n\nexport const getStreamWalletDetailsResponseSchema = z.object({\n wallet: streamWalletDetailsSchema,\n});\n\nconst updateStreamMutableFieldsSchema = z.object({\n customArgs: updateStreamCustomArgsSchema.optional(),\n snapshotComputationPaused: z.boolean().optional(),\n merkleTreeComputationPaused: z.boolean().optional(),\n hashCommitmentPaused: z.boolean().optional(),\n stopStream: z.boolean().optional(),\n endTimestamp: z.string().datetime().nullable().optional(),\n setNilEndTimestamp: z.boolean().optional(),\n});\n\nconst updateStreamFieldsSchema = z.object({\n streamId: z.string().uuid(),\n});\n\nconst updateStreamBodyBaseSchema = updateStreamFieldsSchema.merge(updateStreamMutableFieldsSchema);\n\ntype UpdateStreamMutableFields = z.infer<typeof updateStreamMutableFieldsSchema>;\n\nconst hasUpdateStreamFields = (input: UpdateStreamMutableFields) => {\n return Object.values(input).some((value) => value !== undefined);\n};\n\nexport const updateStreamBodySchema = updateStreamBodyBaseSchema.refine(\n ({ streamId: _streamId, ...updateFields }: z.infer<typeof updateStreamBodyBaseSchema>) =>\n hasUpdateStreamFields(updateFields),\n {\n message: \"At least one stream update field must be provided\",\n }\n);\n\nconst updateStreamInputBaseSchema = updateStreamBodyBaseSchema.extend({\n organizationId: z.string().uuid(),\n});\n\nexport const updateStreamInputSchema = updateStreamInputBaseSchema;\n\nexport const deleteStreamInputSchema = z.object({\n organizationId: z.string().uuid(),\n streamId: z.string().uuid(),\n});\n\nexport const updateStreamOutputSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n});\n\nexport const deleteStreamOutputSchema = updateStreamOutputSchema;\n\n// --- Types ---\n\nexport type Stream = z.infer<typeof streamSchema>;\nexport type StreamsSchema = z.infer<typeof getStreamsOutputSchema>;\nexport type StreamPoint = z.infer<typeof streamPointSchema>;\nexport type StreamsSupportedChainsResponse = z.infer<typeof getStreamsSupportedChainsOutputSchema>;\nexport type CreateStreamPointBody = z.infer<typeof createStreamPointBodySchema>;\nexport type CreateStreamPointOutput = z.infer<typeof createStreamPointOutputSchema>;\nexport type StreamSignatureRequestInput = z.infer<typeof streamSignatureRequestInputSchema>;\nexport type StreamSignatureRequestOutput = z.infer<typeof streamSignatureRequestOutputSchema>;\nexport type GetStreamsQuery = z.infer<typeof getStreamsQuerySchema>;\nexport type GetStreamPointsQuery = z.infer<typeof getStreamPointsQuerySchema>;\nexport type StreamWalletSnapshot = z.infer<typeof streamWalletSnapshotSchema>;\nexport type StreamWallet = z.infer<typeof streamWalletSchema>;\nexport type StreamWalletDetails = z.infer<typeof streamWalletDetailsSchema>;\nexport type PaginationSchema = z.infer<typeof paginationSchema>;\nexport type GetStreamsWalletsQuery = z.infer<typeof getStreamWalletsQuerySchema>;\nexport type UpdateStreamCustomArgs = z.infer<typeof updateStreamCustomArgsSchema>;\nexport type UpdateStreamInput = z.infer<typeof updateStreamInputSchema>;\nexport type UpdateStreamBody = z.infer<typeof updateStreamBodySchema>;\nexport type UpdateStreamOutput = z.infer<typeof updateStreamOutputSchema>;\nexport type DeleteStreamInput = z.infer<typeof deleteStreamInputSchema>;\nexport type DeleteStreamOutput = z.infer<typeof deleteStreamOutputSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n GetStreamsQuery,\n getStreamsOutputSchema,\n StreamsSchema,\n getStreamsSupportedChainsOutputSchema,\n StreamsSupportedChainsResponse,\n StreamSignatureRequestInput,\n streamSignatureRequestOutputSchema,\n StreamSignatureRequestOutput,\n StreamWallet,\n getStreamWalletsResponseSchema,\n StreamWalletDetails,\n getStreamWalletDetailsResponseSchema,\n PaginationSchema,\n GetStreamsWalletsQuery,\n GetStreamPointsQuery,\n StreamPoint,\n getStreamPointsOutputSchema,\n CreateStreamPointBody,\n CreateStreamPointOutput,\n createStreamPointOutputSchema,\n UpdateStreamBody,\n UpdateStreamOutput,\n updateStreamOutputSchema,\n DeleteStreamOutput,\n deleteStreamOutputSchema,\n} from \"./schemas\";\n\nexport async function getStreams(query?: GetStreamsQuery): Promise<StreamsSchema[\"streams\"]> {\n const params = new URLSearchParams();\n if (query?.streamId) params.set(\"id\", query.streamId);\n if (query?.userId) params.set(\"userId\", query.userId);\n if (query?.organizationId) params.set(\"organizationId\", query.organizationId);\n if (query?.withSnapshots) params.append(\"withSnapshots\", \"true\");\n if (query?.usersCount && query?.withSnapshots) params.append(\"usersCount\", \"true\");\n if (query?.withFeeSnapshots) params.append(\"withFeeSnapshots\", \"true\");\n\n const queryString = params.toString();\n const endpoint = `/streams${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamsOutputSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreams:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse streams: ${result.error.message}`);\n }\n return result.data.streams;\n}\n\nexport async function getStreamPoints(query?: GetStreamPointsQuery): Promise<StreamPoint[]> {\n const params = new URLSearchParams();\n if (query?.id) params.set(\"id\", query.id);\n if (query?.organizationId) params.set(\"organizationId\", query.organizationId);\n if (query?.symbol) params.set(\"symbol\", query.symbol);\n if (query?.name) params.set(\"name\", query.name);\n\n const queryString = params.toString();\n const endpoint = `/streams/points${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamPointsOutputSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreamPoints:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse stream points: ${result.error.message}`);\n }\n return result.data.points;\n}\n\nexport async function createStreamPoint(\n organizationId: string,\n body: CreateStreamPointBody\n): Promise<CreateStreamPointOutput> {\n const endpoint = `/streams/points/${organizationId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body,\n });\n\n const result = createStreamPointOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse create point response: ${result.error.message}`);\n }\n return result.data;\n}\n\nexport async function getStreamWallets(\n query: GetStreamsWalletsQuery\n): Promise<{ data: StreamWallet[]; pagination: PaginationSchema }> {\n const params = new URLSearchParams();\n if (query?.page) params.set(\"page\", query.page.toString());\n if (query?.limit) params.set(\"limit\", query.limit.toString());\n\n const queryString = params.toString();\n const endpoint = `/streams/${query.streamId}/wallets/${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamWalletsResponseSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreamWallets:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse stream wallets: ${result.error.message}`);\n }\n return result.data;\n}\n\nexport async function getStreamWalletDetails(\n streamId: string,\n userAddress: string\n): Promise<StreamWalletDetails> {\n const endpoint = `/streams/${streamId}/wallets/${userAddress}`;\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamWalletDetailsResponseSchema.safeParse(data);\n\n if (!result.success) {\n console.error(\n \"Zod Validation Error in getStreamWalletDetails:\",\n JSON.stringify(result.error.format(), null, 2)\n );\n throw new Error(`Failed to parse stream wallet details: ${result.error.message}`);\n }\n return result.data.wallet;\n}\n\nexport async function getStreamsSupportedChains(): Promise<\n StreamsSupportedChainsResponse[\"chains\"]\n> {\n const endpoint = \"/streams/supported_chains\";\n const data = await apiClient.fetch(endpoint, { method: \"GET\" });\n const result = getStreamsSupportedChainsOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse supported chains: ${result.error.message}`);\n }\n return result.data.chains;\n}\n\nexport async function requestStreamSignature(\n organizationId: string,\n input: StreamSignatureRequestInput\n): Promise<StreamSignatureRequestOutput> {\n const endpoint = `/streams/${organizationId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: input,\n });\n\n const result = streamSignatureRequestOutputSchema.safeParse(data);\n if (!result.success) {\n throw new Error(`Failed to parse signature response: ${result.error.message}`);\n }\n return result.data;\n}\n\nexport async function updateStream(\n organizationId: string,\n body: UpdateStreamBody\n): Promise<UpdateStreamOutput> {\n const endpoint = `/streams/${organizationId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"PATCH\",\n body,\n });\n\n const result = updateStreamOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse update stream response: ${result.error.message}`);\n }\n\n return result.data;\n}\n\nexport async function deleteStream(organizationId: string, streamId: string): Promise<DeleteStreamOutput> {\n const endpoint = `/streams/${organizationId}/${streamId}`;\n const data = await apiClient.fetch(endpoint, {\n method: \"DELETE\",\n });\n\n const result = deleteStreamOutputSchema.safeParse(data);\n\n if (!result.success) {\n throw new Error(`Failed to parse delete stream response: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { deleteStream, updateStream } from \"./api\";\nimport { DeleteStreamInput, UpdateStreamInput } from \"./schemas\";\n\nexport const streamsMutations = {\n update: ({ organizationId, ...body }: UpdateStreamInput) => updateStream(organizationId, body),\n deleteStream: (input: DeleteStreamInput) => deleteStream(input.organizationId, input.streamId),\n};\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport {\n getStreams,\n getStreamsSupportedChains,\n getStreamWallets,\n getStreamWalletDetails,\n getStreamPoints,\n} from \"./api\";\nimport { GetStreamPointsQuery, GetStreamsQuery, GetStreamsWalletsQuery } from \"./schemas\";\n\nexport const streamsQueries = createQueryKeys(\"streams\", {\n list: (query?: GetStreamsQuery) => ({\n queryKey: [query ?? \"all\"],\n queryFn: () => getStreams(query),\n }),\n points: (query?: GetStreamPointsQuery) => ({\n queryKey: [query ?? \"all\"],\n queryFn: () => getStreamPoints(query),\n }),\n wallets: (query: GetStreamsWalletsQuery) => ({\n queryKey: [query],\n queryFn: () => getStreamWallets(query),\n }),\n walletDetails: (query: { streamId: string; userAddress: string }) => ({\n queryKey: [query],\n queryFn: () => getStreamWalletDetails(query.streamId, query.userAddress),\n }),\n supportedChains: {\n queryKey: null,\n queryFn: () => getStreamsSupportedChains(),\n },\n});\n","import { apiClient } from \"../lib/api-client\";\nimport type {\n OpportunityFilters,\n OpportunitiesResponse,\n GetOpportunitiesPaginatedInput,\n GetOpportunitiesPaginatedResponse,\n GetOpportunitiesFilterOptionsResponse,\n GetOpportunityByIdInput,\n Opportunity,\n} from \"./schema\";\nimport {\n opportunitiesResponseSchema,\n getOpportunitiesPaginatedSchema,\n getOpportunitiesFilterOptionsSchema,\n opportunitySchema,\n} from \"./schema\";\n\n// GET /turtle/opportunities\nexport async function getOpportunities(\n filters?: OpportunityFilters,\n options?: { debug?: boolean }\n): Promise<OpportunitiesResponse> {\n const params = new URLSearchParams();\n\n if (filters?.tokenId) params.append(\"tokenId\", filters.tokenId);\n if (filters?.chain) params.append(\"chain\", filters.chain);\n if (filters?.productId) params.append(\"productId\", filters.productId);\n\n const queryString = params.toString();\n const endpoint = `/turtle/opportunities${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = opportunitiesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/opportunities/{id}\nexport async function getOpportunityById(\n id: string,\n queryParams?: GetOpportunityByIdInput,\n options?: { debug?: boolean }\n): Promise<Opportunity> {\n const params = new URLSearchParams();\n\n if (queryParams?.withMainStream !== undefined) {\n params.append(\"withMainStream\", String(queryParams.withMainStream));\n }\n\n const queryString = params.toString();\n const endpoint = `/turtle/opportunities/${id}${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = opportunitySchema.safeParse(data);\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse opportunity: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/opportunities-paginated\nexport async function getOpportunitiesPaginated(\n params?: GetOpportunitiesPaginatedInput,\n options?: { debug?: boolean }\n): Promise<GetOpportunitiesPaginatedResponse> {\n const queryParams = new URLSearchParams();\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n queryParams.append(key, String(value));\n }\n });\n }\n\n const queryString = queryParams.toString();\n const endpoint = `/turtle/opportunities-paginated${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = getOpportunitiesPaginatedSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse paginated opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/opportunities-filter-options\nexport async function getOpportunitiesFilterOptions(options?: {\n debug?: boolean;\n}): Promise<GetOpportunitiesFilterOptionsResponse> {\n const data = await apiClient.fetch(\"/turtle/opportunities-filter-options\", {\n method: \"GET\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = getOpportunitiesFilterOptionsSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse opportunities filter options: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getEarnOpportunities } from \"./api\";\n\nexport const earnOpportunitiesQueries = createQueryKeys(\"earnOpportunities\", {\n all: {\n queryKey: null,\n queryFn: (context) => getEarnOpportunities(context),\n },\n});\n","import { z } from \"zod\";\nimport { tokenSchema } from \"../supported-tokens\";\n\n// Earn Opportunity Response Schema\nexport const earnOpportunitySchema = z.object({\n id: z.string().uuid(),\n name: z.string(),\n description: z.string(),\n type: z.string(),\n estimatedApr: z.number(),\n tvl: z.number(),\n featured: z.boolean(),\n baseTokens: tokenSchema,\n depositTokens: z.array(tokenSchema).nullable(),\n receiptToken: tokenSchema,\n});\n\n// Earn Opportunities Response Schema\nexport const earnOpportunitiesResponseSchema = z.object({\n opportunities: z.array(earnOpportunitySchema).nullable(),\n total: z.number().int(),\n});\n\nexport type EarnOpportunity = z.infer<typeof earnOpportunitySchema>;\nexport type EarnOpportunitiesResponse = z.infer<typeof earnOpportunitiesResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { EarnOpportunitiesResponse } from \"./schema\";\nimport { earnOpportunitiesResponseSchema } from \"./schema\";\n\n// GET /v1/opportunities\nexport async function getEarnOpportunities(\n context?: QueryFunctionContext\n): Promise<EarnOpportunitiesResponse> {\n const data = await apiClient.fetch(\"/v1/opportunities/\", {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = earnOpportunitiesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse earn opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getEarnRoute } from \"./api\";\nimport type { EarnRouteParams } from \"./schema\";\n\nexport const earnRouteQueries = createQueryKeys(\"earnRoute\", {\n // Get earn route with specific parameters\n byParams: (params: EarnRouteParams) => ({\n queryKey: [params],\n queryFn: (context) => getEarnRoute(params, context),\n }),\n});\n","import { ethz } from \"@turtleclub/utils\";\nimport { z } from \"zod\";\n\n// Asset schemas\nexport const assetImageData = z.object({\n kind: z.literal(\"image\"),\n url: z.string(),\n alt: z.string(),\n});\n\nexport const assetERC20Data = z.object({\n kind: z.literal(\"erc20\"),\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n});\n\nexport const assetData = z.discriminatedUnion(\"kind\", [assetImageData, assetERC20Data]);\n\nexport const asset = z.object({\n id: z.string().uuid(),\n name: z.string(),\n slugs: z.array(z.string()),\n tags: z.array(z.string()),\n description: z.string().nullable(),\n data: z.array(assetData),\n});\n\n// Token schema\nexport const routeToken = z.object({\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n logos: z.array(z.string()),\n decimals: z.number(),\n chain: z.number(),\n price: z.number().nullable().optional(),\n});\n\n// Router substeps\nexport const swapSubstep = z.object({\n kind: z.literal(\"swap\"),\n from: z.array(routeToken),\n to: z.array(routeToken),\n protocol: z.string(),\n protocol_asset: asset.nullable(),\n price_impact: z.number().nullable(),\n});\n\nexport const depositSubstep = z.object({\n kind: z.literal(\"deposit\"),\n vault: z.string(),\n from: z.array(routeToken),\n to: z.array(routeToken),\n amount: z.string(),\n protocol: z.string(),\n protocol_asset: asset.nullable(),\n price_impact: z.number().nullable(),\n});\n\nexport const routerSubstep = z.discriminatedUnion(\"kind\", [swapSubstep, depositSubstep]);\n\n// Transaction schema\nexport const stepTx = z.object({\n from: ethz.address(),\n to: ethz.address(),\n data: ethz.hex(),\n value: z.string(),\n gas: z.number(),\n});\n\n// Router steps\nexport const approveStep = z.object({\n kind: z.literal(\"approve\"),\n owner: z.string(),\n spender: z.string(),\n token: routeToken,\n amount: z.string(),\n tx: stepTx,\n});\n\nexport const ensoStep = z.object({\n kind: z.literal(\"enso\"),\n substeps: z.array(routerSubstep),\n tx: stepTx,\n asset: asset.nullable(),\n});\n\nexport const routerStep = z.discriminatedUnion(\"kind\", [approveStep, ensoStep]);\n\n// Earn Route Response\nexport const earnRouteResponseSchema = z.object({\n steps: z.array(routerStep),\n amount_out: z.string(),\n price_impact: z.number().nullable(),\n});\n\n// Earn Route Request Params\nexport interface EarnRouteParams {\n user: string;\n chain: number;\n slippage: number;\n token_in: string;\n token_out: string;\n amount: string;\n distributor_id: string;\n referral_code?: string;\n // @deprecated productId is not supported anymore\n id?: string;\n}\n\nexport type AssetImageData = z.infer<typeof assetImageData>;\nexport type AssetERC20Data = z.infer<typeof assetERC20Data>;\nexport type AssetData = z.infer<typeof assetData>;\nexport type Asset = z.infer<typeof asset>;\nexport type RouteToken = z.infer<typeof routeToken>;\nexport type SwapSubstep = z.infer<typeof swapSubstep>;\nexport type DepositSubstep = z.infer<typeof depositSubstep>;\nexport type RouterSubstep = z.infer<typeof routerSubstep>;\nexport type StepTx = z.infer<typeof stepTx>;\nexport type ApproveStep = z.infer<typeof approveStep>;\nexport type EnsoStep = z.infer<typeof ensoStep>;\nexport type RouterStep = z.infer<typeof routerStep>;\nexport type EarnRouteResponse = z.infer<typeof earnRouteResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { EarnRouteResponse, EarnRouteParams } from \"./schema\";\nimport { earnRouteResponseSchema } from \"./schema\";\n\n// GET /v1/route\nexport async function getEarnRoute(\n params: EarnRouteParams,\n context?: QueryFunctionContext\n): Promise<EarnRouteResponse> {\n const searchParams = new URLSearchParams({\n user: params.user,\n chain: params.chain.toString(),\n slippage: params.slippage.toString(),\n token_in: params.token_in,\n token_out: params.token_out,\n amount: params.amount,\n distributor_id: params.distributor_id,\n ...(params.referral_code && { referral_code: params.referral_code }),\n ...(params.id && { id: params.id }),\n });\n\n const response = await apiClient.fetch<{ data: unknown }>(`/v1/route/?${searchParams.toString()}`, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const data = response.data;\n const result = earnRouteResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse earn route: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { checkMembership } from \"./api\";\nimport type { CheckMembershipParams } from \"./schema\";\n\nexport const earnMembershipQueries = createQueryKeys(\"earnMembership\", {\n // Check membership status\n check: (params: CheckMembershipParams) => ({\n queryKey: [params],\n queryFn: (context) => checkMembership(params, context),\n }),\n});\n","import { z } from \"zod\";\n\n// Wallet Ecosystem Enum\nexport const walletEcosystemEnum = z.enum([\"evm\", \"solana\", \"ton\"]);\n\n// GET /v1/membership/ - Check Membership\nexport interface CheckMembershipParams {\n address: string;\n walletEcosystem?: \"evm\" | \"solana\" | \"ton\";\n}\n\nexport const checkMembershipResponseSchema = z.object({\n isMember: z.boolean(),\n});\n\n// POST /v1/membership/agreement - Create Agreement\nexport const createAgreementRequestSchema = z.object({\n address: z.string(),\n walletEcosystem: walletEcosystemEnum,\n url: z.string(),\n chainId: z.string().default(\"1\"),\n});\n\nexport const createAgreementResponseSchema = z.object({\n message: z.string(),\n nonce: z.string(),\n});\n\n// POST /v1/membership/ - Create Membership\nexport const createMembershipRequestSchema = z.object({\n address: z.string(),\n walletEcosystem: z.string(),\n signature: z.string(),\n nonce: z.string(),\n});\n\nexport const createMembershipResponseSchema = z.object({\n isMember: z.boolean(),\n error: z.string().optional(),\n});\n\nexport type WalletEcosystem = z.infer<typeof walletEcosystemEnum>;\nexport type CheckMembershipResponse = z.infer<typeof checkMembershipResponseSchema>;\nexport type CreateAgreementRequest = z.infer<typeof createAgreementRequestSchema>;\nexport type CreateAgreementResponse = z.infer<typeof createAgreementResponseSchema>;\nexport type CreateMembershipRequest = z.infer<typeof createMembershipRequestSchema>;\nexport type CreateMembershipResponse = z.infer<typeof createMembershipResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type {\n CheckMembershipParams,\n CheckMembershipResponse,\n CreateAgreementRequest,\n CreateAgreementResponse,\n CreateMembershipRequest,\n CreateMembershipResponse,\n} from \"./schema\";\nimport {\n checkMembershipResponseSchema,\n createAgreementResponseSchema,\n createMembershipResponseSchema,\n} from \"./schema\";\n\n// GET /v1/membership/ - Check if wallet is a member\nexport async function checkMembership(\n params: CheckMembershipParams,\n context?: QueryFunctionContext\n): Promise<CheckMembershipResponse> {\n const searchParams = new URLSearchParams({\n address: params.address,\n ...(params.walletEcosystem && { walletEcosystem: params.walletEcosystem }),\n });\n\n const data = await apiClient.fetch(`/v1/membership/?${searchParams.toString()}`, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = checkMembershipResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse check membership: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /v1/membership/agreement - Create membership agreement\nexport async function createMembershipAgreement(\n request: CreateAgreementRequest\n): Promise<CreateAgreementResponse> {\n const data = await apiClient.fetch(\"/v1/membership/agreement\", {\n method: \"POST\",\n domain: \"earn\",\n body: request,\n });\n\n const result = createAgreementResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse create agreement: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /v1/membership/ - Create membership\nexport async function createMembership(\n request: CreateMembershipRequest\n): Promise<CreateMembershipResponse> {\n const data = await apiClient.fetch(\"/v1/membership/\", {\n method: \"POST\",\n domain: \"earn\",\n body: request,\n });\n\n const result = createMembershipResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse create membership: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getDeposits } from \"./api\";\nimport type { GetDepositsParams } from \"./schema\";\n\nexport const earnDepositsQueries = createQueryKeys(\"earnDeposits\", {\n byParams: (params: GetDepositsParams) => ({\n queryKey: [params],\n queryFn: (context) => getDeposits(params, context),\n }),\n});\n","import { z } from \"zod\";\n\n// Deposit Schema\nexport const depositSchema = z.object({\n chain: z.number().int(),\n deposited_amount_usd: z.string(),\n deposited_token_address: z.string(),\n deposited_token_decimals: z.number().int(),\n deposited_token_logo: z.string(),\n deposited_token_name: z.string(),\n deposited_token_symbol: z.string(),\n deposited_value: z.string(),\n depositor: z.string(),\n target: z.string(),\n timestamp: z.string(),\n tx_hash: z.string(),\n});\n\n// Deposits Response Schema\nexport const depositsResponseSchema = z.object({\n deposits: z.array(depositSchema).nullable(),\n});\n\n// Deposits Request Params\nexport interface GetDepositsParams {\n distributor_id: string;\n depositor?: string;\n limit?: number;\n offset?: number;\n}\n\nexport type Deposit = z.infer<typeof depositSchema>;\nexport type DepositsResponse = z.infer<typeof depositsResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GetDepositsParams, DepositsResponse } from \"./schema\";\nimport { depositsResponseSchema } from \"./schema\";\n\n// GET /v1/deposit/{distributor_id}\nexport async function getDeposits(\n params: GetDepositsParams,\n context?: QueryFunctionContext\n): Promise<DepositsResponse> {\n const { distributor_id, depositor, limit, offset } = params;\n\n const searchParams = new URLSearchParams({\n ...(depositor && { depositor }),\n ...(limit && { limit: limit.toString() }),\n ...(offset && { offset: offset.toString() }),\n });\n\n const queryString = searchParams.toString();\n const endpoint = `/v1/deposit/${distributor_id}${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = depositsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse deposits: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\n// Note: Actions are mutations (POST), so no query keys are needed for fetching.\n// This file exists for consistency and potential future GET endpoints.\n\nexport const earnActionsQueries = createQueryKeys(\"earnActions\", {\n // Placeholder for potential future GET endpoints\n // e.g., getting action history\n});\n\n// Legacy alias\nexport const earnInteractionsQueries = earnActionsQueries;\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getProduct, getProducts } from \"./api\";\nimport type { ProductFilters } from \"./schema\";\n\nexport const productsQueries = createQueryKeys(\"products\", {\n // Get all products (no filters)\n all: () => ({\n queryKey: [\"all\"],\n queryFn: () => getProducts(),\n }),\n\n list: (filters?: ProductFilters) => ({\n queryKey: [{ filters }],\n queryFn: () => getProducts(filters),\n }),\n byId: (id: string) => ({\n queryKey: [id],\n queryFn: () => getProduct(id),\n }),\n});\n","import { apiClient } from \"../lib/api-client\";\nimport {\n CreateProductInput,\n ProductFilters,\n CreateProductResponse,\n createProductResponseSchema,\n ProductResponse,\n productResponseSchema,\n ProductsResponse,\n productsResponseSchema,\n UpdateProductInput,\n UpdateProductResponse,\n updateProductResponseSchema,\n UploadProductLogoRequest,\n UploadProductLogoResponse,\n uploadProductLogoResponseSchema,\n} from \"./schema\";\n\n// GET /turtle/products\nexport async function getProducts(filters?: ProductFilters): Promise<ProductsResponse> {\n const params = new URLSearchParams();\n\n if (filters?.organizationId) params.append(\"organizationId\", filters.organizationId);\n\n const queryString = params.toString();\n const endpoint = `/turtle/products${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = productsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse products: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /turtle/products/:id\nexport async function getProduct(id: string): Promise<ProductResponse> {\n const endpoint = `/turtle/products/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = productResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse product: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /admin/products\nexport async function createProduct(input: CreateProductInput): Promise<CreateProductResponse> {\n const endpoint = `/admin/products`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: input,\n });\n\n // Validate response with Zod\n const result = createProductResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to create product: ${result.error.message}`);\n }\n return result.data;\n}\n\n// PUT /admin/products/:id\nexport async function updateProduct(input: UpdateProductInput): Promise<UpdateProductResponse> {\n const endpoint = `/admin/products/${input.product.id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"PUT\",\n body: input,\n });\n\n // Validate response with Zod\n const result = updateProductResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to update product: ${result.error.message}`);\n }\n return result.data;\n}\n\n// DELETE /admin/products/:id\nexport async function deleteProduct(id: string): Promise<void> {\n const endpoint = `/admin/products/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"DELETE\",\n });\n\n // Validate response with Zod\n const result = productResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to delete product: ${result.error.message}`);\n }\n}\n\n// POST /admin/products/upload-logo\nexport async function uploadProductLogo({\n file,\n filename,\n}: UploadProductLogoRequest): Promise<UploadProductLogoResponse> {\n const endpoint = `/admin/products/upload-logo`;\n\n const formData = new FormData();\n formData.append(\"file\", file as File, filename || file.name);\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: formData,\n });\n\n // Validate response with Zod\n const result = uploadProductLogoResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to upload product logo: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getWalletBalances } from \"./api\";\nimport type { GetWalletBalancesParams } from \"./schemas\";\n\nexport const ensoBalancesQueries = createQueryKeys(\"ensoBalances\", {\n byParams: (params: GetWalletBalancesParams) => ({\n queryKey: [params],\n queryFn: (context) => getWalletBalances(params, context),\n }),\n});\n","import { z } from \"zod\";\n\nexport const balanceTokenSchema = z.object({\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n logos: z.array(z.string()),\n decimals: z.number(),\n chain: z.number(),\n price: z.number().nullable().optional(),\n});\n\nexport const walletBalanceSchema = z.object({\n token: balanceTokenSchema,\n amount: z.string(),\n});\n\nexport interface GetWalletBalancesParams {\n user: string;\n chain: number;\n}\n\nexport const walletBalancesResponseSchema = z.object({\n balances: z.array(walletBalanceSchema),\n});\n\nexport type BalanceToken = z.infer<typeof balanceTokenSchema>;\nexport type WalletBalance = z.infer<typeof walletBalanceSchema>;\nexport type WalletBalancesResponse = z.infer<typeof walletBalancesResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GetWalletBalancesParams, WalletBalancesResponse } from \"./schemas\";\nimport { walletBalancesResponseSchema } from \"./schemas\";\n\n// GET /v1/api/wallet_balances\nexport async function getWalletBalances(\n params: GetWalletBalancesParams,\n context?: QueryFunctionContext\n): Promise<WalletBalancesResponse> {\n const { user, chain } = params;\n\n const searchParams = new URLSearchParams({\n user,\n chain: chain.toString(),\n });\n\n const endpoint = `/v1/api/wallet_balances?${searchParams.toString()}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n domain: \"earn\",\n signal: context?.signal,\n });\n\n const result = walletBalancesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse wallet balances: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getWidgetOpportunities } from \"./api\";\n\nexport const widgetQueries = createQueryKeys(\"widget\", {\n opportunities: (distributorId: string) => ({\n queryKey: [distributorId],\n queryFn: (context) => getWidgetOpportunities(distributorId, context),\n }),\n});\n","import { z } from \"zod\";\nimport { opportunitySchema } from \"../opportunities\";\n\n// Widget Opportunities Response Schema\nexport const widgetOpportunitiesResponseSchema = z.object({\n opportunities: z.array(opportunitySchema).nullable(),\n total: z.number().int(),\n});\n\nexport type WidgetOpportunitiesResponse = z.infer<typeof widgetOpportunitiesResponseSchema>;\n","import { useQuery, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport { opportunitiesQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type {\n OpportunitiesResponse,\n OpportunityFilters,\n GetOpportunitiesPaginatedInput,\n GetOpportunitiesPaginatedResponse,\n GetOpportunitiesFilterOptionsResponse,\n Opportunity,\n} from \"./schema\";\n\nexport interface UseOpportunitiesOptions extends Omit<\n UseQueryOptions<OpportunitiesResponse>,\n \"queryKey\" | \"queryFn\"\n> {\n filters?: OpportunityFilters;\n}\n\nexport function useOpportunities(options?: UseOpportunitiesOptions) {\n return useQuery({\n ...opportunitiesQueries.all,\n ...queryDefaults,\n select: (data: OpportunitiesResponse) => {\n const uniqueChainsMap = new Map(\n data.opportunities\n .map((opportunity) => opportunity.receiptToken?.chain)\n .filter((chain) => chain !== undefined)\n .map((chain) => [chain.id, chain])\n );\n\n const chains = Array.from(uniqueChainsMap.values());\n\n return {\n ...data,\n chains,\n };\n },\n });\n}\n\nexport interface UseOpportunityOptions extends Omit<\n UseQueryOptions<Opportunity>,\n \"queryKey\" | \"queryFn\"\n> {\n id: string;\n}\n\nexport function useOpportunity({ id, ...options }: UseOpportunityOptions) {\n return useQuery({\n ...opportunitiesQueries.byId(id),\n ...queryDefaults,\n select: (data: Opportunity) => {\n return {\n ...data,\n chain: data.receiptToken?.chain,\n };\n },\n });\n}\n\nexport interface UseOpportunitiesPaginatedOptions {\n params?: GetOpportunitiesPaginatedInput;\n enabled?: boolean;\n}\n\nexport function useOpportunitiesPaginated({\n params,\n enabled = true,\n}: UseOpportunitiesPaginatedOptions = {}) {\n return useQuery({\n ...opportunitiesQueries.paginated(params),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseOpportunitiesFilterOptionsOptions {\n enabled?: boolean;\n}\n\nexport function useOpportunitiesFilterOptions({\n enabled = true,\n}: UseOpportunitiesFilterOptionsOptions = {}) {\n return useQuery({\n ...opportunitiesQueries.filterOptions,\n ...queryDefaults,\n enabled,\n });\n}\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { WidgetOpportunitiesResponse } from \"./schema\";\nimport { widgetOpportunitiesResponseSchema } from \"./schema\";\n\n// GET /v1/widget/{distributorId}/opportunities\nexport async function getWidgetOpportunities(\n distributorId: string,\n context?: QueryFunctionContext\n): Promise<WidgetOpportunitiesResponse> {\n const data = await apiClient.fetch(`/widget/${distributorId}/opportunities`, {\n method: \"GET\",\n signal: context?.signal,\n });\n\n const result = widgetOpportunitiesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse widget opportunities: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getUserById, getUserPortfolio } from \"./api\";\nimport type { GetUserByIdInput, GetUserTurtlePortfolioInput } from \"./schemas\";\n\nexport const usersQueries = createQueryKeys(\"users\", {\n byId: (input: GetUserByIdInput) => ({\n queryKey: [input.userId],\n queryFn: () => getUserById(input),\n }),\n portfolio: (input: GetUserTurtlePortfolioInput) => ({\n queryKey: [\"portfolio\", input.userId],\n queryFn: () => getUserPortfolio(input),\n }),\n});\n","import { z } from \"zod\";\nimport { chainSchema } from \"../supported-chains\";\nimport { tokenSchema } from \"../supported-tokens\";\n\n// Wallet Data Schema\nconst walletDataSchema = z.object({\n address: z.string(),\n totalAmountInUSD: z.string(),\n tokens: z.array(tokenSchema),\n});\n\n// Holdings Data Schema\nconst holdingsDataSchema = z.object({\n totalAmountInUSD: z.string(),\n chains: z.array(chainSchema).nullish(),\n wallets: z.array(walletDataSchema).nullish(),\n});\n\n// User Earnings Schema\nconst userEarningsSchema = z.object({\n productId: z.string().uuid(),\n value: z.number(),\n referralsEarnings: z.number().nullish(),\n rewardName: z.string().nullish(),\n rewardType: z.string().nullish(),\n});\n\n// Portfolio Schema\nconst portfolioSchema = z.object({\n productsEarnings: z.array(userEarningsSchema),\n holdings: holdingsDataSchema.nullish(),\n});\n\n// Holding Info Schema\nconst holdingInfoSchema = z.object({\n amount: z.number(),\n usdValue: z.number(),\n token: tokenSchema.nullish(),\n});\n\n// Wallet Info Schema\nconst walletInfoSchema = z.object({\n address: z.string().nullish(),\n ecosystem: z.string().nullish(),\n isMain: z.boolean().nullish(),\n holdings: z.array(holdingInfoSchema).nullish(),\n});\n\n// User With Details Schema\nconst userWithDetailsSchema = z.object({\n id: z.string(),\n email: z.string().nullable(),\n username: z.string().nullish(),\n firstName: z.string().nullish(),\n lastName: z.string().nullish(),\n avatarUrl: z.string().nullish(),\n telegramHandle: z.string().nullish(),\n xUsername: z.string().nullish(),\n role: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n tags: z.array(z.string()).nullish(),\n wallets: z.array(walletInfoSchema).nullish(),\n});\n\n// GetUserTurtlePortfolioHandler Input Schema\nexport const getUserTurtlePortfolioInputSchema = z.object({\n userId: z.string().uuid(),\n});\n\n// GetUserTurtlePortfolioHandler Output Schema\nexport const getUserTurtlePortfolioOutputSchema = z.object({\n portfolio: portfolioSchema,\n});\n\n// Path Parameters Schema (for URL params)\nexport const getUserTurtlePortfolioPathSchema = z.object({\n userId: z.string().uuid(),\n});\n\n// GetUserByIDHandler Input Schema\nexport const getUserByIdInputSchema = z.object({\n userId: z.string().uuid(),\n});\n\n// GetUserByIDHandler Output Schema\nexport const getUserByIdOutputSchema = z.object({\n user: userWithDetailsSchema.nullable(),\n error: z.string().optional(),\n});\n\n// Type exports\nexport type GetUserByIdInput = z.infer<typeof getUserByIdInputSchema>;\nexport type GetUserByIdOutput = z.infer<typeof getUserByIdOutputSchema>;\nexport type GetUserTurtlePortfolioInput = z.infer<typeof getUserTurtlePortfolioInputSchema>;\nexport type GetUserTurtlePortfolioOutput = z.infer<typeof getUserTurtlePortfolioOutputSchema>;\nexport type UserWithDetails = z.infer<typeof userWithDetailsSchema>;\nexport type WalletData = z.infer<typeof walletDataSchema>;\nexport type HoldingsData = z.infer<typeof holdingsDataSchema>;\nexport type Portfolio = z.infer<typeof portfolioSchema>;\nexport type UserEarnings = z.infer<typeof userEarningsSchema>;\n\n// Export individual schemas if needed\nexport {\n walletDataSchema,\n holdingsDataSchema,\n userEarningsSchema,\n portfolioSchema,\n userWithDetailsSchema,\n};\n","import { apiClient } from \"../lib/api-client\";\nimport {\n GetUserByIdInput,\n GetUserByIdOutput,\n getUserByIdOutputSchema,\n GetUserTurtlePortfolioInput,\n GetUserTurtlePortfolioOutput,\n getUserTurtlePortfolioOutputSchema,\n} from \"./schemas\";\n\n// GET /admin/users/:userId\nexport async function getUserById(input: GetUserByIdInput): Promise<GetUserByIdOutput> {\n console.log(\"input\", input);\n const endpoint = `/admin/users/${input.userId}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = getUserByIdOutputSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse user: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /admin/users/:userId/portfolio\nexport async function getUserPortfolio(\n input: GetUserTurtlePortfolioInput\n): Promise<GetUserTurtlePortfolioOutput> {\n const endpoint = `/admin/users/${input.userId}/portfolio`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = getUserTurtlePortfolioOutputSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse user portfolio: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { fetchUserNfts } from \"./api\";\n\nexport const nftsQueries = createQueryKeys(\"nfts\", {\n byUser: (userAddress: string, chain: number) => ({\n queryKey: [userAddress, chain],\n queryFn: () => fetchUserNfts(userAddress, chain),\n }),\n});\n\n","import type { UserNft } from \"./schema\";\n\n\nconst LUMON_API_BASE_URL = \"https://lumon.turtle.xyz\";\n\nexport async function fetchUserNfts(userAddress: string, chain: number): Promise<UserNft[]> {\n const endpoint = `${LUMON_API_BASE_URL}/query/token/erc721_portfolio`;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n user: userAddress,\n chain,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch user NFTs\");\n }\n\n return response.json();\n}\n\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { checkCoverRequest } from \"./api\";\n\nexport const coversQueries = createQueryKeys(\"covers\", {\n check: (protocolName: string) => ({\n queryKey: [{ protocolName }],\n queryFn: () => checkCoverRequest({ protocolName }),\n }),\n});\n","import { z } from \"zod\";\n\nexport const coverRequestDataSchema = z.object({\n protocolName: z.string(),\n coverageAmount: z.string(),\n periodDays: z.number(),\n desiredApySacrifice: z.string(),\n calculatedEstimatedPremium: z.string(),\n tokenSymbol: z.string(),\n});\n\n\nexport const submitCoverRequestResponseSchema = z.object({\n success: z.boolean(),\n});\n\n\nexport const checkCoverRequestResponseSchema = z.object({\n canSubmit: z.boolean(),\n existingRequest: coverRequestDataSchema.nullable(),\n});\n\nexport type CoverRequestData = z.infer<typeof coverRequestDataSchema>;\nexport type SubmitCoverRequestResponse = z.infer<typeof submitCoverRequestResponseSchema>;\nexport type CheckCoverRequestResponse = z.infer<typeof checkCoverRequestResponseSchema>;\n\n// --- Nexus Cover Purchase Tracking ---\n\nexport const submitCoverPurchaseDataSchema = z.object({\n walletAddress: z.string().regex(/^0x[a-fA-F0-9]{40}$/, \"Invalid Ethereum address\"),\n txHash: z.string().regex(/^0x[a-fA-F0-9]{64}$/, \"Invalid transaction hash\"),\n});\n\nexport const submitCoverPurchaseResponseSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n id: z.string(),\n});\n\nexport type SubmitCoverPurchaseData = z.infer<typeof submitCoverPurchaseDataSchema>;\nexport type SubmitCoverPurchaseResponse = z.infer<typeof submitCoverPurchaseResponseSchema>;\n\n","import { apiClient } from \"../lib/api-client\";\nimport type { CoverRequestData, SubmitCoverRequestResponse, CheckCoverRequestResponse, SubmitCoverPurchaseData, SubmitCoverPurchaseResponse } from \"./schema\";\nimport { submitCoverRequestResponseSchema, checkCoverRequestResponseSchema, submitCoverPurchaseResponseSchema } from \"./schema\";\n\n// POST /turtle/nexus-cover-requests\nexport async function submitCoverRequest(\n data: CoverRequestData\n): Promise<SubmitCoverRequestResponse> {\n const response = await apiClient.fetch(\"/turtle/nexus-cover-requests\", {\n method: \"POST\",\n body: data,\n });\n\n const result = submitCoverRequestResponseSchema.safeParse(response);\n\n if (!result.success) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to submit cover request due to an invalid server response.`);\n }\n\n return result.data;\n}\n\n// POST /turtle/nexus-cover-purchases\nexport async function submitCoverPurchase(\n data: SubmitCoverPurchaseData\n): Promise<SubmitCoverPurchaseResponse> {\n const response = await apiClient.fetch(\"/turtle/nexus-cover-purchases\", {\n method: \"POST\",\n body: data,\n });\n\n const result = submitCoverPurchaseResponseSchema.safeParse(response);\n\n if (!result.success) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(\"Failed to submit cover purchase tracking due to an invalid server response.\");\n }\n\n return result.data;\n}\n\n// GET /turtle/nexus-cover-requests?protocolName=X\nexport async function checkCoverRequest({\n protocolName,\n}: {\n protocolName: string;\n}): Promise<CheckCoverRequestResponse> {\n const params = new URLSearchParams();\n params.append(\"protocolName\", protocolName);\n\n const response = await apiClient.fetch(\n `/turtle/nexus-cover-requests?${params.toString()}`,\n { method: \"GET\" }\n );\n\n const result = checkCoverRequestResponseSchema.safeParse(response);\n\n if (!result.success) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(\"Failed to check cover request due to an invalid server response.\");\n }\n\n return result.data;\n}\n\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getPortfolioBalance } from \"./api\";\n\nexport const balanceQueries = createQueryKeys(\"balance\", {\n // Portfolio balance by address\n portfolio: (address: string) => ({\n queryKey: [address],\n queryFn: () => getPortfolioBalance(address),\n }),\n});\n","import { z } from \"zod\";\nimport { chainSchema } from \"../supported-chains\";\n\n/**\n * Portfolio API schemas for /wallet/{address}/balance endpoint\n */\n\n// Portfolio API returns a subset of Token fields with some optional\nexport const portfolioTokenSchema = z.object({\n id: z.string(),\n address: z.string(),\n name: z.string(),\n symbol: z.string(),\n decimals: z.number(),\n isNative: z.boolean(),\n logoUrl: z.string().nullable(),\n amount: z.string(), // Portfolio-specific field (decimal format)\n rawAmount: z.string(),\n price: z\n .string()\n .nullable()\n .transform((val) => (val ? parseFloat(val) : null)), // Portfolio-specific field\n // Chain with optional fields to match Portfolio API response\n chain: chainSchema.partial().required({ chainId: true }),\n});\n\nexport type PortfolioToken = z.infer<typeof portfolioTokenSchema>;\n\nexport const portfolioWalletSchema = z.object({\n id: z.string().optional(),\n address: z.string(),\n blockchain: z.string().optional(),\n tokens: z.array(portfolioTokenSchema),\n});\n\nexport type PortfolioWallet = z.infer<typeof portfolioWalletSchema>;\n\nexport const portfolioHoldingsSchema = z.object({\n wallets: z.array(portfolioWalletSchema),\n});\n\nexport type PortfolioHoldings = z.infer<typeof portfolioHoldingsSchema>;\n\nexport const portfolioBalanceResponseSchema = z.object({\n portfolio: z.object({\n holdings: portfolioHoldingsSchema,\n }),\n});\n\nexport type PortfolioBalanceResponse = z.infer<typeof portfolioBalanceResponseSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport type { PortfolioBalanceResponse } from \"./schema\";\nimport { portfolioBalanceResponseSchema } from \"./schema\";\n\nexport async function getPortfolioBalance(\n address: string,\n options?: { debug?: boolean }\n): Promise<PortfolioBalanceResponse> {\n const data = await apiClient.fetch(`/wallet/${address}/balance`, {\n method: \"GET\",\n domain: \"api\",\n debug: options?.debug,\n });\n\n // Validate response with Zod\n const result = portfolioBalanceResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse portfolio balance: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getDeposits } from \"./api\";\nimport type { GetDepositsRequest } from \"./schemas\";\n\nexport const depositsQueries = createQueryKeys(\"deposits\", {\n list: (filters: GetDepositsRequest) => ({\n queryKey: [{ filters }],\n queryFn: () => getDeposits(filters),\n }),\n});\n","import { z } from \"zod\";\nimport { paginationMetadataSchema } from \"../schemas/pagination\";\n\n// UUID validation schema\nconst uuidSchema = z.string().uuid();\n\n// Enum schemas for validation\nconst sortBySchema = z.enum([\"date\", \"usd_value\"]).optional();\nconst sortOrderSchema = z.enum([\"asc\", \"desc\"]).optional();\n\n// Request schema for GetDepositsHandler\nexport const getDepositsRequestSchema = z\n .object({\n // Filter by product or opportunity (optional, not mutually exclusive)\n product_id: z.string().uuid().optional(),\n opportunity_id: z.string().uuid().optional(),\n\n // Search query\n search: z.string().optional(),\n\n // Sorting options\n sort_by: sortBySchema,\n sort_order: sortOrderSchema,\n\n // Additional filters\n distributor_id: z.string().optional(),\n depositor_address: z.string().optional(),\n referral: z.string().optional(),\n\n // Pagination\n page: z.number().int().min(1).optional().default(1),\n page_limit: z.number().int().min(1).max(100).optional().default(20),\n })\n .refine(\n (data) => {\n // Exactly one of product_id or opportunity_id must be provided\n const hasProductId = !!data.product_id;\n const hasOpportunityId = !!data.opportunity_id;\n return hasProductId !== hasOpportunityId; // XOR logic\n },\n {\n message: \"Either product_id or opportunity_id must be provided (but not both)\",\n path: [\"product_id\", \"opportunity_id\"],\n }\n );\n\n// Individual deposit response schema\nexport const depositResponseSchema = z.object({\n id: uuidSchema,\n opportunityId: uuidSchema,\n walletId: uuidSchema.nullable().optional(),\n crmWalletId: uuidSchema.nullable().optional(),\n depositorAddress: z.string(),\n amount: z.number(),\n usdValue: z.number(),\n depositTimestamp: z.string().datetime(), // ISO 8601 format\n txHash: z.string(),\n verified: z.boolean().nullable().optional(),\n distributorId: z.string().nullable().optional(),\n referral: z.string().nullable().optional(),\n explorerUrl: z.string().url().nullable().optional(),\n createdAt: z.string().datetime(), // ISO 8601 format\n updatedAt: z.string().datetime(), // ISO 8601 format\n});\n\nexport const depositsMetadataSchema = z.object({\n totalUsdValue: z.number().int().min(0),\n});\n\n// Response schema for GetDepositsHandler\nexport const getDepositsResponseSchema = z.object({\n deposits: z.array(depositResponseSchema),\n pagination: paginationMetadataSchema.partial(),\n metadata: depositsMetadataSchema,\n});\n\n// Type exports for TypeScript\nexport type GetDepositsRequest = z.infer<typeof getDepositsRequestSchema>;\nexport type DepositResponse = z.infer<typeof depositResponseSchema>;\nexport type GetDepositsResponse = z.infer<typeof getDepositsResponseSchema>;\n\n// Validation functions\nexport const validateGetDepositsRequest = (data: unknown): GetDepositsRequest => {\n return getDepositsRequestSchema.parse(data);\n};\n\nexport const validateGetDepositsResponse = (data: unknown): GetDepositsResponse => {\n return getDepositsResponseSchema.parse(data);\n};\n\n// Helper function to validate query parameters from URL\nexport const validateGetDepositsQuery = (\n queryParams: Record<string, string | string[]>\n): GetDepositsRequest => {\n // Convert string values to appropriate types\n const processedParams = {\n product_id: queryParams.product_id as string,\n opportunity_id: queryParams.opportunity_id as string,\n search: queryParams.search as string,\n sort_by: queryParams.sort_by as string,\n sort_order: queryParams.sort_order as string,\n distributor_id: queryParams.distributor_id as string,\n depositor_address: queryParams.depositor_address as string,\n referral: queryParams.referral as string,\n page: queryParams.page ? parseInt(queryParams.page as string) : undefined,\n page_limit: queryParams.page_limit ? parseInt(queryParams.page_limit as string) : undefined,\n };\n\n return getDepositsRequestSchema.parse(processedParams);\n};\n","import { apiClient } from \"../lib/api-client\";\nimport type { GetDepositsRequest, GetDepositsResponse } from \"./schemas\";\nimport { getDepositsResponseSchema } from \"./schemas\";\n\n// GET /turtle/deposits\nexport async function getDeposits(filters: GetDepositsRequest): Promise<GetDepositsResponse> {\n const params = new URLSearchParams();\n\n // Filter by product or opportunity\n if (filters.product_id) params.append(\"product_id\", filters.product_id);\n if (filters.opportunity_id) params.append(\"opportunity_id\", filters.opportunity_id);\n\n // Search query\n if (filters.search) params.append(\"search\", filters.search);\n\n // Sorting options\n if (filters.sort_by) params.append(\"sort_by\", filters.sort_by);\n if (filters.sort_order) params.append(\"sort_order\", filters.sort_order);\n\n // Additional filters\n if (filters.distributor_id) params.append(\"distributor_id\", filters.distributor_id);\n if (filters.depositor_address) params.append(\"depositor_address\", filters.depositor_address);\n if (filters.referral) params.append(\"referral\", filters.referral);\n\n // Pagination\n if (filters.page) params.append(\"page\", filters.page.toString());\n if (filters.page_limit) params.append(\"page_limit\", filters.page_limit.toString());\n\n const queryString = params.toString();\n const endpoint = `/turtle/deposits${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = getDepositsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse deposits: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from '@lukemorales/query-key-factory'\nimport { getIncentive, getIncentives } from './api'\n\nexport const incentivesQueries = createQueryKeys('incentives', {\n // Get all incentives (no filters)\n all: {\n queryKey: null,\n queryFn: () => getIncentives(),\n },\n\n byId: (id: string) => ({\n queryKey: [id],\n queryFn: () => getIncentive(id),\n }),\n})\n","import { apiClient } from \"../lib/api-client\";\nimport {\n CreateIncentiveInput,\n IncentiveResponse,\n incentiveSchema,\n IncentivesResponse,\n incentivesResponseSchema,\n UpdateIncentiveInput,\n UploadIncentiveIconRequest,\n UploadIncentiveIconResponse,\n uploadIncentiveIconResponseSchema,\n} from \"./schema\";\n\n// GET /turtle/incentives\nexport async function getIncentives(): Promise<IncentivesResponse> {\n const params = new URLSearchParams();\n\n const queryString = params.toString();\n const endpoint = `/turtle/incentives${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = incentivesResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse incentives: ${result.error.message}`);\n }\n return result.data;\n}\n\n// GET /admin/incentives/:id\nexport async function getIncentive(id: string): Promise<IncentiveResponse> {\n const endpoint = `/admin/incentives/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse incentive: ${result.error.message}`);\n }\n return result.data;\n}\n\n// POST /admin/incentives\nexport async function createIncentive(input: CreateIncentiveInput): Promise<IncentiveResponse> {\n const endpoint = `/admin/incentives`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: JSON.stringify(input),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to create incentive: ${result.error.message}`);\n }\n return result.data;\n}\n\n// PUT /admin/incentives/:id\nexport async function updateIncentive(input: UpdateIncentiveInput): Promise<IncentiveResponse> {\n const endpoint = `/admin/incentives/${input.id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"PUT\",\n body: JSON.stringify({ incentive: input }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to update incentive: ${result.error.message}`);\n }\n return result.data;\n}\n\n// DELETE /admin/incentives/:id\nexport async function deleteIncentive(id: string): Promise<void> {\n const endpoint = `/admin/incentives/${id}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n // Validate response with Zod\n const result = incentiveSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to delete incentive: ${result.error.message}`);\n }\n}\n\n// POST /admin/incentives/upload\nexport async function uploadIncentiveIcon({\n file,\n filename,\n overwrite,\n}: UploadIncentiveIconRequest): Promise<UploadIncentiveIconResponse> {\n // Hitting same as products, cause handler is missing\n const endpoint = `/admin/products/upload-logo`;\n\n const formData = new FormData();\n formData.append(\"file\", file as File, filename || file.name);\n\n if (overwrite) {\n formData.append(\"overwrite\", \"true\");\n }\n\n if (filename) {\n formData.append(\"filename\", filename);\n }\n\n const data = await apiClient.fetch(endpoint, {\n method: \"POST\",\n body: formData,\n // Don't set Content-Type header - let the browser set it with boundary for multipart/form-data\n });\n\n // Validate response with Zod\n const result = uploadIncentiveIconResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to upload incentive icon: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from '@lukemorales/query-key-factory'\nimport { getLiquidityProviders } from './api'\nimport type { GetLiquidityProvidersInput } from './schema'\n\nexport const liquidityProvidersQueries = createQueryKeys(\n 'liquidityProviders',\n {\n // Get liquidity providers with filters\n list: (input: GetLiquidityProvidersInput) => ({\n queryKey: [{ input }],\n queryFn: () => getLiquidityProviders(input),\n }),\n }\n)\n","import { z } from \"zod\";\nimport { paginationMetadataSchema } from \"../schemas/pagination\";\n\n// Enum schemas for validation\nconst sortBySchema = z\n .enum([\"username\", \"telegram\", \"total_tvl\", \"active_tvl\", \"first_deposit\", \"wallet_count\"])\n .optional();\n\nconst sortOrderSchema = z.enum([\"asc\", \"desc\"]).optional();\n\n// Request schema for GetLiquidityProvidersInput\nexport const getLiquidityProvidersInputSchema = z.object({\n organizationId: z.string().uuid().optional(),\n productId: z.string().uuid().optional(),\n opportunityId: z.string().uuid().optional(),\n sortBy: sortBySchema,\n sortOrder: sortOrderSchema,\n limit: z.number().int().min(1).max(100).optional().default(20),\n offset: z.number().int().min(0).optional().default(0),\n});\n\n// Liquidity Provider schema - matches Go LiquidityProvider struct\nexport const liquidityProviderSchema = z.object({\n username: z.string(),\n totalTvl: z.number(),\n activeTvl: z.number(),\n opportunities: z.array(z.string().uuid()),\n telegram: z.string(),\n firstDeposit: z.string().datetime(), // ISO 8601 format (time.Time in Go)\n walletCount: z.number().int(),\n});\n\n// Response schema for GetLiquidityProvidersResponse\nexport const GetLiquidityProvidersResponseSchema = z.object({\n liquidityProviders: z.array(liquidityProviderSchema),\n pagination: paginationMetadataSchema,\n});\n\n// Type exports for TypeScript\nexport type GetLiquidityProvidersInput = z.infer<typeof getLiquidityProvidersInputSchema>;\nexport type LiquidityProvider = z.infer<typeof liquidityProviderSchema>;\nexport type GetLiquidityProvidersResponse = z.infer<typeof GetLiquidityProvidersResponseSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport type { GetLiquidityProvidersInput, GetLiquidityProvidersResponse } from \"./schema\";\nimport { GetLiquidityProvidersResponseSchema } from \"./schema\";\n\n// GET /deposits/liquidity-providers\nexport async function getLiquidityProviders(\n input: GetLiquidityProvidersInput\n): Promise<GetLiquidityProvidersResponse> {\n const params = new URLSearchParams();\n\n // Filter by organization, product, or opportunity\n if (input.organizationId) params.append(\"organization_id\", input.organizationId);\n if (input.productId) params.append(\"product_id\", input.productId);\n if (input.opportunityId) params.append(\"opportunity_id\", input.opportunityId);\n\n // Sorting options\n if (input.sortBy) params.append(\"sort_by\", input.sortBy);\n if (input.sortOrder) params.append(\"sort_order\", input.sortOrder);\n\n // Pagination\n if (input.limit !== undefined) params.append(\"limit\", input.limit.toString());\n if (input.offset !== undefined) params.append(\"offset\", input.offset.toString());\n\n const queryString = params.toString();\n const endpoint = `/admin/deposits/liquidity-providers${queryString ? `?${queryString}` : \"\"}`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n });\n\n // Validate response with Zod\n const result = GetLiquidityProvidersResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse liquidity providers: ${result.error.message}`);\n }\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getGeocheck } from \"./api\";\n\nexport const geocheckQueries = createQueryKeys(\"geocheck\", {\n check: {\n queryKey: null,\n queryFn: (context) => getGeocheck(context),\n },\n});\n","import { z } from \"zod\";\n\n// GeoCheck Response Schema\nexport const geoCheckResponseSchema = z.object({\n canInteract: z.boolean(),\n});\n\n// Type exports for TypeScript\nexport type GeoCheckResponse = z.infer<typeof geoCheckResponseSchema>;\n","import type { QueryFunctionContext } from \"@tanstack/react-query\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GeoCheckResponse } from \"./schema\";\nimport { geoCheckResponseSchema } from \"./schema\";\n\n// GET /turtle/geocheck\nexport async function getGeocheck(\n context?: QueryFunctionContext\n): Promise<GeoCheckResponse> {\n const endpoint = `/turtle/geocheck`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"GET\",\n signal: context?.signal,\n });\n\n const result = geoCheckResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse geocheck: ${result.error.message}`);\n }\n\n return result.data;\n}\n","import { createQueryKeys } from \"@lukemorales/query-key-factory\";\nimport { getOrgLeaderboard, getOrgUserLeaderboard } from \"./api\";\nimport type { GetOrgLeaderboardParams } from \"./schema\";\n\nexport const orgLeaderboardQueries = createQueryKeys(\"orgLeaderboard\", {\n list: (orgId: string, params?: GetOrgLeaderboardParams) => ({\n queryKey: [orgId, params],\n queryFn: ({ signal }) => getOrgLeaderboard(orgId, params, { signal }),\n }),\n user: (orgId: string, userId: string) => ({\n queryKey: [orgId, userId],\n queryFn: ({ signal }) => getOrgUserLeaderboard(orgId, userId, { signal }),\n }),\n});\n","import { z } from \"zod\";\n\n// API sortBy values (matches backend)\nexport const orgLeaderboardSortBySchema = z.enum([\n \"rank\",\n \"points\",\n \"username\",\n \"referredValue\",\n \"userTvl\",\n \"dailyPoints\",\n]);\nexport type OrgLeaderboardSortBy = z.infer<typeof orgLeaderboardSortBySchema>;\n\nexport const orgLeaderboardSortOrderSchema = z.enum([\"asc\", \"desc\"]);\nexport type OrgLeaderboardSortOrder = z.infer<typeof orgLeaderboardSortOrderSchema>;\n\n// GET /turtle/leaderboard/organization/:orgId – query params\nexport const getOrgLeaderboardParamsSchema = z.object({\n limit: z.number().int().min(1).max(100).optional().default(20),\n offset: z.number().int().min(0).optional().default(0),\n searchUsername: z.string().optional(),\n onlyWithReferral: z.boolean().optional(),\n minTotalPoints: z.number().optional(),\n maxTotalPoints: z.number().optional(),\n sortBy: orgLeaderboardSortBySchema.optional(),\n sortOrder: orgLeaderboardSortOrderSchema.optional(),\n date: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(), // YYYY-MM-DD for historical daily points\n});\nexport type GetOrgLeaderboardParams = z.infer<typeof getOrgLeaderboardParamsSchema>;\n\n// Row shape (list response)\nexport const orgLeaderboardRowSchema = z.object({\n rank: z.number(),\n userId: z.string(),\n turtleUser: z\n .object({\n username: z.string().optional(),\n avatarUrl: z.string().optional(),\n })\n .optional(),\n totalPoints: z.number(),\n userTvl: z.number(),\n dailyPoints: z.number(),\n referredValue: z.number(),\n});\nexport type OrgLeaderboardRow = z.infer<typeof orgLeaderboardRowSchema>;\n\n// List response\nexport const orgLeaderboardResponseSchema = z.object({\n rows: z.array(orgLeaderboardRowSchema),\n total: z.number().optional(),\n totalPages: z.number().optional(),\n});\nexport type OrgLeaderboardResponse = z.infer<typeof orgLeaderboardResponseSchema>;\n\n// GET /turtle/leaderboard/organization/:orgId/user/:userId – response\nexport const orgUserLeaderboardInfoSchema = z.object({\n userId: z.string(),\n username: z.string().optional(),\n rank: z.number(),\n totalUsers: z.number(),\n totalPoints: z.number(),\n userTvl: z.number(),\n dailyPoints: z.number(),\n referredValue: z.number(),\n referralBoostApplied: z.number().optional(),\n});\nexport type OrgUserLeaderboardInfo = z.infer<typeof orgUserLeaderboardInfoSchema>;\n\nexport const orgUserLeaderboardResponseSchema = z.object({\n userInfo: orgUserLeaderboardInfoSchema.optional(),\n});\nexport type OrgUserLeaderboardResponse = z.infer<typeof orgUserLeaderboardResponseSchema>;\n\n// —— White-label config (consumed by org-leaderboard UI package) ——\n\n/** Column id for table/banner. \"username\" is derived from turtleUser in the row. */\nexport type OrgLeaderboardColumnId =\n | keyof OrgLeaderboardRow\n | \"username\";\n\nexport interface OrgLeaderboardColumnConfig {\n id: OrgLeaderboardColumnId;\n label: string;\n showInTable?: boolean;\n showInUserBanner?: boolean;\n}\n\nexport interface OrgLeaderboardConfig {\n orgId: string;\n slug: string;\n name: string;\n logoFallbackUrl?: string;\n productId?: string;\n pointsLabel?: string;\n rewardPoolDescription?: string;\n /** Optional divisor for points (e.g. 1e18 for Nunchi cHIPs). Applied when rendering totalPoints, dailyPoints, referredValue. */\n pointsDivisor?: number;\n columns: OrgLeaderboardColumnConfig[];\n /** Column ids to exclude from mobile grid/card layout (e.g. [\"rank\", \"userTvl\", \"referredValue\"] for Kintsu). */\n mobileGridExcludeColumns?: string[];\n /** Total points column header on desktop (e.g. \"Points\"). */\n pointsColumnLabelDesktop?: string;\n /** Total points column header on mobile (e.g. \"Total Kintsu Points\"). */\n pointsColumnLabelMobile?: string;\n}\n","import { apiClient } from \"../lib/api-client\";\nimport type {\n GetOrgLeaderboardParams,\n OrgLeaderboardResponse,\n OrgUserLeaderboardResponse,\n} from \"./schema\";\nimport {\n orgLeaderboardResponseSchema,\n orgUserLeaderboardResponseSchema,\n} from \"./schema\";\n\n/**\n * GET /turtle/leaderboard/organization/:orgId\n * Paginated, sortable, filterable org leaderboard list.\n */\nexport async function getOrgLeaderboard(\n orgId: string,\n params?: GetOrgLeaderboardParams,\n options?: { signal?: AbortSignal }\n): Promise<OrgLeaderboardResponse> {\n const searchParams = new URLSearchParams();\n if (params?.limit !== undefined) searchParams.set(\"limit\", String(params.limit));\n if (params?.offset !== undefined) searchParams.set(\"offset\", String(params.offset));\n if (params?.searchUsername) searchParams.set(\"searchUsername\", params.searchUsername);\n if (params?.onlyWithReferral !== undefined)\n searchParams.set(\"onlyWithReferral\", String(params.onlyWithReferral));\n if (params?.minTotalPoints !== undefined)\n searchParams.set(\"minTotalPoints\", String(params.minTotalPoints));\n if (params?.maxTotalPoints !== undefined)\n searchParams.set(\"maxTotalPoints\", String(params.maxTotalPoints));\n if (params?.sortBy) searchParams.set(\"sortBy\", params.sortBy);\n if (params?.sortOrder) searchParams.set(\"sortOrder\", params.sortOrder);\n if (params?.date) searchParams.set(\"date\", params.date);\n\n const query = searchParams.toString();\n const endpoint = `/turtle/leaderboard/organization/${orgId}${query ? `?${query}` : \"\"}`;\n\n const data = await apiClient.fetch<unknown>(endpoint, {\n method: \"GET\",\n signal: options?.signal,\n });\n\n const result = orgLeaderboardResponseSchema.safeParse(data);\n if (!result.success) {\n console.error(\"[org-leaderboard] list parse error\", result.error);\n throw new Error(`Failed to parse org leaderboard response: ${result.error.message}`);\n }\n return result.data;\n}\n\n/**\n * GET /turtle/leaderboard/organization/:orgId/user/:userId\n * User rank/stats for the \"your stats\" banner.\n */\nexport async function getOrgUserLeaderboard(\n orgId: string,\n userId: string,\n options?: { signal?: AbortSignal }\n): Promise<OrgUserLeaderboardResponse> {\n const endpoint = `/turtle/leaderboard/organization/${orgId}/user/${userId}`;\n const data = await apiClient.fetch<unknown>(endpoint, {\n method: \"GET\",\n signal: options?.signal,\n });\n\n const result = orgUserLeaderboardResponseSchema.safeParse(data);\n if (!result.success) {\n console.error(\"[org-leaderboard] user parse error\", result.error);\n throw new Error(`Failed to parse org user leaderboard response: ${result.error.message}`);\n }\n return result.data;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { earnOpportunitiesQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\n\nexport function useEarnOpportunities() {\n return useQuery({\n ...earnOpportunitiesQueries.all,\n ...queryDefaults,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { earnRouteQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { EarnRouteParams } from \"./schema\";\n\nexport interface UseEarnRouteOptions {\n params?: EarnRouteParams;\n enabled?: boolean;\n}\n\nexport function useEarnRoute({ params, enabled = true }: UseEarnRouteOptions) {\n return useQuery({\n // Null assertion is safe because the query is enable only if params is provided\n ...earnRouteQueries.byParams(params!),\n ...queryDefaults,\n enabled: !!params && enabled,\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { earnMembershipQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport { createMembershipAgreement, createMembership } from \"./api\";\nimport type {\n CheckMembershipParams,\n CreateAgreementRequest,\n CreateMembershipRequest,\n} from \"./schema\";\n\n// Query hook for checking membership\nexport interface UseCheckMembershipOptions {\n params: CheckMembershipParams;\n enabled?: boolean;\n}\n\nexport function useCheckMembership({\n params,\n enabled = true,\n}: UseCheckMembershipOptions) {\n return useQuery({\n ...earnMembershipQueries.check(params),\n ...queryDefaults,\n enabled,\n });\n}\n\n// Mutation hook for creating membership agreement\nexport function useCreateMembershipAgreement() {\n return useMutation({\n mutationFn: (request: CreateAgreementRequest) =>\n createMembershipAgreement(request),\n });\n}\n\n// Mutation hook for creating membership\nexport function useCreateMembership() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (request: CreateMembershipRequest) => createMembership(request),\n onSuccess: (data, variables) => {\n queryClient.invalidateQueries({\n queryKey: earnMembershipQueries.check({\n address: variables.address,\n walletEcosystem: variables.walletEcosystem as \"evm\" | \"solana\" | \"ton\",\n }).queryKey,\n });\n },\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { earnDepositsQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetDepositsParams } from \"./schema\";\n\nexport interface UseDepositsOptions {\n params: GetDepositsParams;\n enabled?: boolean;\n}\n\nexport function useDeposits({ params, enabled = true }: UseDepositsOptions) {\n return useQuery({\n ...earnDepositsQueries.byParams(params),\n ...queryDefaults,\n enabled,\n });\n}\n\n// Re-export validation hook\nexport {\n useDepositValidation,\n type UseDepositValidationOptions,\n type DepositValidationResult,\n} from \"./hooks/useDepositValidation\";\n\n// Re-export selection hook\nexport {\n useDepositSelection,\n type UseDepositSelectionOptions,\n type UseDepositSelectionReturn,\n} from \"./hooks/useDepositSelection\";\n\n// Re-export flow orchestrator hook\nexport {\n useDepositFlow,\n type UseDepositFlowOptions,\n type UseDepositFlowReturn,\n} from \"./hooks/useDepositFlow\";\n\n// Re-export actions default params hook\nexport {\n useActionsDefaultParams,\n type UseActionsDefaultParamsOptions,\n type UseActionsDefaultParamsReturn,\n} from \"./hooks/useActionsDefaultParams\";\n\n// Re-export deposit mode utilities\nexport {\n getDepositModeFlags,\n resolveEffectiveDepositMode,\n type DepositMode,\n type DepositModeFlags,\n} from \"./hooks/utils\";\n","import { useMemo } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport { formatUnits } from \"viem\";\nimport { Opportunity } from \"../../opportunities\";\nimport { getDepositModeFlags } from \"./utils\";\n\nexport interface UseDepositValidationOptions {\n opportunity: Opportunity | null;\n selectedTokenBalance: TokenBalance | null;\n amountBigInt: bigint | undefined;\n isPending?: boolean;\n isConfirming?: boolean;\n /** Current wallet chain ID */\n walletChainId?: number;\n}\n\nexport interface DepositValidationResult {\n // Main validation state\n canDeposit: boolean;\n\n // Individual validations\n isBelowMinimum: boolean;\n isAboveMaximum: boolean;\n hasInsufficientBalance: boolean;\n isDepositDisabled: boolean;\n isZeroAmount: boolean;\n isNoTokenSelected: boolean;\n isVaultFull: boolean;\n\n // Validation limits\n minDepositUSD: number;\n maxDepositUSD: number | null;\n depositCapUSD: number | null;\n depositCapPercentFilled: number | null;\n depositDisabledReason: string | null;\n\n // Fee information\n depositFee: number | null;\n performanceFee: number | null;\n managementFee: number | null;\n withdrawalFee: number | null;\n\n // Timing information\n withdrawalCooldownSecs: number | null;\n\n // Computed values\n inputAmountUSD: number | null;\n balanceUSD: number | null;\n\n // Vault config flags\n hasAsyncDeposit: boolean;\n isSecondaryOnly: boolean;\n\n // Chain validation\n isWrongChain: boolean;\n requiredChainId: number | null;\n\n // Button state\n buttonText: string;\n validationMessage: string | null;\n}\n\n/**\n * Calculates the USD value for a given amount and token\n */\nfunction calculateUsdValue(amount: bigint, token: TokenBalance[\"token\"]): number | null {\n if (!token.priceUsd) return null;\n const formatted = parseFloat(formatUnits(amount, token.decimals));\n return formatted * token.priceUsd;\n}\n\n/**\n * Hook for deposit validation logic\n * Consolidates all validation checks for deposit operations\n */\nexport function useDepositValidation({\n opportunity,\n selectedTokenBalance,\n amountBigInt,\n isPending = false,\n isConfirming = false,\n walletChainId,\n}: UseDepositValidationOptions): DepositValidationResult {\n return useMemo(() => {\n if (!opportunity) {\n return {\n canDeposit: false,\n isBelowMinimum: false,\n isAboveMaximum: false,\n hasInsufficientBalance: false,\n isDepositDisabled: false,\n isZeroAmount: true,\n isNoTokenSelected: true,\n isVaultFull: false,\n minDepositUSD: 0,\n maxDepositUSD: null,\n depositCapUSD: null,\n depositCapPercentFilled: null,\n depositDisabledReason: null,\n depositFee: null,\n performanceFee: null,\n managementFee: null,\n withdrawalFee: null,\n withdrawalCooldownSecs: null,\n inputAmountUSD: null,\n balanceUSD: null,\n hasAsyncDeposit: false,\n isSecondaryOnly: false,\n isWrongChain: false,\n requiredChainId: null,\n buttonText: \"Select opportunity\",\n validationMessage: \"Please select an opportunity\",\n };\n }\n\n const vaultConfig = opportunity.vaultConfig;\n const { noModesEnabled } = getDepositModeFlags(opportunity);\n const depositDisabled = (opportunity.depositDisabled ?? false) || noModesEnabled;\n const depositDisabledReason = opportunity.depositDisabledReason || null;\n\n const depositFee = vaultConfig?.depositFee ?? null;\n const performanceFee = vaultConfig?.performanceFee ?? null;\n const managementFee = vaultConfig?.managementFee ?? null;\n const withdrawalFee = vaultConfig?.withdrawalFee ?? null;\n const withdrawalCooldownSecs = vaultConfig?.withdrawalCooldownSecs ?? null;\n\n const hasAsyncDeposit = vaultConfig?.asyncDeposit === true;\n const isSecondaryOnly = vaultConfig?.secondaryOnly === true;\n\n // Chain validation\n const requiredChainId = Number(opportunity.receiptToken.chain.chainId);\n const isWrongChain = walletChainId !== undefined && walletChainId !== requiredChainId;\n\n const isNoTokenSelected = !selectedTokenBalance;\n const isZeroAmount = !amountBigInt || amountBigInt <= 0n;\n\n // Price of the selected token (for input amount USD calculation)\n const selectedTokenPrice = selectedTokenBalance?.token.priceUsd ?? null;\n\n // Price of the primary deposit token (for min/max deposit validation)\n // minDepositAmount is expressed in units of the primary depositToken, not the selected token\n const primaryDepositToken = opportunity.depositTokens?.[0];\n const primaryDepositTokenPrice = primaryDepositToken?.priceUsd ?? null;\n\n let inputAmountUSD: number | null = null;\n let balanceUSD: number | null = null;\n\n if (selectedTokenBalance && amountBigInt) {\n inputAmountUSD = calculateUsdValue(amountBigInt, selectedTokenBalance.token);\n }\n\n if (selectedTokenBalance) {\n const balanceAmount = BigInt(selectedTokenBalance.amount);\n balanceUSD = calculateUsdValue(balanceAmount, selectedTokenBalance.token);\n }\n\n // Calculate minDepositUSD using the primary deposit token price\n // minDepositAmount is expressed in the primary deposit token's units\n const minDepositAmount = vaultConfig?.minDepositAmount ?? 0;\n const minDepositValueUSD = vaultConfig?.minDepositValueUSD ?? 0;\n const minDepositUSD = Math.max(\n minDepositAmount * (primaryDepositTokenPrice ?? 0),\n minDepositValueUSD\n );\n\n // Calculate maxDepositUSD (deposit cap) - prioritize USD value from vaultConfig\n const depositCapAmount = vaultConfig?.depositCapAmount;\n // depositCapValueUSD is the authoritative source for deposit cap in USD\n const depositCapValueUSD = vaultConfig?.depositCapValueUSD;\n\n // Calculate the cap in USD - prioritize USD value, fallback to amount * price\n const depositCapUSD =\n depositCapValueUSD ??\n (depositCapAmount && primaryDepositTokenPrice\n ? depositCapAmount * primaryDepositTokenPrice\n : null);\n\n // maxDepositUSD is used for per-deposit validation\n const maxDepositUSD = depositCapUSD;\n\n // Calculate vault fullness\n const tvl = opportunity.tvl ?? 0;\n const isVaultFull = depositCapUSD !== null && tvl >= depositCapUSD;\n const depositCapPercentFilled =\n depositCapUSD !== null && depositCapUSD > 0\n ? Math.min((tvl / depositCapUSD) * 100, 100)\n : null;\n\n let hasInsufficientBalance = false;\n if (selectedTokenBalance && amountBigInt) {\n const balanceAmount = BigInt(selectedTokenBalance.amount);\n hasInsufficientBalance = amountBigInt > balanceAmount;\n }\n\n const isBelowMinimum = !!(\n inputAmountUSD !== null &&\n minDepositUSD > 0 &&\n inputAmountUSD < minDepositUSD\n );\n\n const isAboveMaximum = !!(\n inputAmountUSD !== null &&\n maxDepositUSD !== null &&\n inputAmountUSD > maxDepositUSD\n );\n\n let buttonText: string;\n let validationMessage: string | null = null;\n\n if (isWrongChain) {\n buttonText = \"Switch chain\";\n } else if (isPending) {\n buttonText = \"Confirming...\";\n } else if (isConfirming) {\n buttonText = \"Processing...\";\n } else if (depositDisabled) {\n buttonText = depositDisabledReason || \"Deposits disabled\";\n validationMessage =\n depositDisabledReason || \"Deposits are currently disabled for this opportunity\";\n } else if (isVaultFull) {\n buttonText = \"Deposit cap reached\";\n validationMessage = \"This vault has reached its deposit cap\";\n } else if (isNoTokenSelected) {\n buttonText = \"Select token\";\n validationMessage = \"Please select a token to deposit\";\n } else if (isZeroAmount) {\n buttonText = \"Enter amount\";\n } else if (hasInsufficientBalance) {\n buttonText = \"Insufficient balance\";\n validationMessage = \"Your balance is insufficient for this deposit amount\";\n } else if (isBelowMinimum) {\n buttonText = `Minimum $${minDepositUSD.toLocaleString()}`;\n validationMessage = `Minimum deposit is $${minDepositUSD.toLocaleString()}`;\n } else if (isAboveMaximum && maxDepositUSD != null) {\n buttonText = `Maximum $${maxDepositUSD.toLocaleString()}`;\n validationMessage = `Maximum deposit is $${maxDepositUSD.toLocaleString()}`;\n } else if (isSecondaryOnly) {\n buttonText = \"Buy\";\n } else if (hasAsyncDeposit) {\n buttonText = \"Request deposit\";\n } else {\n buttonText = \"Deposit\";\n }\n\n const isDepositing = isPending || isConfirming;\n const canDeposit =\n !depositDisabled &&\n !isVaultFull &&\n !isDepositing &&\n !isNoTokenSelected &&\n !isZeroAmount &&\n !hasInsufficientBalance &&\n !isBelowMinimum &&\n !isAboveMaximum;\n\n return {\n canDeposit,\n isBelowMinimum,\n isAboveMaximum,\n hasInsufficientBalance,\n isDepositDisabled: depositDisabled,\n isZeroAmount,\n isNoTokenSelected,\n isVaultFull,\n minDepositUSD,\n maxDepositUSD,\n depositCapUSD,\n depositCapPercentFilled,\n depositDisabledReason,\n depositFee,\n performanceFee,\n managementFee,\n withdrawalFee,\n withdrawalCooldownSecs,\n inputAmountUSD,\n balanceUSD,\n hasAsyncDeposit,\n isSecondaryOnly,\n isWrongChain,\n requiredChainId,\n buttonText,\n validationMessage,\n };\n }, [opportunity, selectedTokenBalance, amountBigInt, isPending, isConfirming, walletChainId]);\n}\n","import type { Opportunity } from \"../../opportunities\";\n\nexport type DepositMode = \"native\" | \"route\";\n\nexport interface DepositModeFlags {\n isSecondaryOnly: boolean;\n routeModeEnabled: boolean;\n directModeEnabled: boolean;\n noModesEnabled: boolean;\n}\n\nexport function getDepositModeFlags(opportunity: Opportunity | null): DepositModeFlags {\n const isSecondaryOnly = opportunity?.vaultConfig?.secondaryOnly === true;\n const routeModeEnabled = opportunity?.swapRouteEnabled ?? false;\n const directModeEnabled = opportunity?.swapDirectEnabled ?? true;\n const noModesEnabled = !routeModeEnabled && !directModeEnabled;\n return { isSecondaryOnly, routeModeEnabled, directModeEnabled, noModesEnabled };\n}\n\nexport function resolveEffectiveDepositMode(\n depositMode: DepositMode,\n flags: DepositModeFlags\n): DepositMode {\n if (flags.isSecondaryOnly) return \"route\";\n if (!flags.directModeEnabled && flags.routeModeEnabled) return \"route\";\n return depositMode;\n}\n","import { useState, useEffect, useMemo, useCallback } from \"react\";\nimport type { TokenBalance } from \"../../balance/types\";\nimport { useTokenBalance } from \"../../balance/hooks/useTokenBalance\";\n\nexport interface UseDepositSelectionOptions {\n /** Available token balances to select from */\n balances: TokenBalance[];\n /** Opportunity ID - used to reset selection when opportunity changes */\n opportunityId: string | undefined;\n}\n\nexport interface UseDepositSelectionReturn {\n /** Currently selected token address */\n selectedTokenAddress: string | undefined;\n /** Set the selected token address */\n setSelectedTokenAddress: (address: string | undefined) => void;\n /** Current input amount as string */\n amount: string | undefined;\n /** Set the input amount */\n setAmount: (amount: string | undefined) => void;\n /** The selected token's balance data */\n selectedTokenBalance: TokenBalance | null;\n /** Amount converted to bigint (wei) */\n amountBigInt: bigint | undefined;\n /** USD value of the current amount (formatted string) */\n usdValue: string | undefined;\n /** Whether current amount exceeds balance */\n hasInsufficientBalance: boolean;\n /** Handler for max button click */\n handleMaxClick: () => void;\n /** Reset selection to initial state */\n reset: () => void;\n}\n\n/**\n * Hook to manage token and amount selection for deposits.\n * Handles:\n * - Token selection state with auto-select first token\n * - Amount input state with bigint conversion\n * - USD value calculation\n * - Balance validation\n * - Reset on opportunity change\n */\nexport function useDepositSelection({\n balances,\n opportunityId,\n}: UseDepositSelectionOptions): UseDepositSelectionReturn {\n const [selectedTokenAddress, setSelectedTokenAddress] = useState<string | undefined>();\n const [amount, setAmount] = useState<string | undefined>();\n\n // Reset selection when opportunity changes\n useEffect(() => {\n setSelectedTokenAddress(undefined);\n setAmount(undefined);\n }, [opportunityId]);\n\n // Auto-select first token when balances change and current selection is invalid\n useEffect(() => {\n if (balances.length === 0) return;\n\n const tokenExistsInBalances = balances.some(\n (b) => b.token.address === selectedTokenAddress\n );\n\n if (!selectedTokenAddress || !tokenExistsInBalances) {\n setSelectedTokenAddress(balances[0].token.address);\n }\n }, [selectedTokenAddress, balances]);\n\n // Find selected token balance\n const selectedTokenBalance = useMemo(\n () => balances.find((b) => b.token.address === selectedTokenAddress) ?? null,\n [balances, selectedTokenAddress]\n );\n\n // Use existing token balance hook for calculations\n const { handleMaxClick, amountBigInt, usdValue, hasInsufficientBalance } = useTokenBalance({\n tokenBalance: selectedTokenBalance,\n amount,\n setAmount,\n });\n\n // Reset function\n const reset = useCallback(() => {\n setSelectedTokenAddress(undefined);\n setAmount(undefined);\n }, []);\n\n return {\n selectedTokenAddress,\n setSelectedTokenAddress,\n amount,\n setAmount,\n selectedTokenBalance,\n amountBigInt,\n usdValue,\n hasInsufficientBalance,\n handleMaxClick,\n reset,\n };\n}\n","import { useCallback, useMemo } from \"react\";\nimport { parseUnits } from \"viem\";\nimport { calculateUsdValue, calculateMaxAmount } from \"@turtleclub/utils\";\nimport { TokenBalance } from \"../types\";\n\ninterface UseTokenBalanceProps {\n tokenBalance: TokenBalance | null;\n amount: string | undefined;\n setAmount: (amount: string | undefined) => void;\n}\n\nfunction checkInsufficientBalance(\n tokenBalance: TokenBalance | null,\n amount: string | undefined\n): boolean {\n if (!tokenBalance || !amount) return false;\n\n try {\n const balance = BigInt(tokenBalance.amount);\n const amountBigInt = parseUnits(amount, tokenBalance.token.decimals);\n return balance < amountBigInt;\n } catch (error) {\n console.error(\"[Balance Check Error]\", error, { tokenBalance, amount });\n return true; // Assume insufficient if there's an error\n }\n}\n\n/**\n * Hook to calculate the USD value of a token balance\n * - Calculate the USD value of the token balance\n * - Check if the balance is insufficient\n * - Calculate the maximum amount that can be used\n * - Convert the amount to a bigint\n */\nexport function useTokenBalance({ tokenBalance, amount, setAmount }: UseTokenBalanceProps) {\n const token = tokenBalance?.token;\n const usdValue = useMemo(\n () => calculateUsdValue(amount, token?.priceUsd),\n [amount, token?.priceUsd]\n );\n\n const hasInsufficientBalance = useMemo(\n () => checkInsufficientBalance(tokenBalance, amount),\n [tokenBalance, amount]\n );\n\n const handleMaxClick = useCallback(() => {\n if (!tokenBalance?.token || !tokenBalance.amount) return;\n const maxAmount = calculateMaxAmount(tokenBalance.amount, tokenBalance.token.decimals);\n setAmount(maxAmount);\n }, [tokenBalance, setAmount]);\n\n const amountBigInt = useMemo(() => {\n if (!token || !amount) return undefined;\n try {\n return parseUnits(amount, token.decimals);\n } catch {\n return undefined;\n }\n }, [amount, token]);\n\n return {\n usdValue,\n hasInsufficientBalance,\n handleMaxClick,\n amountBigInt,\n };\n}\n","import { useCallback } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport type { TransactionRequest } from \"../../earn-actions/useEarnDeposit\";\nimport type { ActionMode, RouteMetadata } from \"../../earn-actions/schema\";\nimport { useEarnDeposit } from \"../../earn-actions/useEarnDeposit\";\nimport { useDepositSelection, type UseDepositSelectionReturn } from \"./useDepositSelection\";\nimport { useDepositValidation, type DepositValidationResult } from \"./useDepositValidation\";\nimport { Opportunity } from \"../../opportunities\";\n\nexport interface UseDepositFlowOptions {\n mode: ActionMode;\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n balances: TokenBalance[];\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onDepositSuccess?: () => void;\n refetchBalances?: () => void;\n /** Slippage in basis points (e.g., 50 = 0.5%). If not provided, uses default. */\n slippageBps?: number;\n /** Current wallet chain ID for chain validation */\n walletChainId?: number;\n}\n\nexport interface UseDepositFlowReturn {\n selection: UseDepositSelectionReturn;\n validation: DepositValidationResult;\n deposit: {\n execute: () => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n isDepositing: boolean;\n error: Error | null;\n metadata: RouteMetadata | null;\n hasApprove: boolean;\n resetMetadata: () => void;\n };\n}\n\n/** Orchestrates token selection, validation, and deposit execution */\nexport function useDepositFlow({\n mode,\n opportunity,\n userAddress,\n distributorId,\n balances,\n executeTransactionAndWait,\n onDepositSuccess,\n refetchBalances,\n slippageBps,\n walletChainId,\n}: UseDepositFlowOptions): UseDepositFlowReturn {\n const selection = useDepositSelection({\n balances,\n opportunityId: opportunity?.id,\n });\n\n const {\n deposit: executeDeposit,\n isPending,\n isConfirming,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n } = useEarnDeposit({\n mode,\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess: () => {\n selection.setAmount(undefined);\n resetMetadata();\n refetchBalances?.();\n onDepositSuccess?.();\n },\n });\n\n const isDepositing = isPending || isConfirming;\n\n const validation = useDepositValidation({\n opportunity,\n selectedTokenBalance: selection.selectedTokenBalance,\n amountBigInt: selection.amountBigInt,\n isPending,\n isConfirming,\n walletChainId,\n });\n\n const execute = useCallback(async () => {\n if (!selection.amountBigInt || !selection.selectedTokenAddress) {\n return undefined;\n }\n return executeDeposit(selection.amountBigInt, selection.selectedTokenAddress, slippageBps);\n }, [selection.amountBigInt, selection.selectedTokenAddress, executeDeposit, slippageBps]);\n\n return {\n selection,\n validation,\n deposit: {\n execute,\n isPending,\n isConfirming,\n isDepositing,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n },\n };\n}\n","import { useState, useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useDepositAction, useAttributeAction } from \"./hooks\";\nimport { balanceQueries } from \"../balance/queries\";\n\nimport type { TxResponseItem, RouteMetadata, ActionMode } from \"./schema\";\nimport { Opportunity } from \"../opportunities\";\n\nexport interface TransactionRequest {\n to: string;\n data: string;\n value?: string;\n gasLimit?: string;\n type?: string;\n}\n\nexport interface UseEarnDepositOptions {\n mode: ActionMode;\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onSuccess?: () => void;\n referralCode?: string;\n}\n\nexport interface UseEarnDepositReturn {\n deposit: (amount: bigint, tokenAddress: string, slippage?: number) => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n error: Error | null;\n metadata: RouteMetadata | null;\n hasApprove: boolean;\n resetMetadata: () => void;\n}\n\nconst DEFAULT_SLIPPAGE_BPS = 50;\n\nexport function useEarnDeposit(options: UseEarnDepositOptions): UseEarnDepositReturn {\n const {\n mode,\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess,\n referralCode,\n } = options;\n\n const queryClient = useQueryClient();\n const [isConfirming, setIsConfirming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [metadata, setMetadata] = useState<RouteMetadata | null>(null);\n const [hasApprove, setHasApprove] = useState(false);\n\n const depositAction = useDepositAction();\n const attributeAction = useAttributeAction();\n\n const toTransactionRequest = useCallback((txItem: TxResponseItem): TransactionRequest => {\n return {\n to: txItem.transaction.to,\n data: txItem.transaction.data,\n value: txItem.transaction.value,\n gasLimit: txItem.transaction.gasLimit,\n type: txItem.type,\n };\n }, []);\n\n const executeTransactionsSequentially = useCallback(\n async (transactions: TxResponseItem[]): Promise<string | undefined> => {\n let lastTxHash: string | undefined;\n\n for (const txItem of transactions) {\n const txRequest = toTransactionRequest(txItem);\n // executeTransactionAndWait should wait for receipt before returning\n const txHash = await executeTransactionAndWait(txRequest);\n\n if (!txHash) {\n throw new Error(`Transaction failed: ${txItem.description || \"Unknown transaction\"}`);\n }\n\n lastTxHash = txHash;\n }\n\n return lastTxHash;\n },\n [executeTransactionAndWait, toTransactionRequest]\n );\n\n const attributeTransactionSafely = useCallback(\n async (actionId: string, txHash: string): Promise<void> => {\n try {\n await attributeAction.mutateAsync({ actionId, txHash });\n } catch (attributeError) {\n console.warn(\"[useEarnDeposit] Attribution failed (non-blocking):\", attributeError);\n }\n },\n [attributeAction]\n );\n\n const deposit = useCallback(\n async (\n amount: bigint,\n tokenAddress: string,\n slippage: number = DEFAULT_SLIPPAGE_BPS\n ): Promise<string | undefined> => {\n setError(null);\n\n if (!opportunity?.id) {\n const err = new Error(\"No opportunity selected\");\n setError(err);\n throw err;\n }\n\n if (!userAddress) {\n const err = new Error(\"No wallet connected\");\n setError(err);\n throw err;\n }\n\n if (amount <= 0n) {\n const err = new Error(\"Amount must be greater than 0\");\n setError(err);\n throw err;\n }\n\n try {\n const actionResponse = await depositAction.mutateAsync({\n mode,\n opportunityId: opportunity.id,\n userAddress,\n tokenIn: tokenAddress,\n amount: amount.toString(),\n distributorId,\n referralCode,\n slippageBps: slippage,\n });\n\n const { actionId, transactions } = actionResponse;\n\n if (!transactions || transactions.length === 0) {\n throw new Error(\"No transactions returned from deposit action\");\n }\n\n const txWithMetadata = transactions.find((tx) => tx.metadata);\n if (txWithMetadata?.metadata) {\n setMetadata(txWithMetadata.metadata);\n }\n\n const hasApproveTx = transactions.some((tx) => tx.type === \"approve\");\n setHasApprove(hasApproveTx);\n\n setIsConfirming(true);\n const finalTxHash = await executeTransactionsSequentially(transactions);\n\n if (actionId && finalTxHash) {\n await attributeTransactionSafely(actionId, finalTxHash);\n }\n\n if (userAddress) {\n queryClient.invalidateQueries({\n queryKey: balanceQueries.portfolio(userAddress).queryKey,\n });\n }\n onSuccess?.();\n\n return finalTxHash;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsConfirming(false);\n }\n },\n [\n opportunity?.id,\n userAddress,\n distributorId,\n referralCode,\n depositAction,\n executeTransactionsSequentially,\n attributeTransactionSafely,\n queryClient,\n onSuccess,\n ]\n );\n\n const resetMetadata = useCallback(() => {\n setMetadata(null);\n setHasApprove(false);\n }, []);\n\n return {\n deposit,\n isPending: depositAction.isPending,\n isConfirming,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n };\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport {\n createDepositAction,\n createWithdrawAction,\n createClaimWithdrawAction,\n createClaimDepositAction,\n createCancelDepositAction,\n createCancelWithdrawAction,\n attributeAction,\n} from \"./api\";\nimport type {\n ActionResponse,\n ActionParams,\n CancelDepositActionParams,\n ClaimDepositActionParams,\n WithdrawActionParams,\n AttributeActionParams,\n AttributeActionResponse,\n} from \"./schema\";\n\n// Re-export param types for convenience\nexport type {\n ActionParams,\n ActionResponse,\n AttributeActionParams,\n AttributeActionResponse,\n DepositActionParams,\n WithdrawActionParams,\n ClaimWithdrawActionParams,\n ClaimDepositActionParams,\n CancelDepositActionParams,\n CancelWithdrawActionParams,\n // Legacy\n InteractionParams,\n InteractionResponse,\n CreateDepositInteractionParams,\n CreateWithdrawInteractionParams,\n CreateClaimWithdrawInteractionParams,\n} from \"./schema\";\n\n// Hook options type aliases\ntype ActionMutationOptions = Omit<\n UseMutationOptions<ActionResponse, Error, ActionParams>,\n \"mutationFn\"\n>;\n\ntype AttributeActionMutationOptions = Omit<\n UseMutationOptions<AttributeActionResponse, Error, AttributeActionParams>,\n \"mutationFn\"\n>;\n\n// Higher-order function to create action hooks - DRY helper\nfunction createActionHook<TParams = ActionParams>(\n mutationFn: (params: TParams) => Promise<ActionResponse>\n) {\n return function useAction(\n options?: Omit<UseMutationOptions<ActionResponse, Error, TParams>, \"mutationFn\">\n ) {\n return useMutation({\n mutationFn,\n ...options,\n });\n };\n}\n\n/**\n * Hook for creating a deposit action\n * POST /v1/actions/deposit/{opportunityId}\n */\nexport const useDepositAction = createActionHook(createDepositAction);\n\n/**\n * Hook for creating a withdraw action\n * POST /v1/actions/withdraw/{opportunityId}\n */\nexport const useWithdrawAction = createActionHook<WithdrawActionParams>(createWithdrawAction);\n\n/**\n * Hook for creating a claim-withdraw action\n * POST /v1/actions/claim-withdraw/{opportunityId}\n */\nexport const useClaimWithdrawAction = createActionHook(createClaimWithdrawAction);\n\n/**\n * Hook for creating a claim-deposit action\n * POST /v1/actions/claim-deposit/{opportunityId}\n */\nexport const useClaimDepositAction = createActionHook<ClaimDepositActionParams>(createClaimDepositAction);\n\n/**\n * Hook for creating a cancel-deposit action\n * POST /v1/actions/cancel-deposit/{opportunityId}\n */\nexport const useCancelDepositAction = createActionHook<CancelDepositActionParams>(createCancelDepositAction);\n\n/**\n * Hook for creating a cancel-withdraw action\n * POST /v1/actions/cancel-withdraw/{opportunityId}\n */\nexport const useCancelWithdrawAction = createActionHook(createCancelWithdrawAction);\n\n/**\n * Hook for attributing a transaction hash to an action\n * POST /v1/actions/attribute/{actionId}\n */\nexport function useAttributeAction(options?: AttributeActionMutationOptions) {\n return useMutation({\n mutationFn: attributeAction,\n ...options,\n });\n}\n\n// Legacy aliases for backwards compatibility\nexport const useCreateDepositInteraction = useDepositAction;\nexport const useCreateWithdrawInteraction = useWithdrawAction;\nexport const useCreateClaimWithdrawInteraction = useClaimWithdrawAction;\n","import { z } from \"zod\";\n\nexport const transactionSchema = z.object({\n chainId: z.number().int(),\n data: z.string(),\n to: z.string(),\n value: z.string(),\n gasLimit: z.string().optional(),\n});\n\nexport const routeTokenSchema = z.object({\n address: z.string(),\n symbol: z.string(),\n decimals: z.number().int(),\n logoUrl: z.string(),\n});\n\nexport const routeStepSchema = z.object({\n action: z.string(),\n from: routeTokenSchema,\n to: routeTokenSchema,\n});\n\nexport const routeMetadataSchema = z.object({\n provider: z.string(),\n providerImg: z.string(),\n amountOut: z.string(),\n gas: z.string(),\n route: z.array(routeStepSchema),\n});\n\nexport const txResponseItemSchema = z.object({\n type: z.string().optional(),\n description: z.string().optional(),\n transaction: transactionSchema,\n metadata: routeMetadataSchema.optional(),\n});\n\nexport const actionResponseSchema = z.object({\n actionId: z.string().uuid().optional(),\n transactions: z.array(txResponseItemSchema).nullable(),\n});\n\nexport const attributeActionResponseSchema = z.object({\n success: z.boolean(),\n message: z.string().optional(),\n});\n\nexport type ActionMode = \"direct\" | \"swap\";\nexport interface ActionParams {\n mode: ActionMode;\n opportunityId: string;\n userAddress: string;\n tokenIn: string;\n amount: string;\n distributorId: string;\n referralCode?: string;\n slippageBps?: number;\n}\n\nexport interface AttributeActionParams {\n actionId: string;\n txHash: string;\n}\n\nexport type DepositActionParams = ActionParams;\nexport interface WithdrawActionParams {\n opportunityId: string;\n userAddress: string;\n amount: string;\n distributorId: string;\n tokenOut?: string;\n slippageBps?: number;\n}\nexport type ClaimWithdrawActionParams = ActionParams;\nexport interface ClaimDepositActionParams {\n opportunityId: string;\n userAddress: string;\n distributorId: string;\n}\nexport interface CancelDepositActionParams {\n opportunityId: string;\n userAddress: string;\n distributorId: string;\n}\nexport type CancelWithdrawActionParams = ActionParams;\n\n// Legacy aliases\nexport type InteractionParams = ActionParams;\nexport type CreateDepositInteractionParams = ActionParams;\nexport type CreateWithdrawInteractionParams = ActionParams;\nexport type CreateClaimWithdrawInteractionParams = ActionParams;\n\nexport type Transaction = z.infer<typeof transactionSchema>;\nexport type TxResponseItem = z.infer<typeof txResponseItemSchema>;\nexport type ActionResponse = z.infer<typeof actionResponseSchema>;\nexport type AttributeActionResponse = z.infer<typeof attributeActionResponseSchema>;\n\nexport type ActionRouteToken = z.infer<typeof routeTokenSchema>;\nexport type ActionRouteStep = z.infer<typeof routeStepSchema>;\nexport type RouteMetadata = z.infer<typeof routeMetadataSchema>;\n\nexport type InteractionResponse = ActionResponse;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n actionResponseSchema,\n attributeActionResponseSchema,\n type ActionResponse,\n type ActionParams,\n type CancelDepositActionParams,\n type ClaimDepositActionParams,\n type WithdrawActionParams,\n type AttributeActionParams,\n type AttributeActionResponse,\n} from \"./schema\";\n\n// Supported action types\ntype ActionType =\n | \"deposit\"\n | \"withdraw\"\n | \"claim-withdraw\"\n | \"claim-deposit\"\n | \"cancel-deposit\"\n | \"cancel-withdraw\";\n\n// Generic action creator - DRY helper\nasync function createAction<T extends { opportunityId: string }>(\n actionType: ActionType,\n params: T\n): Promise<ActionResponse> {\n const { opportunityId, ...body } = params;\n\n const data = await apiClient.fetch(\n `/v1/actions/${actionType}/${opportunityId}`,\n {\n method: \"POST\",\n domain: \"earn\",\n body,\n }\n );\n\n const result = actionResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(\n `Failed to parse ${actionType} action: ${result.error.message}`\n );\n }\n return result.data;\n}\n\n// POST /v1/actions/deposit/{opportunityId}\nexport const createDepositAction = (params: ActionParams) =>\n createAction(\"deposit\", params);\n\n// POST /v1/actions/withdraw/{opportunityId}\nexport const createWithdrawAction = (params: WithdrawActionParams) =>\n createAction(\"withdraw\", params);\n\n// POST /v1/actions/claim-withdraw/{opportunityId}\nexport const createClaimWithdrawAction = (params: ActionParams) =>\n createAction(\"claim-withdraw\", params);\n\n// POST /v1/actions/claim-deposit/{opportunityId}\nexport const createClaimDepositAction = (params: ClaimDepositActionParams) =>\n createAction(\"claim-deposit\", params);\n\n// POST /v1/actions/cancel-deposit/{opportunityId}\nexport const createCancelDepositAction = (params: CancelDepositActionParams) =>\n createAction(\"cancel-deposit\", params);\n\n// POST /v1/actions/cancel-withdraw/{opportunityId}\nexport const createCancelWithdrawAction = (params: ActionParams) =>\n createAction(\"cancel-withdraw\", params);\n\n// POST /v1/actions/attribute/{actionId}\nexport async function attributeAction(\n params: AttributeActionParams\n): Promise<AttributeActionResponse> {\n const { actionId, txHash } = params;\n\n const data = await apiClient.fetch(`/v1/actions/attribute/${actionId}`, {\n method: \"POST\",\n domain: \"earn\",\n body: { txHash },\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const result = attributeActionResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.error(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to parse attribute action: ${result.error.message}`);\n }\n return result.data;\n}\n\n// Legacy aliases for backwards compatibility\nexport const createDepositInteraction = createDepositAction;\nexport const createWithdrawInteraction = createWithdrawAction;\nexport const createClaimWithdrawInteraction = createClaimWithdrawAction;\n","import { useMemo } from \"react\";\nimport { useGetOnChainBalance } from \"../../balance/hooks/useGetOnChainBalance\";\nimport { useBalance } from \"../../balance/hooks/useBalance\";\nimport { filterExcludedTokens } from \"../../balance/utils\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport { Opportunity } from \"../../opportunities\";\nimport { getDepositModeFlags, resolveEffectiveDepositMode } from \"./utils\";\n\nexport interface UseActionsDefaultParamsOptions {\n opportunity: Opportunity | null;\n address: string | undefined;\n depositMode: \"native\" | \"route\";\n}\n\nexport interface UseActionsDefaultParamsReturn {\n balances: TokenBalance[];\n isBalancesLoading: boolean;\n refetchBalances: () => void;\n}\n\nfunction sortByBalance(balances: TokenBalance[]): TokenBalance[] {\n return [...balances].sort((a, b) => {\n const aValue = BigInt(a.amount);\n const bValue = BigInt(b.amount);\n if (bValue > aValue) return 1;\n if (bValue < aValue) return -1;\n return 0;\n });\n}\n\n/**\n * Hook that encapsulates balance fetching logic for deposit actions.\n * Handles on-chain balances for native mode and portfolio balances for route mode.\n */\nexport function useActionsDefaultParams({\n opportunity,\n address,\n depositMode,\n}: UseActionsDefaultParamsOptions): UseActionsDefaultParamsReturn {\n const opportunityChainId = opportunity\n ? Number(opportunity.receiptToken.chain.chainId)\n : undefined;\n\n // Determine effective deposit mode based on swap flags\n const flags = getDepositModeFlags(opportunity);\n const effectiveDepositMode = resolveEffectiveDepositMode(depositMode, flags);\n const useOnChainBalances = effectiveDepositMode === \"native\";\n\n // Fetch deposit token balances (on-chain)\n const {\n balances: depositTokenBalances,\n isLoading: isDepositBalancesLoading,\n refetch: refetchDepositBalances,\n } = useGetOnChainBalance({\n tokens: opportunity?.depositTokens ?? [],\n chainId: opportunityChainId!,\n address,\n enabled: !!address && !!opportunity && opportunityChainId != null,\n });\n\n // Fetch all balances for route/swap mode\n const {\n balances: allChainBalances,\n isLoading: isAllChainBalancesLoading,\n refetchAll: refetchAllBalances,\n } = useBalance({\n address,\n chainIds: opportunityChainId ? [opportunityChainId] : [],\n depositOpportunity: opportunity ?? undefined,\n });\n\n const rawBalances = useMemo(() => {\n if (useOnChainBalances) {\n if (depositTokenBalances.length > 0) {\n return depositTokenBalances;\n }\n // Fallback: create TokenBalance entries from deposit tokens with 0 balance\n if (opportunity?.depositTokens) {\n return opportunity.depositTokens.map((token) => ({\n token,\n amount: \"0\",\n source: \"onchain\" as const,\n }));\n }\n return [];\n }\n return allChainBalances;\n }, [useOnChainBalances, depositTokenBalances, allChainBalances, opportunity?.depositTokens]);\n\n const isBalancesLoading = useOnChainBalances\n ? isDepositBalancesLoading\n : isAllChainBalancesLoading;\n\n const refetchBalances = useOnChainBalances ? refetchDepositBalances : refetchAllBalances;\n\n const balances = useMemo(() => {\n let filtered = rawBalances;\n\n // Filter by opportunity chain (only for route mode)\n if (!useOnChainBalances && opportunityChainId) {\n filtered = filtered.filter((b) => {\n const tokenChainId = Number(b.token.chain?.chainId);\n return tokenChainId === opportunityChainId;\n });\n }\n\n // Filter zero balances (only for route mode)\n if (!useOnChainBalances) {\n filtered = filtered.filter((b) => BigInt(b.amount) > 0n);\n }\n\n // Filter excluded tokens\n filtered = filterExcludedTokens(filtered);\n\n return sortByBalance(filtered);\n }, [rawBalances, useOnChainBalances, opportunityChainId]);\n\n return {\n balances,\n isBalancesLoading,\n refetchBalances,\n };\n}\n","import { useReadContracts, useBalance } from \"wagmi\";\nimport { erc20Abi } from \"viem\";\nimport { useMemo, useCallback } from \"react\";\nimport type { TokenBalance } from \"../types\";\nimport { queryDefaults } from \"../../lib/query-config\";\nimport { Token } from \"../../supported-tokens\";\n\n/**\n * Well-known native token addresses used across chains\n */\nconst NATIVE_TOKEN_ADDRESSES = [\n \"0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\",\n \"0x0000000000000000000000000000000000000000\",\n];\n\nconst QUERY_REFETCH_INTERVAL = 5_000;\n\n/**\n * Determines if a token is a native token (ETH, MATIC, etc.)\n * Uses the token's isNative flag as primary detection,\n * with fallback to well-known native token addresses\n */\nfunction isNativeToken(token: Token): boolean {\n return token.isNative || NATIVE_TOKEN_ADDRESSES.includes(token.address.toLowerCase());\n}\n\nexport interface UseGetOnChainBalanceOptions {\n tokens: Token[];\n chainId: number;\n address?: string;\n enabled?: boolean;\n}\n\nexport interface UseGetOnChainBalanceResult {\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\nexport function useGetOnChainBalance({\n tokens,\n chainId,\n address,\n enabled = true,\n}: UseGetOnChainBalanceOptions): UseGetOnChainBalanceResult {\n // Separate tokens into native and ERC20\n const { nativeTokens, erc20Tokens } = useMemo(() => {\n const native: Token[] = [];\n const erc20: Token[] = [];\n\n for (const token of tokens) {\n if (isNativeToken(token)) {\n native.push(token);\n } else {\n erc20.push(token);\n }\n }\n\n return { nativeTokens: native, erc20Tokens: erc20 };\n }, [tokens]);\n\n // Fetch native token balance using wagmi's useBalance\n // Note: Only one native token per chain, so we take the first one\n const nativeToken = nativeTokens[0];\n const {\n data: nativeBalanceData,\n isLoading: isNativeLoading,\n error: nativeError,\n refetch: refetchNative,\n } = useBalance({\n address: address as `0x${string}`,\n chainId,\n query: {\n ...queryDefaults,\n enabled: enabled && !!address && nativeTokens.length > 0,\n refetchInterval: QUERY_REFETCH_INTERVAL,\n refetchOnWindowFocus: true,\n },\n });\n\n // Build multicall contracts array for ERC20 tokens\n const contracts = useMemo(() => {\n if (!address || !enabled) return [];\n\n return erc20Tokens.map(\n (token) =>\n ({\n address: token.address as `0x${string}`,\n abi: erc20Abi,\n functionName: \"balanceOf\",\n args: [address as `0x${string}`],\n chainId,\n }) as const\n );\n }, [erc20Tokens, address, chainId, enabled]);\n\n // Fetch ERC20 balances with multicall\n const {\n data: erc20Results,\n isLoading: isErc20Loading,\n error: erc20Error,\n refetch: refetchErc20,\n } = useReadContracts({\n contracts,\n query: {\n ...queryDefaults,\n enabled: enabled && !!address && erc20Tokens.length > 0,\n refetchInterval: QUERY_REFETCH_INTERVAL,\n refetchOnWindowFocus: true,\n },\n });\n\n // Combine results into TokenBalance format\n const balances = useMemo(() => {\n const result: TokenBalance[] = [];\n\n // Add native token balance if present\n if (nativeToken && nativeBalanceData) {\n result.push({\n token: nativeToken,\n amount: nativeBalanceData.value.toString(),\n source: \"onchain\" as const,\n });\n }\n\n // Add ERC20 token balances\n if (erc20Results && erc20Results.length > 0) {\n erc20Tokens.forEach((token, index) => {\n const erc20Result = erc20Results[index];\n\n let balance = \"0\";\n if (erc20Result?.status === \"success\" && typeof erc20Result.result === \"bigint\") {\n balance = erc20Result.result.toString();\n }\n\n result.push({\n token,\n amount: balance,\n source: \"onchain\" as const,\n });\n });\n }\n\n return result;\n }, [nativeToken, nativeBalanceData, erc20Results, erc20Tokens]);\n\n // Aggregate loading states\n const isLoading =\n (nativeTokens.length > 0 && isNativeLoading) || (erc20Tokens.length > 0 && isErc20Loading);\n\n // Return first error encountered\n const error = nativeError || erc20Error;\n\n // Unified refetch function\n const refetch = useCallback(() => {\n if (nativeTokens.length > 0) {\n refetchNative();\n }\n if (erc20Tokens.length > 0) {\n refetchErc20();\n }\n }, [nativeTokens.length, erc20Tokens.length, refetchNative, refetchErc20]);\n\n return {\n balances,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n };\n}\n","import { useMemo } from \"react\";\nimport type { UseBalanceParams } from \"../types\";\nimport type { TokenBalance } from \"../types\";\nimport { useGetOnChainBalance } from \"../hooks/useGetOnChainBalance\";\nimport { usePortfolioBalance } from \"./usePortfolioBalance\";\nimport { mergeBalancesByPriority, filterNonZeroBalances, filterExcludedTokens } from \"../utils\";\n\nexport interface UseBalanceResult {\n /** Consolidated token balances from all sources */\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n /** Refetch all balance sources */\n refetchAll: () => void;\n}\n\n/**\n * Consolidated balance hook that fetches from multiple sources with priority merge\n *\n * Priority order:\n * 1. On-chain (if depositOpportunity provided) - most accurate\n * 2. Portfolio API - server-aggregated\n *\n * Features:\n * - Priority-based merge (higher priority sources override lower)\n * - Automatic receipt token filtering\n * - Multi-chain support\n * - Zero balance filtering\n * - Excluded token filtering (internal/wrapped tokens)\n */\nexport function useBalance({\n address,\n chainIds,\n depositOpportunity,\n}: UseBalanceParams): UseBalanceResult {\n // Fetch on-chain balances only if depositOpportunity is provided\n const {\n balances: onChainBalances,\n isLoading: isOnChainLoading,\n error: onChainError,\n refetch: refetchOnChain,\n } = useGetOnChainBalance({\n tokens: depositOpportunity?.depositTokens || [],\n chainId: depositOpportunity?.depositTokens[0]\n ? Number(depositOpportunity.depositTokens[0].chain.chainId)\n : chainIds[0],\n address,\n enabled: !!depositOpportunity && !!address,\n });\n\n // Fetch portfolio balances (always enabled when address exists)\n const {\n balances: portfolioBalances,\n isLoading: isPortfolioLoading,\n error: portfolioError,\n refetch: refetchPortfolio,\n } = usePortfolioBalance({\n address,\n });\n\n // Merge balances by priority and filter receipt token\n const consolidatedBalances = useMemo(() => {\n const sources: TokenBalance[][] = [];\n\n // Add sources in priority order (will be reversed in merge logic)\n if (depositOpportunity && onChainBalances.length > 0) {\n sources.push(onChainBalances); // Priority 1\n }\n if (portfolioBalances.length > 0) {\n sources.push(portfolioBalances); // Priority 2\n }\n\n // Merge with receipt token filtering\n const merged = mergeBalancesByPriority(sources, depositOpportunity?.receiptToken);\n\n // Filter out zero balances\n const nonZero = filterNonZeroBalances(merged);\n\n // Filter out excluded tokens (internal/wrapped tokens)\n return filterExcludedTokens(nonZero);\n }, [onChainBalances, portfolioBalances, depositOpportunity]);\n\n // Aggregate loading states\n const isLoading = isOnChainLoading || isPortfolioLoading;\n\n // Return first error encountered\n const error = onChainError || portfolioError;\n\n // Refetch all sources\n const refetchAll = () => {\n if (depositOpportunity) {\n refetchOnChain();\n }\n refetchPortfolio();\n };\n\n return {\n balances: consolidatedBalances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport { useMemo } from \"react\";\nimport type { TokenBalance } from \"../types\";\nimport { balanceQueries } from \"../queries\";\nimport { queryDefaults } from \"../../lib/query-config\";\nimport { useSupportedChains } from \"../../supported-chains\";\nimport { Token, useSupportedTokens } from \"../../supported-tokens\";\nimport { parseUnits } from \"viem\";\n\nexport interface UsePortfolioBalanceOptions {\n address?: string;\n}\n\nexport interface UsePortfolioBalanceResult {\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Hook to fetch portfolio balances from /wallet/{address}/balance endpoint\n */\nexport function usePortfolioBalance({\n address,\n}: UsePortfolioBalanceOptions): UsePortfolioBalanceResult {\n const { getChainByChainId } = useSupportedChains();\n const { getToken } = useSupportedTokens();\n\n const {\n data: portfolioData,\n isLoading,\n error,\n refetch,\n } = useQuery({\n ...balanceQueries.portfolio(address || \"\"),\n ...queryDefaults,\n enabled: !!address,\n refetchInterval: 1 * 60 * 1000, // 1 minute\n });\n\n const balances = useMemo(() => {\n if (!portfolioData) return [];\n\n const tokenBalances: TokenBalance[] = [];\n\n portfolioData.portfolio.holdings.wallets.forEach((wallet) => {\n wallet.tokens.forEach((portfolioToken) => {\n const chainId = portfolioToken.chain.chainId;\n\n // Try to get full token data from supported tokens first\n const supportedToken = getToken(portfolioToken.address, chainId);\n\n // Build token from portfolio data, enriching with supported token/chain data if available\n const token: Token = supportedToken ?? {\n id: portfolioToken.id,\n symbol: portfolioToken.symbol,\n name: portfolioToken.name,\n address: portfolioToken.address,\n decimals: portfolioToken.decimals,\n logoUrl: portfolioToken.logoUrl ?? undefined,\n chain: getChainByChainId(chainId) ?? {\n id: portfolioToken.chain.id ?? \"0\", // zero as default for an empty value\n chainId: portfolioToken.chain.chainId,\n name: portfolioToken.chain.name ?? \"\",\n slug: portfolioToken.chain.slug,\n status: portfolioToken.chain.status,\n logoUrl: portfolioToken.chain.logoUrl,\n ecosystem: portfolioToken.chain.ecosystem,\n explorerUrl: portfolioToken.chain.explorerUrl,\n },\n isNative: portfolioToken.isNative,\n priceUsd: portfolioToken.price ?? undefined,\n };\n\n // Convert amount from decimal to wei format\n let amountInWei: string;\n try {\n amountInWei = parseUnits(portfolioToken.amount, token.decimals).toString();\n } catch (error) {\n console.error(\"[Portfolio Balance] Failed to parse amount:\", {\n amount: portfolioToken.amount,\n decimals: token.decimals,\n error,\n });\n amountInWei = \"0\";\n }\n\n tokenBalances.push({\n token,\n amount: amountInWei,\n source: \"portfolio\",\n });\n });\n });\n\n return tokenBalances;\n }, [portfolioData, getChainByChainId, getToken]);\n\n return {\n balances,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n };\n}\n","import { Opportunity } from \"../opportunities\";\nimport { Token } from \"../supported-tokens\";\n\n/**\n * Unified token balance type for multi-source balance system\n * Compatible with on-chain, portfolio API, and Enso balance sources\n */\nexport interface TokenBalance {\n token: Token;\n amount: string;\n source: \"onchain\" | \"portfolio\" | \"enso\";\n}\n\n/**\n * Balance source priority for merge strategy\n */\nexport enum BalanceSourcePriority {\n ONCHAIN = 1,\n PORTFOLIO = 2,\n ENSO = 3,\n}\n\nexport interface UseBalanceParams {\n /** User wallet address */\n address?: string;\n /** Chain IDs to fetch balances for */\n chainIds: number[];\n /** Optional deposit opportunity for on-chain fetching */\n depositOpportunity?: Opportunity | null;\n}\n","import type { TokenBalance } from \"./types\";\nimport { BalanceSourcePriority } from \"./types\";\nimport { formatUnits } from \"viem\";\nimport { EXCLUDE_TOKEN_ADDRESS_LIST } from \"./constants\";\nimport { Token } from \"../supported-tokens\";\n\n/**\n * Helper to get priority value for a source\n */\nexport function getSourcePriority(source: TokenBalance[\"source\"]): number {\n switch (source) {\n case \"onchain\":\n return BalanceSourcePriority.ONCHAIN;\n case \"portfolio\":\n return BalanceSourcePriority.PORTFOLIO;\n case \"enso\":\n return BalanceSourcePriority.ENSO;\n }\n}\n\n/**\n * Merge multiple balance sources by priority (lower priority value = higher precedence)\n * Uses outer join strategy to include all unique tokens across sources\n * Filters out receipt token if provided\n */\nexport function mergeBalancesByPriority(\n sources: TokenBalance[][],\n receiptToken?: Token | null\n): TokenBalance[] {\n // Create a map to store the best balance for each token\n // Key: `${chainId}-${address.toLowerCase()}`\n const balanceMap = new Map<string, TokenBalance>();\n\n // Process all sources\n sources.forEach((sourceBalances) => {\n sourceBalances.forEach((balance) => {\n const key = `${balance.token.chain.chainId}-${balance.token.address.toLowerCase()}`;\n\n // Skip receipt token if provided\n if (receiptToken) {\n const receiptKey = `${receiptToken.chain.chainId}-${receiptToken.address.toLowerCase()}`;\n if (key === receiptKey) {\n return;\n }\n }\n\n const existingBalance = balanceMap.get(key);\n\n // If no existing balance or current source has higher priority, update\n if (\n !existingBalance ||\n getSourcePriority(balance.source) < getSourcePriority(existingBalance.source)\n ) {\n balanceMap.set(key, balance);\n }\n });\n });\n\n // Convert map to array and sort by chain, then balance\n return Array.from(balanceMap.values()).sort((a, b) => {\n // First sort by chain\n if (a.token.chain.chainId !== b.token.chain.chainId) {\n return Number(a.token.chain.chainId) - Number(b.token.chain.chainId);\n }\n // Then sort by balance (highest first)\n const balanceA = Number(formatUnits(BigInt(a.amount), a.token.decimals));\n const balanceB = Number(formatUnits(BigInt(b.amount), b.token.decimals));\n return balanceB - balanceA;\n });\n}\n\nexport function filterBalancesByChains(\n balances: TokenBalance[],\n chainIds: number[]\n): TokenBalance[] {\n const chainSet = new Set(chainIds);\n return balances.filter((balance) => chainSet.has(Number(balance.token.chain.chainId)));\n}\n\nexport function filterNonZeroBalances(balances: TokenBalance[]): TokenBalance[] {\n return balances.filter((balance) => {\n const amount = BigInt(balance.amount);\n return amount > 0n;\n });\n}\n\n/**\n * Filter out excluded tokens (internal/wrapped tokens that shouldn't be shown to users)\n */\nexport function filterExcludedTokens(balances: TokenBalance[]): TokenBalance[] {\n const excludedSet = new Set(EXCLUDE_TOKEN_ADDRESS_LIST.map((addr) => addr.toLowerCase()));\n return balances.filter((balance) => {\n const tokenAddress = balance.token.address.toLowerCase();\n return !excludedSet.has(tokenAddress);\n });\n}\n","/**\n * List of token addresses that should be excluded from balance results\n * These are typically internal/wrapped tokens that shouldn't be displayed to users\n */\nexport const EXCLUDE_TOKEN_ADDRESS_LIST = [\n \"0x7b5a0182e400b241b317e781a4e9dedfc1429822\", // kpdUSDC\n \"0x48c03b6ffd0008460f8657db1037c7e09deedfcb\", // kpdUSDT\n \"0x92c82f5f771f6a44cfa09357dd0575b81bf5f728\", // kpdWBTC\n \"0xcc6a16be713f6a714f68b0e1f4914fd3db15fbef\", // kpdWETH\n \"0xf470eb50b4a60c9b069f7fd6032532b8f5cc014d\", // kpdUSDC\n \"0xa5dab32dbe68e6fa784e1e50e4f620a0477d3896\", // kpdUSDT\n \"0xe1ac97e2616ad80f69f705ff007a4bbb3655544a\", // kpdWBTC\n \"0x77570cfecf83bc6bb08e2cd9e8537aea9f97ea2f\", // kpdWETH\n];\n","import { useState, useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useWithdrawAction, useAttributeAction } from \"./hooks\";\nimport { balanceQueries } from \"../balance/queries\";\n\nimport type { TxResponseItem, RouteMetadata } from \"./schema\";\nimport type { TransactionRequest } from \"./useEarnDeposit\";\nimport { Opportunity } from \"../opportunities\";\n\nexport interface UseEarnWithdrawOptions {\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onSuccess?: () => void;\n}\n\nexport interface UseEarnWithdrawReturn {\n withdraw: (amount: bigint, tokenOut?: string, slippageBps?: number) => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n error: Error | null;\n metadata: RouteMetadata | null;\n hasApprove: boolean;\n resetMetadata: () => void;\n}\n\nexport function useEarnWithdraw(options: UseEarnWithdrawOptions): UseEarnWithdrawReturn {\n const {\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess,\n } = options;\n\n const queryClient = useQueryClient();\n const [isConfirming, setIsConfirming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [metadata, setMetadata] = useState<RouteMetadata | null>(null);\n const [hasApprove, setHasApprove] = useState(false);\n\n const withdrawAction = useWithdrawAction();\n const attributeAction = useAttributeAction();\n\n const toTransactionRequest = useCallback((txItem: TxResponseItem): TransactionRequest => {\n return {\n to: txItem.transaction.to,\n data: txItem.transaction.data,\n value: txItem.transaction.value,\n gasLimit: txItem.transaction.gasLimit,\n type: txItem.type,\n };\n }, []);\n\n const executeTransactionsSequentially = useCallback(\n async (transactions: TxResponseItem[]): Promise<string | undefined> => {\n let lastTxHash: string | undefined;\n\n for (const txItem of transactions) {\n const txRequest = toTransactionRequest(txItem);\n // executeTransactionAndWait should wait for receipt before returning\n const txHash = await executeTransactionAndWait(txRequest);\n\n if (!txHash) {\n throw new Error(`Transaction failed: ${txItem.description || \"Unknown transaction\"}`);\n }\n\n lastTxHash = txHash;\n }\n\n return lastTxHash;\n },\n [executeTransactionAndWait, toTransactionRequest]\n );\n\n const attributeTransactionSafely = useCallback(\n async (actionId: string, txHash: string): Promise<void> => {\n try {\n await attributeAction.mutateAsync({ actionId, txHash });\n } catch (attributeError) {\n console.warn(\"[useEarnWithdraw] Attribution failed (non-blocking):\", attributeError);\n }\n },\n [attributeAction]\n );\n\n const withdraw = useCallback(\n async (\n amount: bigint,\n tokenOut?: string,\n slippageBps?: number,\n ): Promise<string | undefined> => {\n setError(null);\n\n if (!opportunity?.id) {\n throw new Error(\"No opportunity selected\");\n }\n\n if (!userAddress) {\n throw new Error(\"No wallet connected\");\n }\n\n if (amount <= 0n) {\n throw new Error(\"Amount must be greater than 0\");\n }\n\n try {\n const actionResponse = await withdrawAction.mutateAsync({\n opportunityId: opportunity.id,\n userAddress,\n amount: amount.toString(),\n distributorId,\n tokenOut,\n slippageBps,\n });\n\n const { actionId, transactions } = actionResponse;\n\n if (!transactions || transactions.length === 0) {\n throw new Error(\"No transactions returned from withdraw action\");\n }\n\n const txWithMetadata = transactions.find((tx) => tx.metadata);\n if (txWithMetadata?.metadata) {\n setMetadata(txWithMetadata.metadata);\n }\n\n const hasApproveTx = transactions.some((tx) => tx.type === \"approve\");\n setHasApprove(hasApproveTx);\n\n setIsConfirming(true);\n const finalTxHash = await executeTransactionsSequentially(transactions);\n\n if (actionId && finalTxHash) {\n await attributeTransactionSafely(actionId, finalTxHash);\n }\n\n if (userAddress) {\n queryClient.invalidateQueries({\n queryKey: balanceQueries.portfolio(userAddress).queryKey,\n });\n }\n onSuccess?.();\n\n return finalTxHash;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsConfirming(false);\n }\n },\n [\n opportunity?.id,\n userAddress,\n distributorId,\n withdrawAction,\n executeTransactionsSequentially,\n attributeTransactionSafely,\n queryClient,\n onSuccess,\n ]\n );\n\n const resetMetadata = useCallback(() => {\n setMetadata(null);\n setHasApprove(false);\n }, []);\n\n return {\n withdraw,\n isPending: withdrawAction.isPending,\n isConfirming,\n error,\n metadata,\n hasApprove,\n resetMetadata,\n };\n}\n","import { useState, useEffect, useMemo, useCallback } from \"react\";\nimport type { TokenBalance } from \"../../balance/types\";\nimport type { Token } from \"../../supported-tokens\";\nimport { useTokenBalance } from \"../../balance/hooks/useTokenBalance\";\n\nexport interface UseWithdrawSelectionOptions {\n /** Receipt token balance (input token for withdrawals) */\n receiptTokenBalance: TokenBalance | null;\n /** Available tokens the user can withdraw into */\n withdrawTokens: Token[];\n /** Opportunity ID - used to reset selection when opportunity changes */\n opportunityId: string | undefined;\n}\n\nexport interface UseWithdrawSelectionReturn {\n /** Current input amount as string */\n amount: string | undefined;\n /** Set the input amount */\n setAmount: (amount: string | undefined) => void;\n /** Currently selected withdraw token address */\n selectedWithdrawTokenAddress: string | undefined;\n /** Set the selected withdraw token address */\n setSelectedWithdrawTokenAddress: (address: string | undefined) => void;\n /** The selected withdraw token data */\n selectedWithdrawToken: Token | null;\n /** Receipt token balance data */\n receiptTokenBalance: TokenBalance | null;\n /** Amount converted to bigint (wei) */\n amountBigInt: bigint | undefined;\n /** USD value of the current amount (formatted string) */\n usdValue: string | undefined;\n /** Whether current amount exceeds balance */\n hasInsufficientBalance: boolean;\n /** Handler for max button click */\n handleMaxClick: () => void;\n /** Reset selection to initial state */\n reset: () => void;\n}\n\n/**\n * Hook to manage receipt token balance and amount input for withdrawals.\n * Handles:\n * - Amount input state with bigint conversion\n * - Withdraw token selection (output token user wants to receive)\n * - USD value calculation\n * - Balance validation\n * - Reset on opportunity change\n */\nexport function useWithdrawSelection({\n receiptTokenBalance,\n withdrawTokens,\n opportunityId,\n}: UseWithdrawSelectionOptions): UseWithdrawSelectionReturn {\n const [amount, setAmount] = useState<string | undefined>();\n const [selectedWithdrawTokenAddress, setSelectedWithdrawTokenAddress] = useState<\n string | undefined\n >();\n\n // Reset selection when opportunity changes\n useEffect(() => {\n setAmount(undefined);\n setSelectedWithdrawTokenAddress(undefined);\n }, [opportunityId]);\n\n // Auto-select first withdraw token when tokens change and current selection is invalid\n useEffect(() => {\n if (withdrawTokens.length === 0) return;\n\n const tokenExists = withdrawTokens.some(\n (t) => t.address === selectedWithdrawTokenAddress\n );\n\n if (!selectedWithdrawTokenAddress || !tokenExists) {\n setSelectedWithdrawTokenAddress(withdrawTokens[0].address);\n }\n }, [selectedWithdrawTokenAddress, withdrawTokens]);\n\n // Find selected withdraw token\n const selectedWithdrawToken = useMemo(\n () => withdrawTokens.find((t) => t.address === selectedWithdrawTokenAddress) ?? null,\n [withdrawTokens, selectedWithdrawTokenAddress]\n );\n\n // Use existing token balance hook for calculations — passing receiptTokenBalance\n const { handleMaxClick, amountBigInt, usdValue, hasInsufficientBalance } = useTokenBalance({\n tokenBalance: receiptTokenBalance,\n amount,\n setAmount,\n });\n\n // Reset function\n const reset = useCallback(() => {\n setAmount(undefined);\n setSelectedWithdrawTokenAddress(undefined);\n }, []);\n\n return {\n amount,\n setAmount,\n selectedWithdrawTokenAddress,\n setSelectedWithdrawTokenAddress,\n selectedWithdrawToken,\n receiptTokenBalance,\n amountBigInt,\n usdValue,\n hasInsufficientBalance,\n handleMaxClick,\n reset,\n };\n}\n","import { useMemo } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport { Opportunity } from \"../../opportunities\";\n\nexport interface UseWithdrawValidationOptions {\n opportunity: Opportunity | null;\n receiptTokenBalance: TokenBalance | null;\n amountBigInt: bigint | undefined;\n hasInsufficientBalance: boolean;\n isPending?: boolean;\n isConfirming?: boolean;\n /** Current wallet chain ID */\n walletChainId?: number;\n}\n\nexport interface WithdrawValidationResult {\n // Main validation state\n canWithdraw: boolean;\n\n // Individual validations\n isWithdrawDisabled: boolean;\n hasInsufficientBalance: boolean;\n isZeroAmount: boolean;\n hasAsyncWithdraw: boolean;\n isSecondaryOnly: boolean;\n\n // Chain validation\n isWrongChain: boolean;\n requiredChainId: number | null;\n\n // Fee information\n withdrawalFee: number | null;\n withdrawalCooldownSecs: number | null;\n withdrawalDisabledReason: string | null;\n\n // Button state\n buttonText: string;\n validationMessage: string | null;\n}\n\n/**\n * Hook for withdraw validation logic.\n * Consolidates all validation checks for withdraw operations.\n */\nexport function useWithdrawValidation({\n opportunity,\n receiptTokenBalance,\n amountBigInt,\n hasInsufficientBalance,\n isPending = false,\n isConfirming = false,\n walletChainId,\n}: UseWithdrawValidationOptions): WithdrawValidationResult {\n return useMemo(() => {\n if (!opportunity) {\n return {\n canWithdraw: false,\n isWithdrawDisabled: false,\n hasInsufficientBalance: false,\n isZeroAmount: true,\n hasAsyncWithdraw: false,\n isSecondaryOnly: false,\n isWrongChain: false,\n requiredChainId: null,\n withdrawalFee: null,\n withdrawalCooldownSecs: null,\n withdrawalDisabledReason: null,\n buttonText: \"Select opportunity\",\n validationMessage: \"Please select an opportunity\",\n };\n }\n\n const vaultConfig = opportunity.vaultConfig;\n\n const isWithdrawDisabled = opportunity.withdrawalDisabled ?? false;\n const withdrawalDisabledReason = opportunity.withdrawalDisabledReason || null;\n\n const withdrawalFee = vaultConfig?.withdrawalFee ?? null;\n const withdrawalCooldownSecs = vaultConfig?.withdrawalCooldownSecs ?? null;\n\n const hasAsyncWithdraw = vaultConfig?.asyncWithdraw === true;\n const isSecondaryOnly = vaultConfig?.secondaryOnly === true;\n\n // Chain validation\n const requiredChainId = Number(opportunity.receiptToken.chain.chainId);\n const isWrongChain = walletChainId !== undefined && walletChainId !== requiredChainId;\n\n const isZeroAmount = !amountBigInt || amountBigInt <= 0n;\n\n // Button text priority\n let buttonText: string;\n let validationMessage: string | null = null;\n\n if (isWrongChain) {\n buttonText = \"Switch chain\";\n } else if (isPending) {\n buttonText = \"Confirming...\";\n } else if (isConfirming) {\n buttonText = \"Processing...\";\n } else if (isWithdrawDisabled) {\n buttonText = withdrawalDisabledReason || \"Withdrawals disabled\";\n validationMessage =\n withdrawalDisabledReason || \"Withdrawals are currently disabled for this opportunity\";\n } else if (isZeroAmount) {\n buttonText = \"Enter amount\";\n } else if (hasInsufficientBalance) {\n buttonText = \"Insufficient balance\";\n validationMessage = \"Your balance is insufficient for this withdrawal amount\";\n } else if (hasAsyncWithdraw) {\n buttonText = \"Request withdraw\";\n } else if (isSecondaryOnly) {\n buttonText = \"Sell\";\n } else {\n buttonText = \"Withdraw\";\n }\n\n const isWithdrawing = isPending || isConfirming;\n const canWithdraw =\n !isWithdrawDisabled &&\n !isZeroAmount &&\n !hasInsufficientBalance &&\n !isWithdrawing;\n\n return {\n canWithdraw,\n isWithdrawDisabled,\n hasInsufficientBalance,\n isZeroAmount,\n hasAsyncWithdraw,\n isSecondaryOnly,\n isWrongChain,\n requiredChainId,\n withdrawalFee,\n withdrawalCooldownSecs,\n withdrawalDisabledReason,\n buttonText,\n validationMessage,\n };\n }, [opportunity, amountBigInt, hasInsufficientBalance, isPending, isConfirming, walletChainId]);\n}\n","import { useCallback } from \"react\";\n\nimport type { TokenBalance } from \"../../balance/types\";\nimport type { Token } from \"../../supported-tokens\";\nimport type { TransactionRequest } from \"../../earn-actions/useEarnDeposit\";\nimport { Opportunity } from \"../../opportunities\";\nimport { useEarnWithdraw } from \"../../earn-actions/useEarnWithdraw\";\nimport { useWithdrawSelection, type UseWithdrawSelectionReturn } from \"./useWithdrawSelection\";\nimport { useWithdrawValidation, type WithdrawValidationResult } from \"./useWithdrawValidation\";\n\nexport interface UseWithdrawFlowOptions {\n opportunity: Opportunity | null;\n userAddress: string | undefined;\n distributorId: string;\n receiptTokenBalance: TokenBalance | null;\n withdrawTokens: Token[];\n /**\n * Execute a transaction and wait for receipt confirmation.\n * IMPORTANT: This function MUST wait for the transaction receipt before returning.\n * The returned hash should only be provided after the transaction is confirmed on-chain.\n */\n executeTransactionAndWait: (tx: TransactionRequest) => Promise<string | undefined>;\n onWithdrawSuccess?: () => void;\n refetchBalances?: () => void;\n /** Current wallet chain ID for chain validation */\n walletChainId?: number;\n}\n\nexport interface UseWithdrawFlowReturn {\n selection: UseWithdrawSelectionReturn;\n validation: WithdrawValidationResult;\n withdraw: {\n execute: () => Promise<string | undefined>;\n isPending: boolean;\n isConfirming: boolean;\n isWithdrawing: boolean;\n error: Error | null;\n };\n}\n\n/** Orchestrates withdraw token selection, validation, and withdraw execution */\nexport function useWithdrawFlow({\n opportunity,\n userAddress,\n distributorId,\n receiptTokenBalance,\n withdrawTokens,\n executeTransactionAndWait,\n onWithdrawSuccess,\n refetchBalances,\n walletChainId,\n}: UseWithdrawFlowOptions): UseWithdrawFlowReturn {\n const selection = useWithdrawSelection({\n receiptTokenBalance,\n withdrawTokens,\n opportunityId: opportunity?.id,\n });\n\n const earnWithdraw = useEarnWithdraw({\n opportunity,\n userAddress,\n distributorId,\n executeTransactionAndWait,\n onSuccess: () => {\n selection.setAmount(undefined);\n refetchBalances?.();\n onWithdrawSuccess?.();\n },\n });\n\n const isWithdrawing = earnWithdraw.isPending || earnWithdraw.isConfirming;\n\n const validation = useWithdrawValidation({\n opportunity,\n receiptTokenBalance,\n amountBigInt: selection.amountBigInt,\n hasInsufficientBalance: selection.hasInsufficientBalance,\n isPending: earnWithdraw.isPending,\n isConfirming: earnWithdraw.isConfirming,\n walletChainId,\n });\n\n const execute = useCallback(async () => {\n if (!selection.amountBigInt || !opportunity || !selection.selectedWithdrawTokenAddress) {\n return undefined;\n }\n const tokenOut = withdrawTokens.length > 1\n ? selection.selectedWithdrawTokenAddress\n : undefined;\n return earnWithdraw.withdraw(selection.amountBigInt, tokenOut);\n }, [selection.amountBigInt, selection.selectedWithdrawTokenAddress, earnWithdraw, opportunity, withdrawTokens]);\n\n return {\n selection,\n validation,\n withdraw: {\n execute,\n isPending: earnWithdraw.isPending,\n isConfirming: earnWithdraw.isConfirming,\n isWithdrawing,\n error: earnWithdraw.error,\n },\n };\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { ensoBalancesQueries } from \"./queries\";\nimport type { WalletBalancesResponse } from \"./schemas\";\n\ninterface MultiChainBalancesParams {\n chainIds: number[];\n address?: string;\n}\n\ninterface MultiChainBalancesResult {\n balances: Record<number, WalletBalancesResponse[\"balances\"]>;\n isLoading: boolean;\n error: Error | null;\n refetchAll: () => void;\n}\n\nexport function useMultiChainBalances({\n chainIds,\n address,\n}: MultiChainBalancesParams): MultiChainBalancesResult {\n const queries = useQueries({\n queries: chainIds.map((chainId) => ({\n ...ensoBalancesQueries.byParams({ user: address || \"\", chain: chainId }),\n enabled: !!address,\n staleTime: 60 * 1000,\n refetchInterval: 3 * 60 * 1000,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n })),\n });\n\n const isLoading = queries.some((query) => query.isLoading);\n const error = queries.find((query) => query.error)?.error || null;\n\n const refetchAll = () => {\n queries.forEach((query) => {\n query.refetch();\n });\n };\n\n // Aggregate results\n const balances = useMemo(() => {\n const balanceMap: Record<number, WalletBalancesResponse[\"balances\"]> = {};\n\n queries.forEach((query, index) => {\n const chainId = chainIds[index];\n if (query.data && chainId !== undefined) {\n balanceMap[chainId] = query.data.balances;\n }\n });\n\n return balanceMap;\n }, [queries, chainIds]);\n\n return {\n balances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","import { useMutation, type UseMutationOptions, useQuery } from \"@tanstack/react-query\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type {\n CreateProductInput,\n UpdateProductInput,\n UploadProductLogoRequest,\n UploadProductLogoResponse,\n ProductFilters,\n} from \"./schema\";\nimport { productsQueries } from \"./queries\";\nimport { createProduct, deleteProduct, updateProduct, uploadProductLogo } from \"./api\";\n\nexport interface UseProductsOptions {\n filters?: ProductFilters;\n enabled?: boolean;\n}\n\nexport function useProducts({ filters, enabled = true }: UseProductsOptions) {\n return useQuery({\n ...productsQueries.list(filters),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseProductOptions {\n id: string;\n enabled?: boolean;\n}\n\nexport function useProduct({ id, enabled = true }: UseProductOptions) {\n return useQuery({\n ...productsQueries.byId(id),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport function useCreateProduct(\n options?: Omit<UseMutationOptions<unknown, Error, CreateProductInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: (input) => createProduct(input),\n ...options,\n });\n}\n\nexport function useUpdateProduct(\n options?: Omit<UseMutationOptions<unknown, Error, UpdateProductInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: (input) => updateProduct(input),\n ...options,\n });\n}\n\nexport function useDeleteProduct(\n options?: Omit<UseMutationOptions<unknown, Error, string>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: (id) => deleteProduct(id),\n ...options,\n });\n}\n\nexport function useUploadProductLogo(\n options?: Omit<\n UseMutationOptions<UploadProductLogoResponse, Error, UploadProductLogoRequest>,\n \"mutationFn\"\n >\n) {\n return useMutation({\n mutationFn: (request) => uploadProductLogo(request),\n ...options,\n });\n}\n","import { useMemo } from \"react\";\nimport { useMultiChainBalances } from \"../../enso-balances/hooks\";\nimport type { TokenBalance } from \"../types\";\nimport { useSupportedTokens } from \"../../supported-tokens\";\n\nexport interface UseEnsoBalancesOptions {\n address?: string;\n chainIds: number[];\n}\n\nexport interface UseEnsoBalancesResult {\n balances: TokenBalance[];\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n/**\n * Hook to fetch Enso balances (adapter for existing useMultiChainBalances)\n * Priority 3 source - fallback balance source\n * Note: This is an adapter hook that doesn't use query factory directly\n * since it wraps the existing useMultiChainBalances hook\n */\nexport function useEnsoBalances({\n address,\n chainIds,\n}: UseEnsoBalancesOptions): UseEnsoBalancesResult {\n const { getToken, isLoading: isSupportedTokensLoading } = useSupportedTokens();\n\n const {\n balances: ensoBalances,\n isLoading,\n error,\n refetchAll,\n } = useMultiChainBalances({\n chainIds,\n address,\n });\n\n // Transform Enso balances to TokenBalance format\n const balances = useMemo(() => {\n if (isSupportedTokensLoading || isLoading) return [];\n\n const tokenBalances: TokenBalance[] = [];\n Object.entries(ensoBalances).forEach(([, chainBalances]) => {\n chainBalances.forEach((walletBalance) => {\n const chainId = walletBalance.token.chain.toString();\n\n // Try to get full token data from supported tokens\n const token = getToken(walletBalance.token.address, chainId);\n if (!token) return;\n\n tokenBalances.push({\n token,\n amount: walletBalance.amount,\n source: \"enso\",\n });\n });\n });\n\n return tokenBalances;\n }, [ensoBalances, getToken, isSupportedTokensLoading, isLoading]);\n\n return {\n balances,\n isLoading,\n error,\n refetch: refetchAll,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { widgetQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport { WidgetOpportunitiesResponse } from \"./schema\";\n\nexport function useWidgetOpportunities(distributorId: string) {\n return useQuery({\n ...widgetQueries.opportunities(distributorId),\n ...queryDefaults,\n select: (data: WidgetOpportunitiesResponse) => {\n const uniqueChainsMap = new Map(\n data.opportunities\n ?.map((opportunity) => opportunity.receiptToken?.chain)\n ?.filter((chain) => chain !== undefined)\n ?.map((chain) => [chain.id, chain]) || []\n );\n\n const chains = Array.from(uniqueChainsMap.values()) || [];\n const orderedOpportunities =\n data.opportunities?.sort((a, b) => {\n const chainDiff =\n Number(a.receiptToken.chain.chainId) - Number(b.receiptToken.chain.chainId);\n\n if (chainDiff === 0) {\n return b.turtleTvl - a.turtleTvl;\n }\n\n return chainDiff;\n }) || [];\n\n return {\n opportunities: orderedOpportunities,\n chains,\n };\n },\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { UseQueryResult } from \"@tanstack/react-query\";\nimport { geocheckQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport { apiClient } from \"../lib/api-client\";\nimport type { GeoCheckResponse } from \"./schema\";\n\nexport interface UseGeocheckOptions {\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n}\n\n/**\n * Hook to check if the user's location allows interaction with the platform\n *\n * @example\n * ```tsx\n * const { data: geocheck, isLoading } = useGeocheck();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (!geocheck?.canInteract) return <div>Service not available in your region</div>;\n * ```\n */\nexport function useGeocheck(options: UseGeocheckOptions = {}): UseQueryResult<GeoCheckResponse> {\n const { enabled = true, staleTime, gcTime } = options;\n const { disableGeocheck } = apiClient.getConfig();\n\n return useQuery({\n ...geocheckQueries.check,\n ...queryDefaults,\n enabled: enabled && !disableGeocheck,\n ...(disableGeocheck && { initialData: { canInteract: true } }),\n staleTime: staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: gcTime ?? 10 * 60 * 1000, // 10 minutes\n });\n}\n","import type { EarnRouteParams } from \"../earn-route\";\nimport { useEarnRoute } from \"../earn-route\";\nimport { useMemo } from \"react\";\nimport { processRouteDetails } from \"./route-processor\";\n\nconst NATIVE_TOKEN_ADDRESS = \"0x0000000000000000000000000000000000000000\";\nconst ENSO_NATIVE_TOKEN_ADDRESS = \"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE\";\n\n// Convert native token address (0x0000...) to Enso format (0xeeee...)\nfunction toEnsoTokenAddress(address: string): string {\n if (address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) {\n return ENSO_NATIVE_TOKEN_ADDRESS;\n }\n return address;\n}\n\n// Simplified options type to inject context data from outside\nexport type UseSwapRouteProps = Omit<\n EarnRouteParams,\n \"user\" | \"id\" | \"distributor_id\" | \"referral_code\"\n>;\n\nexport function useSwapRoute(\n isEnabled: boolean,\n userAddress: string,\n distributorId: string,\n options: UseSwapRouteProps | undefined,\n referralCode?: string\n) {\n const params: EarnRouteParams | undefined = useMemo(() => {\n if (!options || !isEnabled) return undefined;\n\n return {\n ...options,\n user: userAddress,\n distributor_id: distributorId,\n referral_code: referralCode,\n };\n }, [options, userAddress, distributorId, referralCode]);\n\n // Validate required parameters\n const hasRequiredParams = useMemo(() => {\n return !!(\n userAddress &&\n params?.token_in &&\n params?.token_out &&\n params?.amount &&\n params?.chain &&\n params?.slippage &&\n params?.distributor_id\n );\n }, [options]);\n\n // Get the route\n const { data, isLoading, error } = useEarnRoute({\n params: {\n user: params?.user ?? \"\",\n chain: params?.chain ?? 1,\n slippage: params?.slippage ?? 1,\n distributor_id: params?.distributor_id ?? \"\",\n referral_code: params?.referral_code ?? \"\",\n id: params?.id ?? \"\",\n amount: params?.amount ?? \"\",\n token_in: toEnsoTokenAddress(params?.token_in ?? \"\") ?? \"\",\n token_out: toEnsoTokenAddress(options?.token_out ?? \"\") ?? \"\",\n },\n enabled: hasRequiredParams && isEnabled,\n });\n\n // Parse route details\n const routeDetails = useMemo(() => processRouteDetails(data ?? null), [data]);\n\n return {\n fetchedRoute: data ?? null,\n outputAmount: data?.amount_out ?? undefined,\n isReady: hasRequiredParams && data && !isLoading,\n hasRequiredParams,\n routeDetails,\n routeError: error,\n isLoadingRoute: isLoading,\n };\n}\n","import type {\n EarnRouteResponse,\n RouterStep,\n RouterSubstep,\n RouteToken,\n} from \"../earn-route\";\nimport { formatToken } from \"@turtleclub/utils\";\n\nexport interface SimpleToken {\n icon?: React.ReactNode | string;\n symbol: string;\n}\n\nexport interface TokenStep {\n in: SimpleToken;\n out: SimpleToken | null;\n type: \"approve\" | \"swap\" | \"deposit\";\n amount?: string;\n}\n\nconst parseEnsoStep = (\n kind: \"swap\" | \"deposit\",\n fromToken: RouteToken,\n toToken: RouteToken\n): TokenStep => {\n return {\n in: {\n icon: fromToken.logos[0],\n symbol: fromToken.symbol,\n },\n out: {\n icon: toToken.logos[0],\n symbol: toToken.symbol,\n },\n amount: undefined,\n type: kind,\n };\n};\n\nconst parseApproveStep = (token: RouteToken, amount: string): TokenStep => {\n return {\n in: {\n icon: token.logos[0],\n symbol: token.symbol,\n },\n out: null,\n amount: formatToken(amount, { decimals: token.decimals }, true, false, 4),\n type: \"approve\",\n };\n};\n\n/**\n * Process the route steps to extract token flow for RouteDetails component\n */\nexport function processRouteDetails(data: EarnRouteResponse | null): TokenStep[] {\n if (!data) return [];\n\n const tokens: TokenStep[] = [];\n data.steps.forEach((step: RouterStep) => {\n // Approve steps\n if (step.kind === \"approve\" && step.token) {\n const approveStep = parseApproveStep(step.token, step.amount);\n tokens.push(approveStep);\n }\n\n // Enso steps (swaps)\n if (step.kind === \"enso\" && step.substeps) {\n step.substeps.forEach((substep: RouterSubstep) => {\n const fromToken = substep.from[0];\n const toToken = substep.to[0];\n const step: TokenStep = parseEnsoStep(substep.kind, fromToken, toToken);\n tokens.push(step);\n });\n }\n });\n\n return tokens;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetUserByIdInput, GetUserTurtlePortfolioInput } from \"./schemas\";\nimport { usersQueries } from \"./queries\";\n\nexport interface UseUserByIdOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useUserById({ userId, enabled = true }: UseUserByIdOptions) {\n return useQuery({\n ...usersQueries.byId({ userId }),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseUserPortfolioOptions {\n userId: string;\n enabled?: boolean;\n}\n\nexport function useUserPortfolio({ userId, enabled = true }: UseUserPortfolioOptions) {\n const input: GetUserTurtlePortfolioInput = { userId };\n\n return useQuery({\n ...usersQueries.portfolio(input),\n ...queryDefaults,\n enabled,\n });\n}\n","import { skipToken, useQuery } from \"@tanstack/react-query\";\nimport { createQueryOptions } from \"../lib/query-config\";\nimport { nftsQueries } from \"./queries\";\nimport type { UserNft } from \"./schema\";\n\nexport interface UseUserNftsOptions {\n userAddress: string | undefined;\n chain: number;\n tokenAddress?: string;\n refetchInterval?: number | false;\n}\n\nexport function useUserNfts({ userAddress, chain, tokenAddress, refetchInterval }: UseUserNftsOptions) {\n return useQuery(\n userAddress\n ? createQueryOptions(nftsQueries.byUser(userAddress, chain), {\n select: (data: UserNft[]) =>\n tokenAddress\n ? data.filter((nft) => nft.token.toLowerCase() === tokenAddress.toLowerCase())\n : data,\n refetchInterval,\n })\n : { queryKey: [\"nfts\", \"byUser\", \"skip\"], queryFn: skipToken }\n );\n}\n\n","import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { submitCoverRequest } from \"./api\";\nimport { coversQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\n\nexport interface UseSubmitCoverRequestOptions {\n onSuccess?: (message: string) => void;\n onError?: (message: string) => void;\n}\n\nexport function useSubmitCoverRequest(options?: UseSubmitCoverRequestOptions) {\n return useMutation({\n mutationFn: submitCoverRequest,\n onSuccess: () => {\n options?.onSuccess?.(\"Cover request submitted successfully!\");\n },\n onError: (error) => {\n console.error(\"[useSubmitCoverRequest]\", error);\n options?.onError?.(\"Failed to submit Cover Request\");\n },\n });\n}\n\nexport interface UseCheckCoverRequestOptions {\n protocolName: string;\n enabled?: boolean;\n}\n\nexport function useCheckCoverRequest({\n protocolName,\n enabled,\n}: UseCheckCoverRequestOptions) {\n return useQuery({\n ...coversQueries.check(protocolName),\n ...queryDefaults,\n enabled: enabled ?? !!protocolName,\n });\n}\n","import { useEffect, useRef, useCallback } from \"react\";\nimport {\n useCheckMembership,\n useCreateMembershipAgreement,\n useCreateMembership,\n} from \"../earn-membership/hooks\";\nimport type { WalletEcosystem } from \"../earn-membership/schema\";\n\nexport interface UseTurtleMembershipFlowOptions {\n /** The wallet address to check/create membership for */\n address: string | undefined;\n /** The blockchain ecosystem (evm, solana, or ton) */\n walletEcosystem: WalletEcosystem;\n /** Function to sign the membership agreement message */\n signMessage: (message: string) => Promise<string>;\n /** The current chain ID (optional, defaults to \"1\" for Ethereum mainnet) */\n chainId?: string;\n /** The URL to include in the membership agreement (optional, defaults to current page URL) */\n url?: string;\n /** Whether the hook should automatically run the membership flow (default: true) */\n enabled?: boolean;\n /** Callback when membership flow fails or user rejects signing */\n onError?: (error: { type: 'signature_rejected' | 'membership_failed'; message: string }) => void | Promise<void>;\n}\n\nexport interface UseTurtleMembershipFlowReturn {\n /** Whether the user is a member */\n isMember: boolean | undefined;\n /** Whether the membership flow is currently processing */\n isLoading: boolean;\n /** Any error that occurred during the membership flow */\n error: string | null;\n /** Manually trigger the membership flow (useful when enabled is false) */\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to orchestrate the membership flow.\n * When an address is provided, it:\n * 1. Checks if the user is already a member\n * 2. If not, creates a membership agreement (gets message and nonce)\n * 3. Signs the message using the provided signMessage function\n * 4. Creates the membership with the signature\n *\n * @example\n * ```typescript\n * const { isMember, isLoading, error } = useTurtleMembershipFlow({\n * address: userWalletAddress,\n * walletEcosystem: \"evm\",\n * signMessage: async (message) => {\n * return await wallet.signMessage(message);\n * }\n * });\n * ```\n */\nexport const useTurtleMembershipFlow = ({\n address,\n walletEcosystem = \"evm\",\n signMessage,\n chainId = \"1\",\n url,\n enabled = true,\n onError,\n}: UseTurtleMembershipFlowOptions): UseTurtleMembershipFlowReturn => {\n const previousAddressRef = useRef<string | undefined>(undefined);\n const isProcessingRef = useRef(false);\n\n // Always check membership when address exists (regardless of enabled flag)\n // The enabled flag only controls auto-triggering the flow\n const {\n data: membershipData,\n isLoading: isCheckingMembership,\n } = useCheckMembership({\n params: {\n address: address || \"\",\n walletEcosystem,\n },\n enabled: !!address,\n });\n\n const {\n mutateAsync: createAgreement,\n isPending: isCreatingAgreement,\n error: agreementError,\n } = useCreateMembershipAgreement();\n\n const {\n mutateAsync: createMembership,\n isPending: isCreatingMembership,\n error: membershipError,\n } = useCreateMembership();\n\n const handleMembershipFlow = useCallback(async (memberAddress: string) => {\n if (isProcessingRef.current) return;\n isProcessingRef.current = true;\n\n try {\n // Create agreement to get message and nonce\n const agreementResult = await createAgreement({\n address: memberAddress,\n walletEcosystem,\n url: url || (typeof window !== \"undefined\" ? window.location.href : \"\"),\n chainId,\n });\n\n // Sign the message using the provided signMessage function\n let signature: string;\n try {\n signature = await signMessage(agreementResult.message);\n } catch (signError: any) {\n // User rejected the signature request\n const errorMessage = signError?.message || \"User rejected signature\";\n\n if (onError) {\n await onError({\n type: 'signature_rejected',\n message: errorMessage,\n });\n }\n return;\n }\n\n // Create membership with signature\n const membershipResult = await createMembership({\n address: memberAddress,\n walletEcosystem,\n signature,\n nonce: agreementResult.nonce,\n });\n\n if (!membershipResult.isMember && membershipResult.error) {\n const errorMessage = membershipResult.error;\n\n\n if (onError) {\n await onError({\n type: 'membership_failed',\n message: errorMessage,\n });\n }\n }\n } catch (error: any) {\n const errorMessage = error?.message || \"Unknown error during membership flow\";\n\n if (onError) {\n await onError({\n type: 'membership_failed',\n message: errorMessage,\n });\n }\n } finally {\n isProcessingRef.current = false;\n }\n }, [createAgreement, walletEcosystem, url, chainId, signMessage, createMembership, onError]);\n\n // Watch for address changes and initial membership data load\n useEffect(() => {\n if (!enabled) return;\n\n const currentAddress = address;\n\n // Only proceed if address exists\n if (!currentAddress) {\n // Reset when address becomes undefined\n if (previousAddressRef.current !== undefined) {\n previousAddressRef.current = undefined;\n }\n return;\n }\n\n // Wait for initial membership check to complete\n if (isCheckingMembership) {\n return;\n }\n\n // If address changed to a new value\n if (currentAddress !== previousAddressRef.current) {\n previousAddressRef.current = currentAddress;\n\n // Check if already a member from the initial query\n if (membershipData?.isMember) {\n return;\n }\n\n handleMembershipFlow(currentAddress);\n }\n }, [address, enabled, isCheckingMembership, membershipData, handleMembershipFlow]);\n\n const refetch = async () => {\n if (address) {\n await handleMembershipFlow(address);\n }\n };\n\n const isLoading = isCheckingMembership || isCreatingAgreement || isCreatingMembership;\n const error = agreementError?.message || membershipError?.message || null;\n\n return {\n isMember: membershipData?.isMember,\n isLoading,\n error,\n refetch,\n };\n};\n","import {\n useMutation,\n UseMutationOptions,\n useQuery,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type {\n CreateIncentiveInput,\n IncentivesResponse,\n UpdateIncentiveInput,\n IncentiveResponse,\n UploadIncentiveIconRequest,\n UploadIncentiveIconResponse,\n} from \"./schema\";\nimport { incentivesQueries } from \"./queries\";\nimport { createIncentive, deleteIncentive, updateIncentive, uploadIncentiveIcon } from \"./api\";\n\nexport function useIncentives({ enabled = true }: { enabled?: boolean }) {\n return useQuery({\n ...incentivesQueries.all,\n ...queryDefaults,\n enabled,\n });\n}\n\nexport interface UseIncentiveOptions {\n id: string;\n enabled?: boolean;\n}\n\nexport function useIncentive({ id, enabled = true }: UseIncentiveOptions) {\n return useQuery({\n ...incentivesQueries.byId(id),\n ...queryDefaults,\n enabled,\n });\n}\n\nexport function useCreateIncentive(\n options?: Omit<UseMutationOptions<unknown, Error, CreateIncentiveInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: createIncentive,\n ...options,\n });\n}\n\nexport function useUpdateIncentive(\n options?: Omit<UseMutationOptions<unknown, Error, UpdateIncentiveInput>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: updateIncentive,\n ...options,\n });\n}\n\nexport function useDeleteIncentive(\n options?: Omit<UseMutationOptions<unknown, Error, string>, \"mutationFn\">\n) {\n return useMutation({\n mutationFn: deleteIncentive,\n ...options,\n });\n}\n\nexport function useUploadIncentiveIcon(\n options?: Omit<\n UseMutationOptions<UploadIncentiveIconResponse, Error, UploadIncentiveIconRequest>,\n \"mutationFn\"\n >\n) {\n return useMutation({\n mutationFn: uploadIncentiveIcon,\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from '@tanstack/react-query'\nimport type { UpdateDistributorEarnDetailsInput } from './schema'\nimport { updateDistributorEarnDetails } from './api'\n\nexport function useUpdateDistributorEarnDetails(\n options?: Omit<\n UseMutationOptions<unknown, Error, UpdateDistributorEarnDetailsInput>,\n 'mutationFn'\n >\n) {\n return useMutation({\n mutationFn: updateDistributorEarnDetails,\n ...options,\n })\n}\n","import { z } from \"zod\";\n\n// Update Distributor Earn Details Input schema\nexport const updateDistributorEarnDetailsInputSchema = z.object({\n organizationId: z.string().uuid(),\n distributorId: z.string().uuid(),\n earnDetails: z.any(), // JSONB value - using any for now as requested\n});\n\n// Update Distributor Earn Details Response schema\nexport const updateDistributorEarnDetailsResponseSchema = z.object({\n success: z.boolean(),\n});\n\n// Type exports\nexport type UpdateDistributorEarnDetailsInput = z.infer<\n typeof updateDistributorEarnDetailsInputSchema\n>;\nexport type UpdateDistributorEarnDetailsResponse = z.infer<\n typeof updateDistributorEarnDetailsResponseSchema\n>;\n","import { apiClient } from \"../lib/api-client\";\nimport {\n UpdateDistributorEarnDetailsInput,\n UpdateDistributorEarnDetailsResponse,\n updateDistributorEarnDetailsResponseSchema,\n} from \"./schema\";\n\n// PUT /admin/organization/{organizationId}/distributors/{distributorId}/earn-details\nexport async function updateDistributorEarnDetails(\n input: UpdateDistributorEarnDetailsInput\n): Promise<UpdateDistributorEarnDetailsResponse> {\n const { organizationId, distributorId, earnDetails } = input;\n const endpoint = `/organization/${organizationId}/distributors/${distributorId}/earn-details`;\n\n const data = await apiClient.fetch(endpoint, {\n method: \"PUT\",\n body: JSON.stringify({ earnDetails }),\n });\n\n // Validate response with Zod\n const result = updateDistributorEarnDetailsResponseSchema.safeParse(data);\n\n if (result.success === false) {\n console.log(\"[ZOD ERROR]\", result.error);\n throw new Error(`Failed to update distributor earn details: ${result.error.message}`);\n }\n return result.data;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { liquidityProvidersQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetLiquidityProvidersInput } from \"./schema\";\n\nexport interface UseLiquidityProvidersOptions {\n input: GetLiquidityProvidersInput;\n enabled?: boolean;\n}\n\nexport function useLiquidityProviders({ input, enabled = true }: UseLiquidityProvidersOptions) {\n return useQuery({\n ...liquidityProvidersQueries.list(input),\n ...queryDefaults,\n enabled,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport { orgLeaderboardQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { GetOrgLeaderboardParams } from \"./schema\";\n\n// Client cache for org leaderboard (list + user). Data is stream/snapshot based;\n// backend may not cache, so we keep responses fresh for 5 min and in cache for 10 min.\nconst orgLeaderboardCache = {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n} as const;\n\nexport interface UseOrgLeaderboardOptions {\n orgId: string;\n params?: GetOrgLeaderboardParams;\n enabled?: boolean;\n}\n\nexport function useOrgLeaderboard({\n orgId,\n params,\n enabled = true,\n}: UseOrgLeaderboardOptions) {\n const query = useQuery({\n ...orgLeaderboardQueries.list(orgId, params),\n ...queryDefaults,\n ...orgLeaderboardCache,\n enabled: enabled && !!orgId,\n });\n\n return {\n ...query,\n rows: query.data?.rows ?? [],\n total: query.data?.total,\n totalPages: query.data?.totalPages,\n };\n}\n\nexport interface UseOrgUserLeaderboardOptions {\n orgId: string;\n userId: string;\n enabled?: boolean;\n}\n\nexport function useOrgUserLeaderboard({\n orgId,\n userId,\n enabled = true,\n}: UseOrgUserLeaderboardOptions) {\n const query = useQuery({\n ...orgLeaderboardQueries.user(orgId, userId),\n ...queryDefaults,\n ...orgLeaderboardCache,\n enabled: enabled && !!orgId && !!userId,\n });\n\n return {\n ...query,\n userInfo: query.data?.userInfo,\n };\n}\n","\"use client\";\n\nimport { apiClient, type ApiClientConfig } from \"./api-client\";\nimport { ReactNode } from \"react\";\n\nexport interface TurtleHooksProviderProps extends ApiClientConfig {\n children: ReactNode;\n}\n\n/**\n * TurtleProvider - Configures the API client singleton with your settings.\n *\n * @example\n * ```tsx\n * function App() {\n * const { getAccessToken } = useAuth();\n *\n * return (\n * <TurtleProvider\n * apiUrl=\"https://api.turtle.club\"\n * earnUrl=\"https://earn.turtle.club\"\n * getToken={() => getAccessToken()}\n * earnApiKey=\"pk_live_xxxxx\"\n * debug={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </TurtleProvider>\n * );\n * }\n * ```\n */\nexport function TurtleHooksProvider({\n children,\n apiUrl,\n earnUrl,\n getToken,\n earnApiKey,\n debug,\n disableGeocheck,\n}: TurtleHooksProviderProps) {\n apiClient.configure({ apiUrl, earnUrl, getToken, earnApiKey, debug, disableGeocheck });\n\n return <>{children}</>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,6BAA+B;;;ACA/B,IAAAC,4BAAgC;;;ACAzB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AAmBtB,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACO,QACA,UACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEA,IAAM,YAAN,MAAM,WAAU;AAAA,EACd,OAAe;AAAA,EACP,SAA0B,CAAC;AAAA,EAEnC,OAAO,cAAyB;AAC9B,QAAI,CAAC,WAAU,UAAU;AACvB,iBAAU,WAAW,IAAI,WAAU;AAAA,IACrC;AACA,WAAO,WAAU;AAAA,EACnB;AAAA,EAEA,UAAU,QAA+B;AACvC,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO;AAAA,EAC5C;AAAA,EAEA,YAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,WAAW,QAA2B;AAC5C,QAAI,WAAW,QAAQ;AACrB,aAAO,KAAK,OAAO,WAAW;AAAA,IAChC;AACA,WAAO,KAAK,OAAO,UAAU;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAmB,UAAkB,SAAwC;AACjF,UAAM,EAAE,SAAS,OAAO,QAAQ,KAAK,OAAO,OAAO,MAAM,GAAG,aAAa,IAAI,WAAW,CAAC;AAEzF,UAAM,UAAU,KAAK,WAAW,MAAM;AACtC,UAAM,MAAM,GAAG,OAAO,GAAG,QAAQ;AACjC,UAAM,QAAQ,KAAK,OAAO,WAAW;AAErC,UAAM,aAAa,gBAAgB;AAEnC,UAAM,UAAuB;AAAA;AAAA,MAE3B,GAAI,CAAC,cAAc,EAAE,gBAAgB,mBAAmB;AAAA,MACxD,GAAG,aAAa;AAAA,IAClB;AAEA,QAAI,OAAO;AACT,MAAC,QAAmC,eAAe,IAAI,UAAU,KAAK;AAAA,IACxE;AAGA,QAAI,WAAW,UAAU,KAAK,OAAO,YAAY;AAC/C,MAAC,QAAmC,WAAW,IAAI,KAAK,OAAO;AAAA,IACjE;AAEA,QAAI,OAAO;AACT,cAAQ,IAAI,uBAAuB;AAAA,QACjC,QAAQ,aAAa,UAAU;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,MAAM,aAAa,eAAe;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,GAAG;AAAA,QACH;AAAA,QACA,MAAM,OAAQ,aAAa,OAAO,KAAK,UAAU,IAAI,IAAK;AAAA,MAC5D,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAI,OAAO;AACT,gBAAQ,IAAI,wBAAwB;AAAA,UAClC,QAAQ,SAAS;AAAA,UACjB,IAAI,SAAS;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI;AAAA,UACR,cAAc,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,UACpD,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,OAAO;AACT,gBAAQ,MAAM,qBAAqB,KAAK;AAAA,MAC1C;AAEA,UAAI,iBAAiB,UAAU;AAC7B,cAAM;AAAA,MACR;AAEA,YAAM,IAAI,SAAS,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB,GAAG,KAAK;AAAA,IACvF;AAAA,EACF;AACF;AAEO,IAAM,YAAY,UAAU,YAAY;;;AClI/C,IAAAC,cAAkB;;;ACAlB,IAAAC,cAAkB;;;ACAlB,IAAAC,cAAkB;;;ACAlB,iBAAkB;AAIX,IAAM,2BAA2B,aAAE,OAAO;AAAA,EAC/C,MAAM,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC;AAAA,EACrC,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAC7B,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,UAAU,aAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,cAAc,aAAE,QAAQ,EAAE,SAAS;AACrC,CAAC;;;ADRM,IAAM,gCAAgC,cAAE,KAAK,CAAC,OAAO,QAAQ,CAAC;AAC9D,IAAM,6BAA6B,cAAE,KAAK,CAAC,UAAU,UAAU,CAAC;AAEhE,IAAM,cAAc,cAAE,OAAO;AAAA,EAClC,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,EACxB,MAAM,cAAE,OAAO;AAAA,EACf,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,cAAE,OAAO;AAAA,EAClB,WAAW,cAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,8BAA8B,SAAS;AAAA,EAClD,QAAQ,2BAA2B,SAAS;AAAA,EAC5C,aAAa,cAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAGM,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,MAAM,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC5C,OAAO,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS;AAAA;AAAA,EAEvD,QAAQ,cAAE,KAAK,CAAC,QAAQ,WAAW,aAAa,MAAM,CAAC,EAAE,SAAS;AAAA,EAClE,WAAW,cAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA,EAE5C,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC5B,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC1B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA;AAC9B,CAAC;AAKM,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,QAAQ,cAAE,MAAM,WAAW;AAAA,EAC3B,YAAY,yBAAyB,SAAS;AAChD,CAAC;;;AElCD,eAAsB,mBACpB,QACA,SACkC;AAClC,QAAM,cAAc,IAAI,gBAAgB;AAExC,MAAI,QAAQ;AAEV,QAAI,OAAO,SAAS,OAAW,aAAY,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC;AAChF,QAAI,OAAO,UAAU,OAAW,aAAY,OAAO,SAAS,OAAO,MAAM,SAAS,CAAC;AAGnF,QAAI,OAAO,OAAQ,aAAY,OAAO,UAAU,OAAO,MAAM;AAC7D,QAAI,OAAO,UAAW,aAAY,OAAO,aAAa,OAAO,SAAS;AAGtE,QAAI,OAAO,UAAW,aAAY,OAAO,aAAa,OAAO,SAAS;AACtE,QAAI,OAAO,OAAQ,aAAY,OAAO,UAAU,OAAO,MAAM;AAC7D,QAAI,OAAO,QAAS,aAAY,OAAO,WAAW,OAAO,OAAO;AAChE,QAAI,OAAO,KAAM,aAAY,OAAO,QAAQ,OAAO,IAAI;AACvD,QAAI,OAAO,OAAQ,aAAY,OAAO,UAAU,OAAO,MAAM;AAAA,EAC/D;AAEA,QAAM,cAAc,YAAY,SAAS;AACzC,QAAM,WAAW,iBAAiB,cAAc,IAAI,WAAW,KAAK,EAAE;AAEtE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC7E;AACA,SAAO,OAAO;AAChB;;;AC5CA,+BAAgC;AAIzB,IAAM,6BAAyB,0CAAgB,mBAAmB;AAAA,EACvE,KAAK,CAAC,QAAkC,aAAmC;AAAA,IACzE,UAAU,CAAC,MAAM;AAAA,IACjB,SAAS,MAAM,mBAAmB,QAAQ,OAAO;AAAA,EACnD;AACF,CAAC;;;ACTD,yBAAyB;;;ACIlB,IAAM,gBAAgB;AAAA,EAC3B,WAAW,IAAI,KAAK;AAAA;AAAA,EACpB,QAAQ,KAAK,KAAK;AAAA;AAAA,EAClB,OAAO;AAAA;AAAA,EACP,sBAAsB;AAAA;AACxB;AAEO,SAAS,mBACd,aACA,SACA;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;;;ADuCO,SAAS,mBAAmB,SAA+D;AAChG,QAAM,EAAE,OAAO,UAAU,MAAM,GAAG,OAAO,IAAI,WAAW,CAAC;AAEzD,QAAM,EAAE,MAAM,WAAW,OAAO,SAAS,WAAW,QAAI,6BAAS;AAAA,IAC/D,GAAG,uBAAuB,IAAI,QAAQ,EAAE,MAAM,CAAC;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,SAAS,MAAM,UAAU,CAAC;AAChC,QAAM,aAAa,MAAM;AAEzB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,mBAAmB,CAAC,YAAoB,OAAO,KAAK,CAAC,UAAU,MAAM,YAAY,OAAO;AAAA,IACxF,gBAAgB,CAAC,SAAiB,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,IAC5E,sBAAsB,CAAC,cACrB,OAAO,OAAO,CAAC,UAAU,MAAM,cAAc,SAAS;AAAA,IACxD;AAAA,IACA,OAAO,QAAS,QAAkB;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AACF;;;ALhFA,IAAM,aAAa,cAAE,OAAO,EAAE,KAAK;AAE5B,IAAM,cAAc,cAAE,OAAO;AAAA,EAClC,IAAI;AAAA,EACJ,SAAS,cAAE,OAAO;AAAA,EAClB,MAAM,cAAE,OAAO;AAAA,EACf,QAAQ,cAAE,OAAO;AAAA,EACjB,UAAU,cAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACvC,UAAU,cAAE,QAAQ;AAAA,EACpB,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAO;AAAA,EACP,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,kBAAkB,WAAW,SAAS;AAAA,EACtC,kBAAkB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,gBAAgB,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,WAAW,cAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAGM,IAAM,uBAAuB,YAAY,OAAO;AAAA,EACrD,QAAQ,cAAE,QAAQ;AACpB,CAAC;AAGM,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,QAAQ,cAAE,MAAM,oBAAoB;AAAA,EACpC,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;;;AO7BD,eAAsB,mBACpB,SACA,SACkC;AAClC,QAAM,SAAS,IAAI,gBAAgB;AAEnC,MAAI,SAAS,WAAW,OAAW,QAAO,OAAO,UAAU,QAAQ,OAAO,SAAS,CAAC;AACpF,MAAI,SAAS,UAAU,OAAW,QAAO,OAAO,SAAS,QAAQ,MAAM,SAAS,CAAC;AACjF,MAAI,SAAS,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAC3D,MAAI,SAAS,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAC9D,MAAI,SAAS,sBAAsB;AACjC,WAAO,OAAO,wBAAwB,OAAO,QAAQ,oBAAoB,CAAC;AAAA,EAC5E;AACA,MAAI,SAAS,KAAK,QAAQ;AACxB,YAAQ,IAAI,QAAQ,CAAC,OAAO,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,EACtD;AAEA,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,iBAAiB,cAAc,IAAI,WAAW,KAAK,EAAE;AAEtE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC7E;AACA,SAAO,OAAO;AAChB;;;ACtCA,IAAAC,4BAAgC;AAIzB,IAAM,6BAAyB,2CAAgB,mBAAmB;AAAA,EACvE,MAAM,CAAC,aAAqC;AAAA,IAC1C,UAAU,CAAC,OAAO;AAAA,IAClB,SAAS,MAAM,mBAAmB,OAAO;AAAA,EAC3C;AACF,CAAC;;;ACTD,IAAAC,sBAAyB;AACzB,mBAAwB;AAwBjB,SAAS,mBAAmB;AAAA,EACjC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,MAAM,CAAC;AACT,IAA+B,CAAC,GAA6B;AAC3D,QAAM,EAAE,MAAM,WAAW,OAAO,QAAQ,QAAI,8BAAS;AAAA,IACnD,GAAG,uBAAuB,KAAK,EAAE,QAAQ,OAAO,QAAQ,SAAS,sBAAsB,IAAI,CAAC;AAAA,IAC5F,GAAG;AAAA,IACH,WAAW,IAAI,KAAK;AAAA;AAAA,IACpB,QAAQ,KAAK,KAAK;AAAA;AAAA,IAClB,sBAAsB;AAAA;AAAA,IACtB;AAAA,EACF,CAAC;AAED,QAAM,aAA2B,sBAAQ,MAAM;AAC7C,QAAI,CAAC,MAAM,OAAQ,QAAO,CAAC;AAC3B,WAAO,KAAK;AAAA,EACd,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,SAAS;AAAA,IACtB,OAAO,MAAM,SAAS;AAAA,IACtB,QAAQ,MAAM,UAAU;AAAA,IACxB;AAAA,IACA,OAAO,QAAS,QAAkB;AAAA,IAClC;AAAA,IACA,cAAc,CAAC,OAAe,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AAAA,IACpE,UAAU,CAAC,SAAiBC,aAC1B,OAAO;AAAA,MACL,CAAC,UACC,MAAM,QAAQ,YAAY,MAAM,QAAQ,YAAY,KAAK,MAAM,MAAM,YAAYA;AAAA,IACrF;AAAA,EACJ;AACF;;;AC/DA,IAAAC,cAAkB;AAGX,IAAM,kBAAkB,cAAE,OAAO;AAAA,EACtC,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,cAAE,OAAO;AAAA,EACf,aAAa,cAAE,OAAO;AAAA,EACtB,SAAS,cAAE,OAAO;AAAA,EAClB,YAAY,cAAE,OAAO;AAAA,EACrB,gBAAgB,cAAE,OAAO;AAAA,EACzB,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,EACnC,kBAAkB,cAAE,OAAO,EAAE,SAAS;AAAA,EACtC,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,EACnC,iBAAiB,cAAE,OAAO,EAAE,SAAS;AAAA,EACrC,iBAAiB,cAAE,OAAO,EAAE,SAAS;AAAA,EACrC,sBAAsB,cAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,4BAA4B,cAAE,QAAQ,EAAE,SAAS;AAAA,EACjD,uBAAuB,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,cAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,QAAQ,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACvC,QAAQ,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACzC,CAAC;AAGM,IAAM,6BAA6B,gBAAgB,KAAK;AAAA,EAC7D,IAAI;AACN,CAAC;AAGM,IAAM,6BAA6B,gBAAgB,QAAQ,EAAE,OAAO;AAAA,EACzE,IAAI,cAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAGM,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,YAAY,cAAE,MAAM,eAAe;AAAA,EACnC,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAGM,IAAM,mCAAmC,cAAE,OAAO;AAAA,EACvD,MAAM,cAAE,OAAO;AAAA,IACb,MAAM,cAAE,OAAO;AAAA,IACf,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,MAAM,cAAE,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW,QAAQ,GAAG;AAAA,MAC3D,SAAS;AAAA,IACX,CAAC;AAAA,IACD,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,CAAC;AAAA,EACD,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAW,cAAE,QAAQ,EAAE,SAAS;AAClC,CAAC;AAGM,IAAM,oCAAoC,cAAE,OAAO;AAAA,EACxD,WAAW,cAAE,OAAO,EAAE,IAAI;AAC5B,CAAC;;;AC5DD,IAAAC,cAAkB;AAGlB,IAAM,oBAAoB,cAAE,KAAK,CAAC,QAAQ,UAAU,CAAC;AAErD,IAAM,sBAAsB,cAAE,KAAK,CAAC,SAAS,UAAU,UAAU,OAAO,CAAC;AAGzE,IAAM,2BAA2B,cAAE,OAAO;AAAA,EACxC,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,cAAE,OAAO;AAAA,EACf,SAAS,cAAE,OAAO;AAAA,EAClB,YAAY,cAAE,OAAO;AACvB,CAAC;AAGM,IAAM,gBAAgB,cAAE,OAAO;AAAA,EACpC,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,cAAE,OAAO;AAAA,EACf,OAAO,cAAE,OAAO;AAAA,EAChB,UAAU,cAAE,OAAO;AAAA,EACnB,aAAa,cAAE,OAAO;AAAA,EACtB,SAAS,cAAE,OAAO;AAAA,EAClB,YAAY,cAAE,OAAO;AAAA,EACrB,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,SAAS,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACxC,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,cAAc,yBAAyB,SAAS;AAAA,EAChD,eAAe,cAAE,KAAK,MAAM,cAAE,MAAM,cAAE,IAAI,CAAC,CAAC,EAAE,QAAQ;AAAA,EACtD,WAAW,cAAE,OAAO;AACtB,CAAC;AAGM,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,SAAS,cAAc,KAAK;AAAA,IAC1B,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,cAAc;AAAA,EAChB,CAAC;AAAA,EACD,gBAAgB,cAAE,OAAO,EAAE,KAAK;AAClC,CAAC;AAEM,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,SAAS,cAAc,QAAQ,EAAE,KAAK;AAAA,IACpC,cAAc;AAAA,EAChB,CAAC;AAAA;AAEH,CAAC;AAEM,IAAM,yBAAyB,cAAE,OAAO;AAAA,EAC7C,UAAU,cAAE,MAAM,aAAa;AAAA,EAC/B,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,wBAAwB,cAAE,OAAO;AAAA,EAC5C,SAAS;AAAA,EACT,OAAO,cACJ,OAAO;AAAA,IACN,YAAY,cAAE,OAAO;AAAA,IACrB,aAAa,cAAE,OAAO;AAAA,EACxB,CAAC,EACA,SAAS;AACd,CAAC;AAEM,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAClD,IAAI,cAAE,OAAO,EAAE,KAAK;AACtB,CAAC;AAEM,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAClD,SAAS,cAAE,QAAQ;AACrB,CAAC;AAGD,IAAM,aAAa,cAAE,IAAI,EAAE,OAAO,CAAC,UAAU;AAC3C,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,EAAE,iBAAiB,MAAO,QAAO;AACrC,MAAI,MAAM,OAAO,KAAK,OAAO,KAAM,QAAO;AAC1C,SAAO;AACT,GAAG,cAAc;AAGV,IAAM,iCAAiC,cAAE,OAAO;AAAA;AAAA,EAErD,MAAM;AAAA;AAAA,EAGN,UAAU,cAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAGM,IAAM,kCAAkC,cAAE,OAAO;AAAA,EACtD,KAAK,cAAE,OAAO,EAAE,IAAI;AAAA,EACpB,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,uBAAuB,cAAE,OAAO;AAAA,EAC3C,gBAAgB,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAC7C,CAAC;;;AClGD,IAAAC,cAAkB;;;ACAlB,IAAAC,cAAkB;AAEX,IAAM,qBAAqB,cAAE,OAAO;AAAA,EACzC,IAAI,cAAE,OAAO;AAAA,EACb,MAAM,cAAE,OAAO;AAAA,EACf,aAAa,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,YAAY,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,SAAS,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACxC,kBAAkB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,yBAAyB,cACtB;AAAA,IACC,cAAE,OAAO;AAAA,MACP,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,MACpB,cAAc,cAAE,OAAO,EAAE,KAAK;AAAA,MAC9B,QAAQ,cAAE,KAAK,CAAC,WAAW,YAAY,YAAY,SAAS,CAAC;AAAA,MAC7D,gBAAgB,cAAE,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH,EACC,SAAS;AAAA,EACZ,eAAe,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,eAAe,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,QAAQ,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACvC,UAAU,cAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAC5C,CAAC;AAGM,IAAM,+BAA+B,cAAE,OAAO;AAAA,EACnD,gBAAgB,cAAE,OAAO,EAAE,KAAK;AAClC,CAAC;AAKM,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,SAAS,cAAE,QAAQ;AAAA,EACnB,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;;;AC5BD,eAAsB,kBACpB,OACkC;AAClC,QAAM,WAAW,iBAAiB,MAAM,cAAc;AAEtD,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,gDAAgD,OAAO,MAAM,OAAO,EAAE;AAAA,EACxF;AAEA,SAAO,OAAO;AAChB;;;AC1BA,IAAAC,sBAA4C;AAqCrC,SAAS,qBAAqB,SAAuC;AAC1E,aAAO,iCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;;;ACvCO,IAAM,yBAAyB;AAAA,EACpC,OAAO,CAAC,UAAkC,kBAAkB,KAAK;AACnE;;;AJCO,IAAM,oBAAoB,cAAE,OAAO;AAAA,EACxC,IAAI,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EAC/B,eAAe,mBAAmB,SAAS,EAAE,SAAS;AAAA,EACtD,SAAS,mBAAmB,SAAS,EAAE,SAAS;AAAA,EAChD,wBAAwB,cAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EACpE,2BAA2B,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1D,mBAAmB,cAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,YAAY,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,kBAAkB,cAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,gBAAgB,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/D,eAAe,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9D,YAAY,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3D,eAAe,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9D,kBAAkB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,oBAAoB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACnD,kBAAkB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,oBAAoB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACnD,iBAAiB,cAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACtD,kBAAkB,cAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,cAAc,cAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,eAAe,cAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,eAAe,cAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC5C,CAAC;AAGM,IAAM,sBAAsB,cAAE,OAAO;AAAA,EAC1C,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,UAAU,mBAAmB,SAAS;AAAA,EACtC,SAAS,mBAAmB,SAAS;AAAA,EACrC,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,EACnC,YAAY,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,kBAAkB,cAAE,IAAI,EAAE,SAAS;AAAA,EACnC,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAGM,IAAM,sBAAsB,cAAE,OAAO;AAAA,EAC1C,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,UAAU,mBAAmB,SAAS;AAAA,EACtC,SAAS,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACpC,OAAO,YAAY,SAAS;AAAA,EAC5B,wBAAwB,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5C,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AACjC,CAAC;;;AKrDD,IAAAC,sBAA2E;;;ACA3E,IAAAC,cAAkB;AAIlB,IAAM,uBAAuB,cAAE,OAAO;AAAA,EACpC,eAAe,cAAE,OAAO,EAAE,KAAK;AACjC,CAAC;AAGD,IAAM,uCAAuC,qBAAqB,OAAO;AAAA,EACvE,cAAc,cAAE,OAAO;AACzB,CAAC;AACD,IAAM,8BAA8B,qBAAqB,OAAO;AAAA,EAC9D,KAAK,cAAE,OAAO;AAChB,CAAC;AACD,IAAM,uCAAuC,qBAAqB,OAAO;AAAA,EACvE,cAAc,cAAE,OAAO;AACzB,CAAC;AAED,IAAM,2BAA2B,cAAE,MAAM;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,qCAAqC,qCAAqC,OAAO;AAAA,EACrF,aAAa;AACf,CAAC;AACD,IAAM,4BAA4B,4BAA4B,OAAO;AAAA,EACnE,aAAa;AACf,CAAC;AACD,IAAM,qCAAqC,qCAAqC,OAAO;AAAA,EACrF,aAAa;AACf,CAAC;AAED,IAAM,yBAAyB,cAAE,MAAM;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,mCAAmC,cAAE,OAAO;AAAA,EAChD,eAAe,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAC5C,CAAC;AAED,IAAM,2CAA2C,iCAAiC,OAAO;AAAA,EACvF,cAAc,cAAE,OAAO;AACzB,CAAC;AACD,IAAM,kCAAkC,iCAAiC,OAAO;AAAA,EAC9E,KAAK,cAAE,OAAO;AAChB,CAAC;AACD,IAAM,2CAA2C,iCAAiC,OAAO;AAAA,EACvF,cAAc,cAAE,OAAO;AACzB,CAAC;AAEM,IAAM,+BAA+B,cAAE,MAAM;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,iBAAiB,cAAE,OAAO;AAAA,EACrC,YAAY,cAAE,OAAO;AAAA,EACrB,mBAAmB,cAAE,OAAO;AAAA,EAC5B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,iBAAiB,cAAE,OAAO,EAAE,SAAS;AAAA,EACrC,KAAK,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACpC,SAAS,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACxC,QAAQ,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACvC,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,cAAc,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,eAAe,cAAE,OAAO,cAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC9C,YAAY,yBAAyB,SAAS;AAChD,CAAC;AAEM,IAAM,oBAAoB,cAAE,OAAO;AAAA,EACxC,IAAI,cAAE,OAAO;AAAA,EACb,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,QAAQ,cAAE,OAAO;AAAA,EACjB,MAAM,cAAE,OAAO;AAAA,EACf,UAAU,cAAE,OAAO,OAAO,EAAE,SAAS;AAAA,EACrC,SAAS,cAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,cAAc,mBAAmB,SAAS,EAAE,SAAS;AACvD,CAAC;AAED,IAAMC,eAAc,cAAE,OAAO;AAAA,EAC3B,SAAS,cAAE,OAAO,OAAO;AAAA,EACzB,WAAW,cAAE,OAAO;AAAA,EACpB,aAAa,cAAE,OAAO;AAAA,EACtB,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,WAAW,cAAE,QAAQ;AAAA,EACrB,SAAS,cAAE,OAAO;AAAA,EAClB,MAAM,cAAE,OAAO;AAAA,EACf,MAAM,cAAE,OAAO;AAAA,EACf,QAAQ,cAAE,OAAO;AACnB,CAAC;AAED,IAAM,oBAAoB,cACvB,OAAO;AAAA,EACN,QAAQ,cAAE,QAAQ;AAAA,EAClB,SAAS,cAAE,OAAO;AAAA,EAClB,kBAAkB,cAAE,OAAO,EAAE,KAAK;AAAA,EAClC,OAAOA;AAAA,EACP,UAAU,cAAE,OAAO;AAAA,EACnB,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,UAAU,cAAE,QAAQ;AAAA,EACpB,SAAS,cAAE,OAAO;AAAA,EAClB,MAAM,cAAE,OAAO;AAAA,EACf,UAAU,cAAE,OAAO;AAAA,EACnB,QAAQ,cAAE,OAAO;AAAA,EACjB,kBAAkB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACnD,CAAC,EACA,SAAS;AAEZ,IAAM,iBAAiB,cAAE;AAAA,EACvB,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,OAAO;AAAA,IACf,QAAQ,cAAE,OAAO,cAAE,OAAO,GAAG,cAAE,OAAO,CAAC;AAAA,EACzC,CAAC;AACH;AAEA,IAAM,gBAAgB,cAAE,OAAO;AAAA,EAC7B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC5B,QAAQ,cAAE,OAAO;AAAA;AACnB,CAAC;AAED,IAAM,oBAAoB,cAAE,OAAO;AAAA,EACjC,UAAU,cAAE,MAAM,aAAa;AAAA,EAC/B,OAAO,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACxC,CAAC;AAED,IAAM,oBAAoB,cAAE,OAAO;AAAA,EACjC,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,KAAK,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EACzB,gBAAgB,cAAE,OAAO;AAAA;AAAA,EACzB,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAED,IAAM,YAAY,cAAE,OAAO;AAAA,EACzB,wBAAwB,cAAE,MAAM,iBAAiB;AAAA,EACjD,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,0BAA0B,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,sBAAsB,cAAE,QAAQ;AAAA,EAChC,cAAc,cAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA,EAClD,iBAAiB,kBAAkB,SAAS;AAC9C,CAAC;AAEM,IAAM,eAAe,cAAE,OAAO;AAAA,EACnC,UAAU;AAAA,EACV,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,cAAE,OAAO,EAAE,SAAS;AAAA,EAChC,aAAa,cAAE,QAAQ;AAAA,EACvB,mBAAmB,eAAe,SAAS;AAAA,EAC3C,iBAAiB,cAAE,OAAO,EAAE,SAAS;AAAA,EACrC,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,qBAAqB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACpD,YAAY;AAAA,EACZ,cAAc,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,KAAK,UAAU,SAAS;AAAA,EACxB,sBAAsB,cAAE,QAAQ;AAAA,EAChC,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,cAAc,eAAe,SAAS;AAAA,EACtC,6BAA6B,cAAE,QAAQ;AAAA,EACvC,OAAO,cAAE,OAAO,EAAE,KAAK;AAAA,EACvB,OAAO,kBAAkB,SAAS,EAAE,SAAS;AAAA,EAC7C,aAAa;AAAA,EACb,2BAA2B,cAAE,QAAQ;AAAA,EACrC,WAAW,cAAE,MAAM,cAAc,EAAE,SAAS;AAAA,EAC5C,gBAAgB,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,UAAU,cAAE,OAAO;AAAA,EACnB,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM,cAAE,OAAO;AAAA,EACf,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQ,cAAE,OAAO,EAAE,KAAK;AAC1B,CAAC;AAIM,IAAM,yBAAyB,cAAE,OAAO;AAAA,EAC7C,SAAS,cAAE,MAAM,YAAY;AAC/B,CAAC;AAEM,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAClD,QAAQ,cAAE,MAAM,iBAAiB;AACnC,CAAC;AAEM,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAClD,MAAM,cAAE,OAAO;AAAA,EACf,QAAQ,cAAE,OAAO;AAAA,EACjB,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,cAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAChD,CAAC;AAEM,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,OAAO;AACT,CAAC;AAEM,IAAM,wCAAwC,cAAE,OAAO;AAAA,EAC5D,SAAS,cAAE,QAAQ;AAAA,EACnB,QAAQ,cAAE;AAAA,IACR,cAAE,OAAO;AAAA,MACP,IAAI,cAAE,OAAO;AAAA,MACb,MAAM,cAAE,OAAO;AAAA,MACf,MAAM,cAAE,OAAO;AAAA,MACf,SAAS,cAAE,OAAO;AAAA,MAClB,SAAS,cAAE,OAAO;AAAA,MAClB,WAAW,cAAE,OAAO;AAAA,MACpB,QAAQ,cAAE,OAAO;AAAA,MACjB,aAAa,cAAE,OAAO;AAAA,MACtB,eAAe,cAAE,OAAO;AAAA;AAAA,IAC1B,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,oCAAoC,cAAE,OAAO;AAAA,EACxD,UAAU;AAAA,EACV,SAAS,cAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY;AAAA,EACZ,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACpC,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,gBAAgB,cAAE,OAAO;AAAA,EACzB,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM,cAAE,OAAO;AAAA,EACf,eAAe,cAAE,OAAO,EAAE,SAAS;AACrC,CAAC;AAEM,IAAM,qCAAqC,cAAE,OAAO;AAAA,EACzD,SAAS,cAAE,QAAQ;AAAA,EACnB,SAAS,cAAE,OAAO;AAAA,EAClB,UAAU,cACP,OAAO;AAAA,IACN,SAAS,cAAE,OAAO;AAAA,IAClB,QAAQ,cAAE,OAAO;AAAA,IACjB,QAAQ,cAAE,OAAO;AAAA,MACf,UAAU,cAAE,OAAO;AAAA,MACnB,QAAQ,cAAE,OAAO;AAAA,QACf,UAAU,cAAE,MAAM,cAAE,OAAO,CAAC;AAAA,QAC5B,aAAa,cAAE,OAAO;AAAA,QACtB,gBAAgB,cAAE,OAAO;AAAA,QACzB,WAAW,cAAE,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,WAAW,cAAE,OAAO;AAAA,IACtB,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AACd,CAAC;AAEM,IAAM,wBAAwB,cAAE,OAAO;AAAA,EAC5C,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,gBAAgB,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,eAAe,cAAE,QAAQ,EAAE,SAAS;AAAA,EACpC,kBAAkB,cAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,YAAY,cAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;AAEM,IAAM,6BAA6B,cAAE,OAAO;AAAA,EACjD,IAAI,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACnC,gBAAgB,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,QAAQ,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACvC,MAAM,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACvC,CAAC;AAIM,IAAM,6BAA6B,cAAE,OAAO;AAAA,EACjD,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,oBAAoB,cAAE,OAAO;AAAA,EAC7B,wBAAwB,cAAE,OAAO;AAAA,EACjC,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,KAAK,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACtC,CAAC;AAEM,IAAM,qBAAqB,cAAE,OAAO;AAAA,EACzC,aAAa,cAAE,OAAO;AAAA,EACtB,cAAc;AAChB,CAAC;AAEM,IAAM,mBAAmB,cAAE,OAAO;AAAA,EACvC,OAAO,cAAE,OAAO;AAAA,EAChB,MAAM,cAAE,OAAO;AAAA,EACf,OAAO,cAAE,OAAO;AAAA,EAChB,YAAY,cAAE,OAAO;AACvB,CAAC;AAEM,IAAM,iCAAiC,cAAE,OAAO;AAAA,EACrD,MAAM,cAAE,MAAM,kBAAkB;AAAA,EAChC,YAAY;AACd,CAAC;AAEM,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAClD,UAAU,cAAE,OAAO;AAAA,EACnB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,4BAA4B,cAAE,OAAO;AAAA,EAChD,UAAU,cAAE,OAAO;AAAA,EACnB,aAAa,cAAE,OAAO;AAAA,EACtB,WAAW,cAAE,MAAM,0BAA0B;AAAA,EAC7C,QAAQ;AACV,CAAC;AAEM,IAAM,uCAAuC,cAAE,OAAO;AAAA,EAC3D,QAAQ;AACV,CAAC;AAED,IAAM,kCAAkC,cAAE,OAAO;AAAA,EAC/C,YAAY,6BAA6B,SAAS;AAAA,EAClD,2BAA2B,cAAE,QAAQ,EAAE,SAAS;AAAA,EAChD,6BAA6B,cAAE,QAAQ,EAAE,SAAS;AAAA,EAClD,sBAAsB,cAAE,QAAQ,EAAE,SAAS;AAAA,EAC3C,YAAY,cAAE,QAAQ,EAAE,SAAS;AAAA,EACjC,cAAc,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EACxD,oBAAoB,cAAE,QAAQ,EAAE,SAAS;AAC3C,CAAC;AAED,IAAM,2BAA2B,cAAE,OAAO;AAAA,EACxC,UAAU,cAAE,OAAO,EAAE,KAAK;AAC5B,CAAC;AAED,IAAM,6BAA6B,yBAAyB,MAAM,+BAA+B;AAIjG,IAAM,wBAAwB,CAAC,UAAqC;AAClE,SAAO,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC,UAAU,UAAU,MAAS;AACjE;AAEO,IAAM,yBAAyB,2BAA2B;AAAA,EAC/D,CAAC,EAAE,UAAU,WAAW,GAAG,aAAa,MACtC,sBAAsB,YAAY;AAAA,EACpC;AAAA,IACE,SAAS;AAAA,EACX;AACF;AAEA,IAAM,8BAA8B,2BAA2B,OAAO;AAAA,EACpE,gBAAgB,cAAE,OAAO,EAAE,KAAK;AAClC,CAAC;AAEM,IAAM,0BAA0B;AAEhC,IAAM,0BAA0B,cAAE,OAAO;AAAA,EAC9C,gBAAgB,cAAE,OAAO,EAAE,KAAK;AAAA,EAChC,UAAU,cAAE,OAAO,EAAE,KAAK;AAC5B,CAAC;AAEM,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,SAAS,cAAE,QAAQ;AAAA,EACnB,SAAS,cAAE,OAAO;AACpB,CAAC;AAEM,IAAM,2BAA2B;;;ACjVxC,eAAsB,WAAW,OAA4D;AAC3F,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,OAAO,SAAU,QAAO,IAAI,MAAM,MAAM,QAAQ;AACpD,MAAI,OAAO,OAAQ,QAAO,IAAI,UAAU,MAAM,MAAM;AACpD,MAAI,OAAO,eAAgB,QAAO,IAAI,kBAAkB,MAAM,cAAc;AAC5E,MAAI,OAAO,cAAe,QAAO,OAAO,iBAAiB,MAAM;AAC/D,MAAI,OAAO,cAAc,OAAO,cAAe,QAAO,OAAO,cAAc,MAAM;AACjF,MAAI,OAAO,iBAAkB,QAAO,OAAO,oBAAoB,MAAM;AAErE,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,WAAW,cAAc,IAAI,WAAW,KAAK,EAAE;AAEhE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU,EAAE,QAAQ,MAAM,CAAC;AAC9D,QAAM,SAAS,uBAAuB,UAAU,IAAI;AAEpD,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ;AAAA,MACN;AAAA,MACA,KAAK,UAAU,OAAO,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,IAC/C;AACA,UAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM,OAAO,EAAE;AAAA,EACpE;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsB,gBAAgB,OAAsD;AAC1F,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,OAAO,GAAI,QAAO,IAAI,MAAM,MAAM,EAAE;AACxC,MAAI,OAAO,eAAgB,QAAO,IAAI,kBAAkB,MAAM,cAAc;AAC5E,MAAI,OAAO,OAAQ,QAAO,IAAI,UAAU,MAAM,MAAM;AACpD,MAAI,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,IAAI;AAE9C,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,kBAAkB,cAAc,IAAI,WAAW,KAAK,EAAE;AAEvE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU,EAAE,QAAQ,MAAM,CAAC;AAC9D,QAAM,SAAS,4BAA4B,UAAU,IAAI;AAEzD,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ;AAAA,MACN;AAAA,MACA,KAAK,UAAU,OAAO,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,IAC/C;AACA,UAAM,IAAI,MAAM,kCAAkC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC1E;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsB,kBACpB,gBACA,MACkC;AAClC,QAAM,WAAW,mBAAmB,cAAc;AAClD,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,0CAA0C,OAAO,MAAM,OAAO,EAAE;AAAA,EAClF;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,iBACpB,OACiE;AACjE,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,KAAK,SAAS,CAAC;AACzD,MAAI,OAAO,MAAO,QAAO,IAAI,SAAS,MAAM,MAAM,SAAS,CAAC;AAE5D,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,YAAY,MAAM,QAAQ,YAAY,cAAc,IAAI,WAAW,KAAK,EAAE;AAE3F,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU,EAAE,QAAQ,MAAM,CAAC;AAC9D,QAAM,SAAS,+BAA+B,UAAU,IAAI;AAE5D,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ;AAAA,MACN;AAAA,MACA,KAAK,UAAU,OAAO,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,IAC/C;AACA,UAAM,IAAI,MAAM,mCAAmC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC3E;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,uBACpB,UACA,aAC8B;AAC9B,QAAM,WAAW,YAAY,QAAQ,YAAY,WAAW;AAC5D,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU,EAAE,QAAQ,MAAM,CAAC;AAC9D,QAAM,SAAS,qCAAqC,UAAU,IAAI;AAElE,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ;AAAA,MACN;AAAA,MACA,KAAK,UAAU,OAAO,MAAM,OAAO,GAAG,MAAM,CAAC;AAAA,IAC/C;AACA,UAAM,IAAI,MAAM,0CAA0C,OAAO,MAAM,OAAO,EAAE;AAAA,EAClF;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsB,4BAEpB;AACA,QAAM,WAAW;AACjB,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU,EAAE,QAAQ,MAAM,CAAC;AAC9D,QAAM,SAAS,sCAAsC,UAAU,IAAI;AAEnE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC7E;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsB,uBACpB,gBACA,OACuC;AACvC,QAAM,WAAW,YAAY,cAAc;AAC3C,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAED,QAAM,SAAS,mCAAmC,UAAU,IAAI;AAChE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,uCAAuC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC/E;AACA,SAAO,OAAO;AAChB;AAEA,eAAsB,aACpB,gBACA,MAC6B;AAC7B,QAAM,WAAW,YAAY,cAAc;AAC3C,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,SAAS,yBAAyB,UAAU,IAAI;AAEtD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,2CAA2C,OAAO,MAAM,OAAO,EAAE;AAAA,EACnF;AAEA,SAAO,OAAO;AAChB;AAEA,eAAsB,aAAa,gBAAwB,UAA+C;AACxG,QAAM,WAAW,YAAY,cAAc,IAAI,QAAQ;AACvD,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,SAAS,yBAAyB,UAAU,IAAI;AAEtD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,2CAA2C,OAAO,MAAM,OAAO,EAAE;AAAA,EACnF;AAEA,SAAO,OAAO;AAChB;;;ACnMO,IAAM,mBAAmB;AAAA,EAC9B,QAAQ,CAAC,EAAE,gBAAgB,GAAG,KAAK,MAAyB,aAAa,gBAAgB,IAAI;AAAA,EAC7F,cAAc,CAAC,UAA6B,aAAa,MAAM,gBAAgB,MAAM,QAAQ;AAC/F;;;ACNA,IAAAC,4BAAgC;AAUzB,IAAM,qBAAiB,2CAAgB,WAAW;AAAA,EACvD,MAAM,CAAC,WAA6B;AAAA,IAClC,UAAU,CAAC,SAAS,KAAK;AAAA,IACzB,SAAS,MAAM,WAAW,KAAK;AAAA,EACjC;AAAA,EACA,QAAQ,CAAC,WAAkC;AAAA,IACzC,UAAU,CAAC,SAAS,KAAK;AAAA,IACzB,SAAS,MAAM,gBAAgB,KAAK;AAAA,EACtC;AAAA,EACA,SAAS,CAAC,WAAmC;AAAA,IAC3C,UAAU,CAAC,KAAK;AAAA,IAChB,SAAS,MAAM,iBAAiB,KAAK;AAAA,EACvC;AAAA,EACA,eAAe,CAAC,WAAsD;AAAA,IACpE,UAAU,CAAC,KAAK;AAAA,IAChB,SAAS,MAAM,uBAAuB,MAAM,UAAU,MAAM,WAAW;AAAA,EACzE;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,SAAS,MAAM,0BAA0B;AAAA,EAC3C;AACF,CAAC;;;AJyBM,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AACF,IAGI,CAAC,GAAG;AACN,aAAO,8BAAS,mBAAmB,eAAe,KAAK,KAAK,GAAG,OAAO,CAAC;AACzE;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,IAGI,CAAC,GAAG;AACN,aAAO,8BAAS,mBAAmB,eAAe,OAAO,KAAK,GAAG,OAAO,CAAC;AAC3E;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AACF,GAGG;AACD,aAAO,8BAAS,mBAAmB,eAAe,QAAQ,KAAK,GAAG,OAAO,CAAC;AAC5E;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AACF,GAGG;AACD,aAAO,8BAAS,mBAAmB,eAAe,cAAc,KAAK,GAAG,OAAO,CAAC;AAClF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AACF,IAEI,CAAC,GAAG;AACN,aAAO,8BAAS,mBAAmB,eAAe,iBAAiB,OAAO,CAAC;AAC7E;AAEO,SAAS,gBAAgB,SAAkC;AAChE,aAAO,iCAAY;AAAA,IACjB,YAAY,iBAAiB;AAAA,IAC7B,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,gBAAgB,SAAkC;AAChE,aAAO,iCAAY;AAAA,IACjB,YAAY,iBAAiB;AAAA,IAC7B,GAAG;AAAA,EACL,CAAC;AACH;;;AlB5GA,IAAM,sBAAsB,cAAE,KAAK,CAAC,SAAS,WAAW,WAAW,cAAc,SAAS,EAAE,CAAC;AAG7F,IAAM,wBAAwB,cAAE,KAAK,CAAC,UAAU,UAAU,cAAc,SAAS,OAAO,CAAC;AAGlF,IAAM,oBAAoB,cAAE,OAAO;AAAA,EACxC,IAAI,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EAC/B,MAAM,cAAE,OAAO;AAAA,EACf,WAAW,cAAE,OAAO;AAAA,EACpB,MAAM;AAAA,EACN,aAAa,cAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC7C,SAAS,cAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EACzC,KAAK,cAAE,OAAO,EAAE,IAAI,GAAG,sBAAsB;AAAA,EAC7C,UAAU,cAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC9C,eAAe,cAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACpD,gBAAgB,cAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,WAAW,cAAE,MAAM,cAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpD,MAAM,cAAE,MAAM,cAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5C,QAAQ,sBAAsB,SAAS,EAAE,QAAQ,QAAQ;AAAA,EACzD,cAAc,cAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC9C,iBAAiB,cAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EACrD,uBAAuB,cAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EACvD,oBAAoB,cAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EACxD,0BAA0B,cAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC1D,SAAS,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACxC,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,WAAW,cAAE,OAAO;AAAA,EACpB,aAAa,cAAE,OAAO;AAAA,EACtB,aAAa,cAAE,QAAQ;AAAA,EACvB,mBAAmB,cAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACtD,kBAAkB,cAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EACtD,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,WAAW,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,cAAc,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAGlC,eAAe,cAAE,MAAM,WAAW;AAAA,EAClC,gBAAgB,cAAE,MAAM,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC1D,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY,cAAE,MAAM,eAAe;AAAA,EACnC,UAAU,cAAE,MAAM,aAAa;AAAA,EAC/B,aAAa,kBAAkB,SAAS,EAAE,SAAS;AAAA,EACnD,eAAe,oBAAoB,SAAS,EAAE,SAAS;AAAA,EACvD,eAAe,oBAAoB,SAAS,EAAE,SAAS;AAAA,EACvD,YAAY,aAAa,SAAS,EAAE,SAAS;AAAA;AAAA,EAG7C,UAAU,cAAE,MAAM,cAAE,OAAO,CAAC;AAAA,EAC5B,aAAa,cAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAEM,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,SAAS,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACpC,OAAO,cAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,cAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,gBAAgB,cAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;AAGM,IAAM,8BAA8B,cAAE,OAAO;AAAA,EAClD,eAAe,cAAE,MAAM,iBAAiB;AAAA,EACxC,OAAO,cAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAIM,IAAM,uCAAuC,cAAE,OAAO;AAAA,EAC3D,MAAM,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EACjC,OAAO,cAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA;AAAA,EAE5C,QAAQ,cACL,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS;AAAA,EACZ,WAAW,cAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS;AAAA;AAAA,EAE5C,qBAAqB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EACzC,uBAAuB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,EAE3C,mBAAmB,cAAE,OAAO,EAAE,SAAS;AAAA,EACvC,qBAAqB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EACzC,qBAAqB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEzC,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,YAAY,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAChC,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,mBAAmB,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA,EAEvC,oBAAoB,cAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,iBAAiB,cAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,aAAa,cAAE,QAAQ,EAAE,SAAS;AAAA,EAClC,UAAU,cAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAE/B,gBAAgB,cAAE,OAAO,EAAE,SAAS;AAAA,EACpC,sBAAsB,cAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE5B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE5B,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE9B,QAAQ,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,gBAAgB,cAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;AAID,IAAMC,4BAA2B,cAAE,OAAO;AAAA,EACxC,MAAM,cAAE,OAAO;AAAA,EACf,OAAO,cAAE,OAAO;AAAA,EAChB,OAAO,cAAE,OAAO;AAAA,EAChB,YAAY,cAAE,OAAO;AACvB,CAAC;AAEM,IAAM,kCAAkC,cAAE,OAAO;AAAA,EACtD,eAAe,cAAE,MAAM,iBAAiB;AAAA,EACxC,YAAYA;AACd,CAAC;AAID,IAAM,oBAAoB,cAAE,OAAO;AAAA,EACjC,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,cAAE,OAAO;AAAA,EACf,MAAM,cAAE,OAAO;AAAA,EACf,SAAS,cAAE,OAAO;AAAA,EAClB,SAAS,cAAE,OAAO;AAAA,EAClB,WAAW,cAAE,OAAO;AAAA,EACpB,QAAQ,cAAE,OAAO;AAAA,EACjB,aAAa,cAAE,OAAO;AACxB,CAAC;AAEM,IAAM,2BAA2B,cAAE,OAAO;AAAA,EAC/C,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,cAAE,OAAO;AAAA,EACf,aAAa,cAAE,OAAO;AAAA,EACtB,YAAY,cAAE,OAAO;AAAA,EACrB,SAAS,cAAE,OAAO;AAAA,EAClB,kBAAkB,cAAE,OAAO;AAAA,EAC3B,eAAe,cAAE,OAAO;AAAA,EACxB,eAAe,cAAE,OAAO;AAAA,EACxB,QAAQ,cAAE,OAAO;AAAA,EACjB,UAAU,cAAE,QAAQ;AACtB,CAAC;AAEM,IAAM,kBAAkB,cAAE,OAAO;AAAA,EACtC,IAAI,cAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,cAAE,OAAO;AAAA,EACf,MAAM,cAAE,OAAO;AAAA,EACf,aAAa,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,OAAO,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,MAAM,cAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACvC,CAAC;AAED,IAAM,2BAA2B,cAAE,OAAO;AAAA,EACxC,QAAQ,cAAE,OAAO;AAAA,EACjB,SAAS,cAAE,OAAO;AACpB,CAAC;AAEM,IAAM,sCAAsC,cAAE,OAAO;AAAA,EAC1D,QAAQ,cAAE,MAAM,iBAAiB;AAAA,EACjC,WAAW,cAAE,MAAM,wBAAwB;AAAA,EAC3C,UAAU,cAAE,MAAM,wBAAwB,EAAE,SAAS,EAAE,SAAS;AAAA,EAChE,UAAU,cAAE,MAAM,wBAAwB,EAAE,SAAS,EAAE,SAAS;AAAA,EAChE,MAAM,cAAE,MAAM,eAAe,EAAE,SAAS,EAAE,SAAS;AAAA,EACnD,kBAAkB,cAAE,MAAM,wBAAwB;AAAA,EAClD,qBAAqB,cAAE,MAAM,wBAAwB,EAAE,SAAS,EAAE,SAAS;AAC7E,CAAC;AAMM,IAAM,gCAAgC,cAAE,OAAO;AAAA,EACpD,gBAAgB,cAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;;;AuBvLD,eAAsB,iBACpB,SACA,SACgC;AAChC,QAAM,SAAS,IAAI,gBAAgB;AAEnC,MAAI,SAAS,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAC9D,MAAI,SAAS,MAAO,QAAO,OAAO,SAAS,QAAQ,KAAK;AACxD,MAAI,SAAS,UAAW,QAAO,OAAO,aAAa,QAAQ,SAAS;AAEpE,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,wBAAwB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE7E,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,4BAA4B,UAAU,IAAI;AAEzD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,kCAAkC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC1E;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,mBACpB,IACA,aACA,SACsB;AACtB,QAAM,SAAS,IAAI,gBAAgB;AAEnC,MAAI,aAAa,mBAAmB,QAAW;AAC7C,WAAO,OAAO,kBAAkB,OAAO,YAAY,cAAc,CAAC;AAAA,EACpE;AAEA,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,yBAAyB,EAAE,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAEnF,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,kBAAkB,UAAU,IAAI;AAC/C,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,gCAAgC,OAAO,MAAM,OAAO,EAAE;AAAA,EACxE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,0BACpB,QACA,SAC4C;AAC5C,QAAM,cAAc,IAAI,gBAAgB;AAExC,MAAI,QAAQ;AACV,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,UAAI,UAAU,UAAa,UAAU,MAAM;AACzC,oBAAY,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,YAAY,SAAS;AACzC,QAAM,WAAW,kCAAkC,cAAc,IAAI,WAAW,KAAK,EAAE;AAEvF,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,gCAAgC,UAAU,IAAI;AAE7D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,4CAA4C,OAAO,MAAM,OAAO,EAAE;AAAA,EACpF;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,8BAA8B,SAED;AACjD,QAAM,OAAO,MAAM,UAAU,MAAM,wCAAwC;AAAA,IACzE,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,oCAAoC,UAAU,IAAI;AAEjE,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,iDAAiD,OAAO,MAAM,OAAO,EAAE;AAAA,EACzF;AACA,SAAO,OAAO;AAChB;;;AzBhHO,IAAM,2BAAuB,2CAAgB,iBAAiB;AAAA;AAAA,EAEnE,KAAK;AAAA,IACH,UAAU;AAAA,IACV,SAAS,MAAM,iBAAiB;AAAA,EAClC;AAAA;AAAA,EAGA,MAAM,CAAC,aAAkC;AAAA,IACvC,UAAU,CAAC,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,MAAM,iBAAiB,OAAO;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,CAAC,IAAY,WAAqC;AAAA,IACtD,UAAU,CAAC,EAAE;AAAA,IACb,SAAS,MAAM,mBAAmB,IAAI,KAAK;AAAA,EAC7C;AAAA;AAAA,EAGA,WAAW,CAAC,YAA6C;AAAA,IACvD,UAAU,CAAC,EAAE,OAAO,CAAC;AAAA,IACrB,SAAS,MAAM,0BAA0B,MAAM;AAAA,EACjD;AAAA;AAAA,EAGA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,SAAS,MAAM,8BAA8B;AAAA,EAC/C;AACF,CAAC;;;A0B3CD,IAAAC,4BAAgC;;;ACAhC,IAAAC,eAAkB;AAIX,IAAM,wBAAwB,eAAE,OAAO;AAAA,EAC5C,IAAI,eAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,eAAE,OAAO;AAAA,EACf,aAAa,eAAE,OAAO;AAAA,EACtB,MAAM,eAAE,OAAO;AAAA,EACf,cAAc,eAAE,OAAO;AAAA,EACvB,KAAK,eAAE,OAAO;AAAA,EACd,UAAU,eAAE,QAAQ;AAAA,EACpB,YAAY;AAAA,EACZ,eAAe,eAAE,MAAM,WAAW,EAAE,SAAS;AAAA,EAC7C,cAAc;AAChB,CAAC;AAGM,IAAM,kCAAkC,eAAE,OAAO;AAAA,EACtD,eAAe,eAAE,MAAM,qBAAqB,EAAE,SAAS;AAAA,EACvD,OAAO,eAAE,OAAO,EAAE,IAAI;AACxB,CAAC;;;ACfD,eAAsB,qBACpB,SACoC;AACpC,QAAM,OAAO,MAAM,UAAU,MAAM,sBAAsB;AAAA,IACvD,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,gCAAgC,UAAU,IAAI;AAE7D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,uCAAuC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC/E;AACA,SAAO,OAAO;AAChB;;;AFnBO,IAAM,+BAA2B,2CAAgB,qBAAqB;AAAA,EAC3E,KAAK;AAAA,IACH,UAAU;AAAA,IACV,SAAS,CAAC,YAAY,qBAAqB,OAAO;AAAA,EACpD;AACF,CAAC;;;AGRD,IAAAC,4BAAgC;;;ACAhC,mBAAqB;AACrB,IAAAC,eAAkB;AAGX,IAAM,iBAAiB,eAAE,OAAO;AAAA,EACrC,MAAM,eAAE,QAAQ,OAAO;AAAA,EACvB,KAAK,eAAE,OAAO;AAAA,EACd,KAAK,eAAE,OAAO;AAChB,CAAC;AAEM,IAAM,iBAAiB,eAAE,OAAO;AAAA,EACrC,MAAM,eAAE,QAAQ,OAAO;AAAA,EACvB,SAAS,eAAE,OAAO;AAAA,EAClB,MAAM,eAAE,OAAO;AAAA,EACf,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO;AACrB,CAAC;AAEM,IAAM,YAAY,eAAE,mBAAmB,QAAQ,CAAC,gBAAgB,cAAc,CAAC;AAE/E,IAAM,QAAQ,eAAE,OAAO;AAAA,EAC5B,IAAI,eAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAM,eAAE,OAAO;AAAA,EACf,OAAO,eAAE,MAAM,eAAE,OAAO,CAAC;AAAA,EACzB,MAAM,eAAE,MAAM,eAAE,OAAO,CAAC;AAAA,EACxB,aAAa,eAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM,eAAE,MAAM,SAAS;AACzB,CAAC;AAGM,IAAM,aAAa,eAAE,OAAO;AAAA,EACjC,SAAS,eAAE,OAAO;AAAA,EAClB,MAAM,eAAE,OAAO;AAAA,EACf,QAAQ,eAAE,OAAO;AAAA,EACjB,OAAO,eAAE,MAAM,eAAE,OAAO,CAAC;AAAA,EACzB,UAAU,eAAE,OAAO;AAAA,EACnB,OAAO,eAAE,OAAO;AAAA,EAChB,OAAO,eAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACxC,CAAC;AAGM,IAAM,cAAc,eAAE,OAAO;AAAA,EAClC,MAAM,eAAE,QAAQ,MAAM;AAAA,EACtB,MAAM,eAAE,MAAM,UAAU;AAAA,EACxB,IAAI,eAAE,MAAM,UAAU;AAAA,EACtB,UAAU,eAAE,OAAO;AAAA,EACnB,gBAAgB,MAAM,SAAS;AAAA,EAC/B,cAAc,eAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAEM,IAAM,iBAAiB,eAAE,OAAO;AAAA,EACrC,MAAM,eAAE,QAAQ,SAAS;AAAA,EACzB,OAAO,eAAE,OAAO;AAAA,EAChB,MAAM,eAAE,MAAM,UAAU;AAAA,EACxB,IAAI,eAAE,MAAM,UAAU;AAAA,EACtB,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO;AAAA,EACnB,gBAAgB,MAAM,SAAS;AAAA,EAC/B,cAAc,eAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAEM,IAAM,gBAAgB,eAAE,mBAAmB,QAAQ,CAAC,aAAa,cAAc,CAAC;AAGhF,IAAM,SAAS,eAAE,OAAO;AAAA,EAC7B,MAAM,kBAAK,QAAQ;AAAA,EACnB,IAAI,kBAAK,QAAQ;AAAA,EACjB,MAAM,kBAAK,IAAI;AAAA,EACf,OAAO,eAAE,OAAO;AAAA,EAChB,KAAK,eAAE,OAAO;AAChB,CAAC;AAGM,IAAM,cAAc,eAAE,OAAO;AAAA,EAClC,MAAM,eAAE,QAAQ,SAAS;AAAA,EACzB,OAAO,eAAE,OAAO;AAAA,EAChB,SAAS,eAAE,OAAO;AAAA,EAClB,OAAO;AAAA,EACP,QAAQ,eAAE,OAAO;AAAA,EACjB,IAAI;AACN,CAAC;AAEM,IAAM,WAAW,eAAE,OAAO;AAAA,EAC/B,MAAM,eAAE,QAAQ,MAAM;AAAA,EACtB,UAAU,eAAE,MAAM,aAAa;AAAA,EAC/B,IAAI;AAAA,EACJ,OAAO,MAAM,SAAS;AACxB,CAAC;AAEM,IAAM,aAAa,eAAE,mBAAmB,QAAQ,CAAC,aAAa,QAAQ,CAAC;AAGvE,IAAM,0BAA0B,eAAE,OAAO;AAAA,EAC9C,OAAO,eAAE,MAAM,UAAU;AAAA,EACzB,YAAY,eAAE,OAAO;AAAA,EACrB,cAAc,eAAE,OAAO,EAAE,SAAS;AACpC,CAAC;;;AC1FD,eAAsB,aACpB,QACA,SAC4B;AAC5B,QAAM,eAAe,IAAI,gBAAgB;AAAA,IACvC,MAAM,OAAO;AAAA,IACb,OAAO,OAAO,MAAM,SAAS;AAAA,IAC7B,UAAU,OAAO,SAAS,SAAS;AAAA,IACnC,UAAU,OAAO;AAAA,IACjB,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO;AAAA,IACf,gBAAgB,OAAO;AAAA,IACvB,GAAI,OAAO,iBAAiB,EAAE,eAAe,OAAO,cAAc;AAAA,IAClE,GAAI,OAAO,MAAM,EAAE,IAAI,OAAO,GAAG;AAAA,EACnC,CAAC;AAED,QAAM,WAAW,MAAM,UAAU,MAAyB,cAAc,aAAa,SAAS,CAAC,IAAI;AAAA,IACjG,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,OAAO,SAAS;AACtB,QAAM,SAAS,wBAAwB,UAAU,IAAI;AAErD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,OAAO,EAAE;AAAA,EACvE;AACA,SAAO,OAAO;AAChB;;;AFhCO,IAAM,uBAAmB,2CAAgB,aAAa;AAAA;AAAA,EAE3D,UAAU,CAAC,YAA6B;AAAA,IACtC,UAAU,CAAC,MAAM;AAAA,IACjB,SAAS,CAAC,YAAY,aAAa,QAAQ,OAAO;AAAA,EACpD;AACF,CAAC;;;AGVD,IAAAC,4BAAgC;;;ACAhC,IAAAC,eAAkB;AAGX,IAAM,sBAAsB,eAAE,KAAK,CAAC,OAAO,UAAU,KAAK,CAAC;AAQ3D,IAAM,gCAAgC,eAAE,OAAO;AAAA,EACpD,UAAU,eAAE,QAAQ;AACtB,CAAC;AAGM,IAAM,+BAA+B,eAAE,OAAO;AAAA,EACnD,SAAS,eAAE,OAAO;AAAA,EAClB,iBAAiB;AAAA,EACjB,KAAK,eAAE,OAAO;AAAA,EACd,SAAS,eAAE,OAAO,EAAE,QAAQ,GAAG;AACjC,CAAC;AAEM,IAAM,gCAAgC,eAAE,OAAO;AAAA,EACpD,SAAS,eAAE,OAAO;AAAA,EAClB,OAAO,eAAE,OAAO;AAClB,CAAC;AAGM,IAAM,gCAAgC,eAAE,OAAO;AAAA,EACpD,SAAS,eAAE,OAAO;AAAA,EAClB,iBAAiB,eAAE,OAAO;AAAA,EAC1B,WAAW,eAAE,OAAO;AAAA,EACpB,OAAO,eAAE,OAAO;AAClB,CAAC;AAEM,IAAM,iCAAiC,eAAE,OAAO;AAAA,EACrD,UAAU,eAAE,QAAQ;AAAA,EACpB,OAAO,eAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;;;ACtBD,eAAsB,gBACpB,QACA,SACkC;AAClC,QAAM,eAAe,IAAI,gBAAgB;AAAA,IACvC,SAAS,OAAO;AAAA,IAChB,GAAI,OAAO,mBAAmB,EAAE,iBAAiB,OAAO,gBAAgB;AAAA,EAC1E,CAAC;AAED,QAAM,OAAO,MAAM,UAAU,MAAM,mBAAmB,aAAa,SAAS,CAAC,IAAI;AAAA,IAC/E,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC7E;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,0BACpB,SACkC;AAClC,QAAM,OAAO,MAAM,UAAU,MAAM,4BAA4B;AAAA,IAC7D,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAED,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC7E;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,iBACpB,SACmC;AACnC,QAAM,OAAO,MAAM,UAAU,MAAM,mBAAmB;AAAA,IACpD,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAED,QAAM,SAAS,+BAA+B,UAAU,IAAI;AAE5D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,sCAAsC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC9E;AACA,SAAO,OAAO;AAChB;;;AFzEO,IAAM,4BAAwB,2CAAgB,kBAAkB;AAAA;AAAA,EAErE,OAAO,CAAC,YAAmC;AAAA,IACzC,UAAU,CAAC,MAAM;AAAA,IACjB,SAAS,CAAC,YAAY,gBAAgB,QAAQ,OAAO;AAAA,EACvD;AACF,CAAC;;;AGVD,IAAAC,4BAAgC;;;ACAhC,IAAAC,eAAkB;AAGX,IAAM,gBAAgB,eAAE,OAAO;AAAA,EACpC,OAAO,eAAE,OAAO,EAAE,IAAI;AAAA,EACtB,sBAAsB,eAAE,OAAO;AAAA,EAC/B,yBAAyB,eAAE,OAAO;AAAA,EAClC,0BAA0B,eAAE,OAAO,EAAE,IAAI;AAAA,EACzC,sBAAsB,eAAE,OAAO;AAAA,EAC/B,sBAAsB,eAAE,OAAO;AAAA,EAC/B,wBAAwB,eAAE,OAAO;AAAA,EACjC,iBAAiB,eAAE,OAAO;AAAA,EAC1B,WAAW,eAAE,OAAO;AAAA,EACpB,QAAQ,eAAE,OAAO;AAAA,EACjB,WAAW,eAAE,OAAO;AAAA,EACpB,SAAS,eAAE,OAAO;AACpB,CAAC;AAGM,IAAM,yBAAyB,eAAE,OAAO;AAAA,EAC7C,UAAU,eAAE,MAAM,aAAa,EAAE,SAAS;AAC5C,CAAC;;;ACfD,eAAsB,YACpB,QACA,SAC2B;AAC3B,QAAM,EAAE,gBAAgB,WAAW,OAAO,OAAO,IAAI;AAErD,QAAM,eAAe,IAAI,gBAAgB;AAAA,IACvC,GAAI,aAAa,EAAE,UAAU;AAAA,IAC7B,GAAI,SAAS,EAAE,OAAO,MAAM,SAAS,EAAE;AAAA,IACvC,GAAI,UAAU,EAAE,QAAQ,OAAO,SAAS,EAAE;AAAA,EAC5C,CAAC;AAED,QAAM,cAAc,aAAa,SAAS;AAC1C,QAAM,WAAW,eAAe,cAAc,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAErF,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,uBAAuB,UAAU,IAAI;AAEpD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AACA,SAAO,OAAO;AAChB;;;AF9BO,IAAM,0BAAsB,2CAAgB,gBAAgB;AAAA,EACjE,UAAU,CAAC,YAA+B;AAAA,IACxC,UAAU,CAAC,MAAM;AAAA,IACjB,SAAS,CAAC,YAAY,YAAY,QAAQ,OAAO;AAAA,EACnD;AACF,CAAC;;;AGTD,IAAAC,4BAAgC;AAIzB,IAAM,yBAAqB,2CAAgB,eAAe;AAAA;AAAA;AAGjE,CAAC;AAGM,IAAM,0BAA0B;;;ACVvC,IAAAC,6BAAgC;;;ACmBhC,eAAsB,YAAY,SAAqD;AACrF,QAAM,SAAS,IAAI,gBAAgB;AAEnC,MAAI,SAAS,eAAgB,QAAO,OAAO,kBAAkB,QAAQ,cAAc;AAEnF,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,mBAAmB,cAAc,IAAI,WAAW,KAAK,EAAE;AAExE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,uBAAuB,UAAU,IAAI;AAEpD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,WAAW,IAAsC;AACrE,QAAM,WAAW,oBAAoB,EAAE;AAEvC,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,sBAAsB,UAAU,IAAI;AAEnD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM,OAAO,EAAE;AAAA,EACpE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,cAAc,OAA2D;AAC7F,QAAM,WAAW;AAEjB,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAGD,QAAM,SAAS,4BAA4B,UAAU,IAAI;AAEzD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,cAAc,OAA2D;AAC7F,QAAM,WAAW,mBAAmB,MAAM,QAAQ,EAAE;AAEpD,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAGD,QAAM,SAAS,4BAA4B,UAAU,IAAI;AAEzD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,cAAc,IAA2B;AAC7D,QAAM,WAAW,mBAAmB,EAAE;AAEtC,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,sBAAsB,UAAU,IAAI;AAEnD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AACF;AAGA,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AACF,GAAiE;AAC/D,QAAM,WAAW;AAEjB,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,MAAc,YAAY,KAAK,IAAI;AAE3D,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AAGD,QAAM,SAAS,gCAAgC,UAAU,IAAI;AAE7D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,kCAAkC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC1E;AACA,SAAO,OAAO;AAChB;;;ADrIO,IAAM,sBAAkB,4CAAgB,YAAY;AAAA;AAAA,EAEzD,KAAK,OAAO;AAAA,IACV,UAAU,CAAC,KAAK;AAAA,IAChB,SAAS,MAAM,YAAY;AAAA,EAC7B;AAAA,EAEA,MAAM,CAAC,aAA8B;AAAA,IACnC,UAAU,CAAC,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,MAAM,YAAY,OAAO;AAAA,EACpC;AAAA,EACA,MAAM,CAAC,QAAgB;AAAA,IACrB,UAAU,CAAC,EAAE;AAAA,IACb,SAAS,MAAM,WAAW,EAAE;AAAA,EAC9B;AACF,CAAC;;;AEnBD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAEX,IAAM,qBAAqB,eAAE,OAAO;AAAA,EACzC,SAAS,eAAE,OAAO;AAAA,EAClB,MAAM,eAAE,OAAO;AAAA,EACf,QAAQ,eAAE,OAAO;AAAA,EACjB,OAAO,eAAE,MAAM,eAAE,OAAO,CAAC;AAAA,EACzB,UAAU,eAAE,OAAO;AAAA,EACnB,OAAO,eAAE,OAAO;AAAA,EAChB,OAAO,eAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACxC,CAAC;AAEM,IAAM,sBAAsB,eAAE,OAAO;AAAA,EAC1C,OAAO;AAAA,EACP,QAAQ,eAAE,OAAO;AACnB,CAAC;AAOM,IAAM,+BAA+B,eAAE,OAAO;AAAA,EACnD,UAAU,eAAE,MAAM,mBAAmB;AACvC,CAAC;;;AClBD,eAAsB,kBACpB,QACA,SACiC;AACjC,QAAM,EAAE,MAAM,MAAM,IAAI;AAExB,QAAM,eAAe,IAAI,gBAAgB;AAAA,IACvC;AAAA,IACA,OAAO,MAAM,SAAS;AAAA,EACxB,CAAC;AAED,QAAM,WAAW,2BAA2B,aAAa,SAAS,CAAC;AAEnE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,6BAA6B,UAAU,IAAI;AAE1D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,oCAAoC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC5E;AAEA,SAAO,OAAO;AAChB;;;AF7BO,IAAM,0BAAsB,4CAAgB,gBAAgB;AAAA,EACjE,UAAU,CAAC,YAAqC;AAAA,IAC9C,UAAU,CAAC,MAAM;AAAA,IACjB,SAAS,CAAC,YAAY,kBAAkB,QAAQ,OAAO;AAAA,EACzD;AACF,CAAC;;;AGTD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;;;ACAlB,IAAAC,sBAAoE;AAmB7D,SAAS,iBAAiB,SAAmC;AAClE,aAAO,8BAAS;AAAA,IACd,GAAG,qBAAqB;AAAA,IACxB,GAAG;AAAA,IACH,QAAQ,CAAC,SAAgC;AACvC,YAAM,kBAAkB,IAAI;AAAA,QAC1B,KAAK,cACF,IAAI,CAAC,gBAAgB,YAAY,cAAc,KAAK,EACpD,OAAO,CAAC,UAAU,UAAU,MAAS,EACrC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC;AAAA,MACrC;AAEA,YAAM,SAAS,MAAM,KAAK,gBAAgB,OAAO,CAAC;AAElD,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AASO,SAAS,eAAe,EAAE,IAAI,GAAG,QAAQ,GAA0B;AACxE,aAAO,8BAAS;AAAA,IACd,GAAG,qBAAqB,KAAK,EAAE;AAAA,IAC/B,GAAG;AAAA,IACH,QAAQ,CAAC,SAAsB;AAC7B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,KAAK,cAAc;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAOO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA,UAAU;AACZ,IAAsC,CAAC,GAAG;AACxC,aAAO,8BAAS;AAAA,IACd,GAAG,qBAAqB,UAAU,MAAM;AAAA,IACxC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAMO,SAAS,8BAA8B;AAAA,EAC5C,UAAU;AACZ,IAA0C,CAAC,GAAG;AAC5C,aAAO,8BAAS;AAAA,IACd,GAAG,qBAAqB;AAAA,IACxB,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;ADrFO,IAAM,oCAAoC,eAAE,OAAO;AAAA,EACxD,eAAe,eAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA,EACnD,OAAO,eAAE,OAAO,EAAE,IAAI;AACxB,CAAC;;;AEDD,eAAsB,uBACpB,eACA,SACsC;AACtC,QAAM,OAAO,MAAM,UAAU,MAAM,WAAW,aAAa,kBAAkB;AAAA,IAC3E,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,kCAAkC,UAAU,IAAI;AAE/D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,yCAAyC,OAAO,MAAM,OAAO,EAAE;AAAA,EACjF;AACA,SAAO,OAAO;AAChB;;;AHnBO,IAAM,oBAAgB,4CAAgB,UAAU;AAAA,EACrD,eAAe,CAAC,mBAA2B;AAAA,IACzC,UAAU,CAAC,aAAa;AAAA,IACxB,SAAS,CAAC,YAAY,uBAAuB,eAAe,OAAO;AAAA,EACrE;AACF,CAAC;;;AIRD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAKlB,IAAM,mBAAmB,eAAE,OAAO;AAAA,EAChC,SAAS,eAAE,OAAO;AAAA,EAClB,kBAAkB,eAAE,OAAO;AAAA,EAC3B,QAAQ,eAAE,MAAM,WAAW;AAC7B,CAAC;AAGD,IAAM,qBAAqB,eAAE,OAAO;AAAA,EAClC,kBAAkB,eAAE,OAAO;AAAA,EAC3B,QAAQ,eAAE,MAAM,WAAW,EAAE,QAAQ;AAAA,EACrC,SAAS,eAAE,MAAM,gBAAgB,EAAE,QAAQ;AAC7C,CAAC;AAGD,IAAM,qBAAqB,eAAE,OAAO;AAAA,EAClC,WAAW,eAAE,OAAO,EAAE,KAAK;AAAA,EAC3B,OAAO,eAAE,OAAO;AAAA,EAChB,mBAAmB,eAAE,OAAO,EAAE,QAAQ;AAAA,EACtC,YAAY,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC/B,YAAY,eAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAGD,IAAM,kBAAkB,eAAE,OAAO;AAAA,EAC/B,kBAAkB,eAAE,MAAM,kBAAkB;AAAA,EAC5C,UAAU,mBAAmB,QAAQ;AACvC,CAAC;AAGD,IAAM,oBAAoB,eAAE,OAAO;AAAA,EACjC,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO;AAAA,EACnB,OAAO,YAAY,QAAQ;AAC7B,CAAC;AAGD,IAAM,mBAAmB,eAAE,OAAO;AAAA,EAChC,SAAS,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,WAAW,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,QAAQ,eAAE,QAAQ,EAAE,QAAQ;AAAA,EAC5B,UAAU,eAAE,MAAM,iBAAiB,EAAE,QAAQ;AAC/C,CAAC;AAGD,IAAM,wBAAwB,eAAE,OAAO;AAAA,EACrC,IAAI,eAAE,OAAO;AAAA,EACb,OAAO,eAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,WAAW,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,UAAU,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC7B,WAAW,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,gBAAgB,eAAE,OAAO,EAAE,QAAQ;AAAA,EACnC,WAAW,eAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,MAAM,eAAE,OAAO;AAAA,EACf,WAAW,eAAE,OAAO;AAAA,EACpB,WAAW,eAAE,OAAO;AAAA,EACpB,MAAM,eAAE,MAAM,eAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,EAClC,SAAS,eAAE,MAAM,gBAAgB,EAAE,QAAQ;AAC7C,CAAC;AAGM,IAAM,oCAAoC,eAAE,OAAO;AAAA,EACxD,QAAQ,eAAE,OAAO,EAAE,KAAK;AAC1B,CAAC;AAGM,IAAM,qCAAqC,eAAE,OAAO;AAAA,EACzD,WAAW;AACb,CAAC;AAGM,IAAM,mCAAmC,eAAE,OAAO;AAAA,EACvD,QAAQ,eAAE,OAAO,EAAE,KAAK;AAC1B,CAAC;AAGM,IAAM,yBAAyB,eAAE,OAAO;AAAA,EAC7C,QAAQ,eAAE,OAAO,EAAE,KAAK;AAC1B,CAAC;AAGM,IAAM,0BAA0B,eAAE,OAAO;AAAA,EAC9C,MAAM,sBAAsB,SAAS;AAAA,EACrC,OAAO,eAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;;;AC9ED,eAAsB,YAAY,OAAqD;AACrF,UAAQ,IAAI,SAAS,KAAK;AAC1B,QAAM,WAAW,gBAAgB,MAAM,MAAM;AAE7C,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,wBAAwB,UAAU,IAAI;AAErD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,yBAAyB,OAAO,MAAM,OAAO,EAAE;AAAA,EACjE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,iBACpB,OACuC;AACvC,QAAM,WAAW,gBAAgB,MAAM,MAAM;AAE7C,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,mCAAmC,UAAU,IAAI;AAEhE,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,mCAAmC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC3E;AACA,SAAO,OAAO;AAChB;;;AF3CO,IAAM,mBAAe,4CAAgB,SAAS;AAAA,EACnD,MAAM,CAAC,WAA6B;AAAA,IAClC,UAAU,CAAC,MAAM,MAAM;AAAA,IACvB,SAAS,MAAM,YAAY,KAAK;AAAA,EAClC;AAAA,EACA,WAAW,CAAC,WAAwC;AAAA,IAClD,UAAU,CAAC,aAAa,MAAM,MAAM;AAAA,IACpC,SAAS,MAAM,iBAAiB,KAAK;AAAA,EACvC;AACF,CAAC;;;AGbD,IAAAC,6BAAgC;;;ACGhC,IAAM,qBAAqB;AAE3B,eAAsB,cAAc,aAAqB,OAAmC;AACzF,QAAM,WAAW,GAAG,kBAAkB;AACtC,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACpC,QAAQ;AAAA,IACR,SAAS;AAAA,MACN,gBAAgB;AAAA,IACnB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,IACH,CAAC;AAAA,EACJ,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AACf,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC9C;AAEA,SAAO,SAAS,KAAK;AACxB;;;ADpBO,IAAM,kBAAc,4CAAgB,QAAQ;AAAA,EAChD,QAAQ,CAAC,aAAqB,WAAmB;AAAA,IAC9C,UAAU,CAAC,aAAa,KAAK;AAAA,IAC7B,SAAS,MAAM,cAAc,aAAa,KAAK;AAAA,EAClD;AACH,CAAC;;;AERD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAEX,IAAM,yBAAyB,eAAE,OAAO;AAAA,EAC5C,cAAc,eAAE,OAAO;AAAA,EACvB,gBAAgB,eAAE,OAAO;AAAA,EACzB,YAAY,eAAE,OAAO;AAAA,EACrB,qBAAqB,eAAE,OAAO;AAAA,EAC9B,4BAA4B,eAAE,OAAO;AAAA,EACrC,aAAa,eAAE,OAAO;AACzB,CAAC;AAGM,IAAM,mCAAmC,eAAE,OAAO;AAAA,EACtD,SAAS,eAAE,QAAQ;AACtB,CAAC;AAGM,IAAM,kCAAkC,eAAE,OAAO;AAAA,EACrD,WAAW,eAAE,QAAQ;AAAA,EACrB,iBAAiB,uBAAuB,SAAS;AACpD,CAAC;AAQM,IAAM,gCAAgC,eAAE,OAAO;AAAA,EACnD,eAAe,eAAE,OAAO,EAAE,MAAM,uBAAuB,0BAA0B;AAAA,EACjF,QAAQ,eAAE,OAAO,EAAE,MAAM,uBAAuB,0BAA0B;AAC7E,CAAC;AAEM,IAAM,oCAAoC,eAAE,OAAO;AAAA,EACvD,SAAS,eAAE,QAAQ;AAAA,EACnB,SAAS,eAAE,OAAO;AAAA,EAClB,IAAI,eAAE,OAAO;AAChB,CAAC;;;AChCD,eAAsB,mBACnB,MACoC;AACpC,QAAM,WAAW,MAAM,UAAU,MAAM,gCAAgC;AAAA,IACpE,QAAQ;AAAA,IACR,MAAM;AAAA,EACT,CAAC;AAED,QAAM,SAAS,iCAAiC,UAAU,QAAQ;AAElE,MAAI,CAAC,OAAO,SAAS;AAClB,YAAQ,MAAM,eAAe,OAAO,KAAK;AACzC,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACtF;AAEA,SAAO,OAAO;AACjB;AAGA,eAAsB,oBACnB,MACqC;AACrC,QAAM,WAAW,MAAM,UAAU,MAAM,iCAAiC;AAAA,IACrE,QAAQ;AAAA,IACR,MAAM;AAAA,EACT,CAAC;AAED,QAAM,SAAS,kCAAkC,UAAU,QAAQ;AAEnE,MAAI,CAAC,OAAO,SAAS;AAClB,YAAQ,MAAM,eAAe,OAAO,KAAK;AACzC,UAAM,IAAI,MAAM,6EAA6E;AAAA,EAChG;AAEA,SAAO,OAAO;AACjB;AAGA,eAAsB,kBAAkB;AAAA,EACrC;AACH,GAEuC;AACpC,QAAM,SAAS,IAAI,gBAAgB;AACnC,SAAO,OAAO,gBAAgB,YAAY;AAE1C,QAAM,WAAW,MAAM,UAAU;AAAA,IAC9B,gCAAgC,OAAO,SAAS,CAAC;AAAA,IACjD,EAAE,QAAQ,MAAM;AAAA,EACnB;AAEA,QAAM,SAAS,gCAAgC,UAAU,QAAQ;AAEjE,MAAI,CAAC,OAAO,SAAS;AAClB,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACrF;AAEA,SAAO,OAAO;AACjB;;;AF7DO,IAAM,oBAAgB,4CAAgB,UAAU;AAAA,EACpD,OAAO,CAAC,kBAA0B;AAAA,IAC/B,UAAU,CAAC,EAAE,aAAa,CAAC;AAAA,IAC3B,SAAS,MAAM,kBAAkB,EAAE,aAAa,CAAC;AAAA,EACpD;AACH,CAAC;;;AGRD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAQX,IAAM,uBAAuB,eAAE,OAAO;AAAA,EAC3C,IAAI,eAAE,OAAO;AAAA,EACb,SAAS,eAAE,OAAO;AAAA,EAClB,MAAM,eAAE,OAAO;AAAA,EACf,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO;AAAA,EACnB,UAAU,eAAE,QAAQ;AAAA,EACpB,SAAS,eAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,eAAE,OAAO;AAAA;AAAA,EACjB,WAAW,eAAE,OAAO;AAAA,EACpB,OAAO,eACJ,OAAO,EACP,SAAS,EACT,UAAU,CAAC,QAAS,MAAM,WAAW,GAAG,IAAI,IAAK;AAAA;AAAA;AAAA,EAEpD,OAAO,YAAY,QAAQ,EAAE,SAAS,EAAE,SAAS,KAAK,CAAC;AACzD,CAAC;AAIM,IAAM,wBAAwB,eAAE,OAAO;AAAA,EAC5C,IAAI,eAAE,OAAO,EAAE,SAAS;AAAA,EACxB,SAAS,eAAE,OAAO;AAAA,EAClB,YAAY,eAAE,OAAO,EAAE,SAAS;AAAA,EAChC,QAAQ,eAAE,MAAM,oBAAoB;AACtC,CAAC;AAIM,IAAM,0BAA0B,eAAE,OAAO;AAAA,EAC9C,SAAS,eAAE,MAAM,qBAAqB;AACxC,CAAC;AAIM,IAAM,iCAAiC,eAAE,OAAO;AAAA,EACrD,WAAW,eAAE,OAAO;AAAA,IAClB,UAAU;AAAA,EACZ,CAAC;AACH,CAAC;;;AC3CD,eAAsB,oBACpB,SACA,SACmC;AACnC,QAAM,OAAO,MAAM,UAAU,MAAM,WAAW,OAAO,YAAY;AAAA,IAC/D,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO,SAAS;AAAA,EAClB,CAAC;AAGD,QAAM,SAAS,+BAA+B,UAAU,IAAI;AAE5D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,sCAAsC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC9E;AAEA,SAAO,OAAO;AAChB;;;AFpBO,IAAM,qBAAiB,4CAAgB,WAAW;AAAA;AAAA,EAEvD,WAAW,CAAC,aAAqB;AAAA,IAC/B,UAAU,CAAC,OAAO;AAAA,IAClB,SAAS,MAAM,oBAAoB,OAAO;AAAA,EAC5C;AACF,CAAC;;;AGTD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAIlB,IAAMC,cAAa,eAAE,OAAO,EAAE,KAAK;AAGnC,IAAM,eAAe,eAAE,KAAK,CAAC,QAAQ,WAAW,CAAC,EAAE,SAAS;AAC5D,IAAM,kBAAkB,eAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS;AAGlD,IAAM,2BAA2B,eACrC,OAAO;AAAA;AAAA,EAEN,YAAY,eAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACvC,gBAAgB,eAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA;AAAA,EAG3C,QAAQ,eAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG5B,SAAS;AAAA,EACT,YAAY;AAAA;AAAA,EAGZ,gBAAgB,eAAE,OAAO,EAAE,SAAS;AAAA,EACpC,mBAAmB,eAAE,OAAO,EAAE,SAAS;AAAA,EACvC,UAAU,eAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG9B,MAAM,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAClD,YAAY,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AACpE,CAAC,EACA;AAAA,EACC,CAAC,SAAS;AAER,UAAM,eAAe,CAAC,CAAC,KAAK;AAC5B,UAAM,mBAAmB,CAAC,CAAC,KAAK;AAChC,WAAO,iBAAiB;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM,CAAC,cAAc,gBAAgB;AAAA,EACvC;AACF;AAGK,IAAM,wBAAwB,eAAE,OAAO;AAAA,EAC5C,IAAIA;AAAA,EACJ,eAAeA;AAAA,EACf,UAAUA,YAAW,SAAS,EAAE,SAAS;AAAA,EACzC,aAAaA,YAAW,SAAS,EAAE,SAAS;AAAA,EAC5C,kBAAkB,eAAE,OAAO;AAAA,EAC3B,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO;AAAA,EACnB,kBAAkB,eAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EACtC,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,eAAe,eAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9C,UAAU,eAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACzC,aAAa,eAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAClD,WAAW,eAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,WAAW,eAAE,OAAO,EAAE,SAAS;AAAA;AACjC,CAAC;AAEM,IAAM,yBAAyB,eAAE,OAAO;AAAA,EAC7C,eAAe,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AACvC,CAAC;AAGM,IAAM,4BAA4B,eAAE,OAAO;AAAA,EAChD,UAAU,eAAE,MAAM,qBAAqB;AAAA,EACvC,YAAY,yBAAyB,QAAQ;AAAA,EAC7C,UAAU;AACZ,CAAC;;;ACrED,eAAsBC,aAAY,SAA2D;AAC3F,QAAM,SAAS,IAAI,gBAAgB;AAGnC,MAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,UAAU;AACtE,MAAI,QAAQ,eAAgB,QAAO,OAAO,kBAAkB,QAAQ,cAAc;AAGlF,MAAI,QAAQ,OAAQ,QAAO,OAAO,UAAU,QAAQ,MAAM;AAG1D,MAAI,QAAQ,QAAS,QAAO,OAAO,WAAW,QAAQ,OAAO;AAC7D,MAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,UAAU;AAGtE,MAAI,QAAQ,eAAgB,QAAO,OAAO,kBAAkB,QAAQ,cAAc;AAClF,MAAI,QAAQ,kBAAmB,QAAO,OAAO,qBAAqB,QAAQ,iBAAiB;AAC3F,MAAI,QAAQ,SAAU,QAAO,OAAO,YAAY,QAAQ,QAAQ;AAGhE,MAAI,QAAQ,KAAM,QAAO,OAAO,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/D,MAAI,QAAQ,WAAY,QAAO,OAAO,cAAc,QAAQ,WAAW,SAAS,CAAC;AAEjF,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,mBAAmB,cAAc,IAAI,WAAW,KAAK,EAAE;AAExE,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,0BAA0B,UAAU,IAAI;AAEvD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AACA,SAAO,OAAO;AAChB;;;AFvCO,IAAM,sBAAkB,4CAAgB,YAAY;AAAA,EACzD,MAAM,CAAC,aAAiC;AAAA,IACtC,UAAU,CAAC,EAAE,QAAQ,CAAC;AAAA,IACtB,SAAS,MAAMC,aAAY,OAAO;AAAA,EACpC;AACF,CAAC;;;AGTD,IAAAC,6BAAgC;;;ACchC,eAAsB,gBAA6C;AACjE,QAAM,SAAS,IAAI,gBAAgB;AAEnC,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,qBAAqB,cAAc,IAAI,WAAW,KAAK,EAAE;AAE1E,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,yBAAyB,UAAU,IAAI;AAEtD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,OAAO,EAAE;AAAA,EACvE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,aAAa,IAAwC;AACzE,QAAM,WAAW,qBAAqB,EAAE;AAExC,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAE7C,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,8BAA8B,OAAO,MAAM,OAAO,EAAE;AAAA,EACtE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,gBAAgB,OAAyD;AAC7F,QAAM,WAAW;AAEjB,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,KAAK;AAAA,IAC1B,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAE7C,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,OAAO,EAAE;AAAA,EACvE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,gBAAgB,OAAyD;AAC7F,QAAM,WAAW,qBAAqB,MAAM,EAAE;AAE9C,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,EAAE,WAAW,MAAM,CAAC;AAAA,IACzC,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAE7C,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,OAAO,EAAE;AAAA,EACvE;AACA,SAAO,OAAO;AAChB;AAGA,eAAsB,gBAAgB,IAA2B;AAC/D,QAAM,WAAW,qBAAqB,EAAE;AAExC,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAGD,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAE7C,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,OAAO,EAAE;AAAA,EACvE;AACF;AAGA,eAAsB,oBAAoB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AACF,GAAqE;AAEnE,QAAM,WAAW;AAEjB,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,MAAc,YAAY,KAAK,IAAI;AAE3D,MAAI,WAAW;AACb,aAAS,OAAO,aAAa,MAAM;AAAA,EACrC;AAEA,MAAI,UAAU;AACZ,aAAS,OAAO,YAAY,QAAQ;AAAA,EACtC;AAEA,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM;AAAA;AAAA,EAER,CAAC;AAGD,QAAM,SAAS,kCAAkC,UAAU,IAAI;AAE/D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,oCAAoC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC5E;AACA,SAAO,OAAO;AAChB;;;ADnJO,IAAM,wBAAoB,4CAAgB,cAAc;AAAA;AAAA,EAE7D,KAAK;AAAA,IACH,UAAU;AAAA,IACV,SAAS,MAAM,cAAc;AAAA,EAC/B;AAAA,EAEA,MAAM,CAAC,QAAgB;AAAA,IACrB,UAAU,CAAC,EAAE;AAAA,IACb,SAAS,MAAM,aAAa,EAAE;AAAA,EAChC;AACF,CAAC;;;AEdD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAIlB,IAAMC,gBAAe,eAClB,KAAK,CAAC,YAAY,YAAY,aAAa,cAAc,iBAAiB,cAAc,CAAC,EACzF,SAAS;AAEZ,IAAMC,mBAAkB,eAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS;AAGlD,IAAM,mCAAmC,eAAE,OAAO;AAAA,EACvD,gBAAgB,eAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EAC3C,WAAW,eAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACtC,eAAe,eAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EAC1C,QAAQD;AAAA,EACR,WAAWC;AAAA,EACX,OAAO,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC7D,QAAQ,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AACtD,CAAC;AAGM,IAAM,0BAA0B,eAAE,OAAO;AAAA,EAC9C,UAAU,eAAE,OAAO;AAAA,EACnB,UAAU,eAAE,OAAO;AAAA,EACnB,WAAW,eAAE,OAAO;AAAA,EACpB,eAAe,eAAE,MAAM,eAAE,OAAO,EAAE,KAAK,CAAC;AAAA,EACxC,UAAU,eAAE,OAAO;AAAA,EACnB,cAAc,eAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAClC,aAAa,eAAE,OAAO,EAAE,IAAI;AAC9B,CAAC;AAGM,IAAM,sCAAsC,eAAE,OAAO;AAAA,EAC1D,oBAAoB,eAAE,MAAM,uBAAuB;AAAA,EACnD,YAAY;AACd,CAAC;;;AC/BD,eAAsB,sBACpB,OACwC;AACxC,QAAM,SAAS,IAAI,gBAAgB;AAGnC,MAAI,MAAM,eAAgB,QAAO,OAAO,mBAAmB,MAAM,cAAc;AAC/E,MAAI,MAAM,UAAW,QAAO,OAAO,cAAc,MAAM,SAAS;AAChE,MAAI,MAAM,cAAe,QAAO,OAAO,kBAAkB,MAAM,aAAa;AAG5E,MAAI,MAAM,OAAQ,QAAO,OAAO,WAAW,MAAM,MAAM;AACvD,MAAI,MAAM,UAAW,QAAO,OAAO,cAAc,MAAM,SAAS;AAGhE,MAAI,MAAM,UAAU,OAAW,QAAO,OAAO,SAAS,MAAM,MAAM,SAAS,CAAC;AAC5E,MAAI,MAAM,WAAW,OAAW,QAAO,OAAO,UAAU,MAAM,OAAO,SAAS,CAAC;AAE/E,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,WAAW,sCAAsC,cAAc,IAAI,WAAW,KAAK,EAAE;AAE3F,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAGD,QAAM,SAAS,oCAAoC,UAAU,IAAI;AAEjE,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,wCAAwC,OAAO,MAAM,OAAO,EAAE;AAAA,EAChF;AACA,SAAO,OAAO;AAChB;;;AFlCO,IAAM,gCAA4B;AAAA,EACvC;AAAA,EACA;AAAA;AAAA,IAEE,MAAM,CAAC,WAAuC;AAAA,MAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;AAAA,MACpB,SAAS,MAAM,sBAAsB,KAAK;AAAA,IAC5C;AAAA,EACF;AACF;;;AGbA,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAGX,IAAM,yBAAyB,eAAE,OAAO;AAAA,EAC7C,aAAa,eAAE,QAAQ;AACzB,CAAC;;;ACCD,eAAsB,YACpB,SAC2B;AAC3B,QAAM,WAAW;AAEjB,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,uBAAuB,UAAU,IAAI;AAEpD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,6BAA6B,OAAO,MAAM,OAAO,EAAE;AAAA,EACrE;AAEA,SAAO,OAAO;AAChB;;;AFrBO,IAAM,sBAAkB,4CAAgB,YAAY;AAAA,EACzD,OAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,CAAC,YAAY,YAAY,OAAO;AAAA,EAC3C;AACF,CAAC;;;AGRD,IAAAC,6BAAgC;;;ACAhC,IAAAC,eAAkB;AAGX,IAAM,6BAA6B,eAAE,KAAK;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,gCAAgC,eAAE,KAAK,CAAC,OAAO,MAAM,CAAC;AAI5D,IAAM,gCAAgC,eAAE,OAAO;AAAA,EACpD,OAAO,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC7D,QAAQ,eAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpD,gBAAgB,eAAE,OAAO,EAAE,SAAS;AAAA,EACpC,kBAAkB,eAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,gBAAgB,eAAE,OAAO,EAAE,SAAS;AAAA,EACpC,gBAAgB,eAAE,OAAO,EAAE,SAAS;AAAA,EACpC,QAAQ,2BAA2B,SAAS;AAAA,EAC5C,WAAW,8BAA8B,SAAS;AAAA,EAClD,MAAM,eAAE,OAAO,EAAE,MAAM,qBAAqB,EAAE,SAAS;AAAA;AACzD,CAAC;AAIM,IAAM,0BAA0B,eAAE,OAAO;AAAA,EAC9C,MAAM,eAAE,OAAO;AAAA,EACf,QAAQ,eAAE,OAAO;AAAA,EACjB,YAAY,eACT,OAAO;AAAA,IACN,UAAU,eAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,WAAW,eAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC,EACA,SAAS;AAAA,EACZ,aAAa,eAAE,OAAO;AAAA,EACtB,SAAS,eAAE,OAAO;AAAA,EAClB,aAAa,eAAE,OAAO;AAAA,EACtB,eAAe,eAAE,OAAO;AAC1B,CAAC;AAIM,IAAM,+BAA+B,eAAE,OAAO;AAAA,EACnD,MAAM,eAAE,MAAM,uBAAuB;AAAA,EACrC,OAAO,eAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,YAAY,eAAE,OAAO,EAAE,SAAS;AAClC,CAAC;AAIM,IAAM,+BAA+B,eAAE,OAAO;AAAA,EACnD,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,MAAM,eAAE,OAAO;AAAA,EACf,YAAY,eAAE,OAAO;AAAA,EACrB,aAAa,eAAE,OAAO;AAAA,EACtB,SAAS,eAAE,OAAO;AAAA,EAClB,aAAa,eAAE,OAAO;AAAA,EACtB,eAAe,eAAE,OAAO;AAAA,EACxB,sBAAsB,eAAE,OAAO,EAAE,SAAS;AAC5C,CAAC;AAGM,IAAM,mCAAmC,eAAE,OAAO;AAAA,EACvD,UAAU,6BAA6B,SAAS;AAClD,CAAC;;;ACxDD,eAAsB,kBACpB,OACA,QACA,SACiC;AACjC,QAAM,eAAe,IAAI,gBAAgB;AACzC,MAAI,QAAQ,UAAU,OAAW,cAAa,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;AAC/E,MAAI,QAAQ,WAAW,OAAW,cAAa,IAAI,UAAU,OAAO,OAAO,MAAM,CAAC;AAClF,MAAI,QAAQ,eAAgB,cAAa,IAAI,kBAAkB,OAAO,cAAc;AACpF,MAAI,QAAQ,qBAAqB;AAC/B,iBAAa,IAAI,oBAAoB,OAAO,OAAO,gBAAgB,CAAC;AACtE,MAAI,QAAQ,mBAAmB;AAC7B,iBAAa,IAAI,kBAAkB,OAAO,OAAO,cAAc,CAAC;AAClE,MAAI,QAAQ,mBAAmB;AAC7B,iBAAa,IAAI,kBAAkB,OAAO,OAAO,cAAc,CAAC;AAClE,MAAI,QAAQ,OAAQ,cAAa,IAAI,UAAU,OAAO,MAAM;AAC5D,MAAI,QAAQ,UAAW,cAAa,IAAI,aAAa,OAAO,SAAS;AACrE,MAAI,QAAQ,KAAM,cAAa,IAAI,QAAQ,OAAO,IAAI;AAEtD,QAAM,QAAQ,aAAa,SAAS;AACpC,QAAM,WAAW,oCAAoC,KAAK,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE;AAErF,QAAM,OAAO,MAAM,UAAU,MAAe,UAAU;AAAA,IACpD,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,6BAA6B,UAAU,IAAI;AAC1D,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,MAAM,sCAAsC,OAAO,KAAK;AAChE,UAAM,IAAI,MAAM,6CAA6C,OAAO,MAAM,OAAO,EAAE;AAAA,EACrF;AACA,SAAO,OAAO;AAChB;AAMA,eAAsB,sBACpB,OACA,QACA,SACqC;AACrC,QAAM,WAAW,oCAAoC,KAAK,SAAS,MAAM;AACzE,QAAM,OAAO,MAAM,UAAU,MAAe,UAAU;AAAA,IACpD,QAAQ;AAAA,IACR,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,SAAS,iCAAiC,UAAU,IAAI;AAC9D,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,MAAM,sCAAsC,OAAO,KAAK;AAChE,UAAM,IAAI,MAAM,kDAAkD,OAAO,MAAM,OAAO,EAAE;AAAA,EAC1F;AACA,SAAO,OAAO;AAChB;;;AFnEO,IAAM,4BAAwB,4CAAgB,kBAAkB;AAAA,EACrE,MAAM,CAAC,OAAe,YAAsC;AAAA,IAC1D,UAAU,CAAC,OAAO,MAAM;AAAA,IACxB,SAAS,CAAC,EAAE,OAAO,MAAM,kBAAkB,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,EACtE;AAAA,EACA,MAAM,CAAC,OAAe,YAAoB;AAAA,IACxC,UAAU,CAAC,OAAO,MAAM;AAAA,IACxB,SAAS,CAAC,EAAE,OAAO,MAAM,sBAAsB,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,EAC1E;AACF,CAAC;;;AGbD,IAAAC,sBAAyB;AAIlB,SAAS,uBAAuB;AACrC,aAAO,8BAAS;AAAA,IACd,GAAG,yBAAyB;AAAA,IAC5B,GAAG;AAAA,EACL,CAAC;AACH;;;ACTA,IAAAC,sBAAyB;AAUlB,SAAS,aAAa,EAAE,QAAQ,UAAU,KAAK,GAAwB;AAC5E,aAAO,8BAAS;AAAA;AAAA,IAEd,GAAG,iBAAiB,SAAS,MAAO;AAAA,IACpC,GAAG;AAAA,IACH,SAAS,CAAC,CAAC,UAAU;AAAA,EACvB,CAAC;AACH;;;ACjBA,IAAAC,sBAAsD;AAgB/C,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,UAAU;AACZ,GAA8B;AAC5B,aAAO,8BAAS;AAAA,IACd,GAAG,sBAAsB,MAAM,MAAM;AAAA,IACrC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAGO,SAAS,+BAA+B;AAC7C,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,YACX,0BAA0B,OAAO;AAAA,EACrC,CAAC;AACH;AAGO,SAAS,sBAAsB;AACpC,QAAM,kBAAc,oCAAe;AAEnC,aAAO,iCAAY;AAAA,IACjB,YAAY,CAAC,YAAqC,iBAAiB,OAAO;AAAA,IAC1E,WAAW,CAAC,MAAM,cAAc;AAC9B,kBAAY,kBAAkB;AAAA,QAC5B,UAAU,sBAAsB,MAAM;AAAA,UACpC,SAAS,UAAU;AAAA,UACnB,iBAAiB,UAAU;AAAA,QAC7B,CAAC,EAAE;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AClDA,IAAAC,uBAAyB;;;ACAzB,IAAAC,gBAAwB;AAGxB,kBAA4B;;;ACQrB,SAAS,oBAAoB,aAAmD;AACrF,QAAM,kBAAkB,aAAa,aAAa,kBAAkB;AACpE,QAAM,mBAAmB,aAAa,oBAAoB;AAC1D,QAAM,oBAAoB,aAAa,qBAAqB;AAC5D,QAAM,iBAAiB,CAAC,oBAAoB,CAAC;AAC7C,SAAO,EAAE,iBAAiB,kBAAkB,mBAAmB,eAAe;AAChF;AAEO,SAAS,4BACd,aACA,OACa;AACb,MAAI,MAAM,gBAAiB,QAAO;AAClC,MAAI,CAAC,MAAM,qBAAqB,MAAM,iBAAkB,QAAO;AAC/D,SAAO;AACT;;;ADwCA,SAAS,kBAAkB,QAAgB,OAA6C;AACtF,MAAI,CAAC,MAAM,SAAU,QAAO;AAC5B,QAAM,YAAY,eAAW,yBAAY,QAAQ,MAAM,QAAQ,CAAC;AAChE,SAAO,YAAY,MAAM;AAC3B;AAMO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf;AACF,GAAyD;AACvD,aAAO,uBAAQ,MAAM;AACnB,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,wBAAwB;AAAA,QACxB,mBAAmB;AAAA,QACnB,cAAc;AAAA,QACd,mBAAmB;AAAA,QACnB,aAAa;AAAA,QACb,eAAe;AAAA,QACf,eAAe;AAAA,QACf,eAAe;AAAA,QACf,yBAAyB;AAAA,QACzB,uBAAuB;AAAA,QACvB,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,wBAAwB;AAAA,QACxB,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,cAAc,YAAY;AAChC,UAAM,EAAE,eAAe,IAAI,oBAAoB,WAAW;AAC1D,UAAM,mBAAmB,YAAY,mBAAmB,UAAU;AAClE,UAAM,wBAAwB,YAAY,yBAAyB;AAEnE,UAAM,aAAa,aAAa,cAAc;AAC9C,UAAM,iBAAiB,aAAa,kBAAkB;AACtD,UAAM,gBAAgB,aAAa,iBAAiB;AACpD,UAAM,gBAAgB,aAAa,iBAAiB;AACpD,UAAM,yBAAyB,aAAa,0BAA0B;AAEtE,UAAM,kBAAkB,aAAa,iBAAiB;AACtD,UAAM,kBAAkB,aAAa,kBAAkB;AAGvD,UAAM,kBAAkB,OAAO,YAAY,aAAa,MAAM,OAAO;AACrE,UAAM,eAAe,kBAAkB,UAAa,kBAAkB;AAEtE,UAAM,oBAAoB,CAAC;AAC3B,UAAM,eAAe,CAAC,gBAAgB,gBAAgB;AAGtD,UAAM,qBAAqB,sBAAsB,MAAM,YAAY;AAInE,UAAM,sBAAsB,YAAY,gBAAgB,CAAC;AACzD,UAAM,2BAA2B,qBAAqB,YAAY;AAElE,QAAI,iBAAgC;AACpC,QAAI,aAA4B;AAEhC,QAAI,wBAAwB,cAAc;AACxC,uBAAiB,kBAAkB,cAAc,qBAAqB,KAAK;AAAA,IAC7E;AAEA,QAAI,sBAAsB;AACxB,YAAM,gBAAgB,OAAO,qBAAqB,MAAM;AACxD,mBAAa,kBAAkB,eAAe,qBAAqB,KAAK;AAAA,IAC1E;AAIA,UAAM,mBAAmB,aAAa,oBAAoB;AAC1D,UAAM,qBAAqB,aAAa,sBAAsB;AAC9D,UAAM,gBAAgB,KAAK;AAAA,MACzB,oBAAoB,4BAA4B;AAAA,MAChD;AAAA,IACF;AAGA,UAAM,mBAAmB,aAAa;AAEtC,UAAM,qBAAqB,aAAa;AAGxC,UAAM,gBACJ,uBACC,oBAAoB,2BACjB,mBAAmB,2BACnB;AAGN,UAAM,gBAAgB;AAGtB,UAAM,MAAM,YAAY,OAAO;AAC/B,UAAM,cAAc,kBAAkB,QAAQ,OAAO;AACrD,UAAM,0BACJ,kBAAkB,QAAQ,gBAAgB,IACtC,KAAK,IAAK,MAAM,gBAAiB,KAAK,GAAG,IACzC;AAEN,QAAI,yBAAyB;AAC7B,QAAI,wBAAwB,cAAc;AACxC,YAAM,gBAAgB,OAAO,qBAAqB,MAAM;AACxD,+BAAyB,eAAe;AAAA,IAC1C;AAEA,UAAM,iBAAiB,CAAC,EACtB,mBAAmB,QACnB,gBAAgB,KAChB,iBAAiB;AAGnB,UAAM,iBAAiB,CAAC,EACtB,mBAAmB,QACnB,kBAAkB,QAClB,iBAAiB;AAGnB,QAAI;AACJ,QAAI,oBAAmC;AAEvC,QAAI,cAAc;AAChB,mBAAa;AAAA,IACf,WAAW,WAAW;AACpB,mBAAa;AAAA,IACf,WAAW,cAAc;AACvB,mBAAa;AAAA,IACf,WAAW,iBAAiB;AAC1B,mBAAa,yBAAyB;AACtC,0BACE,yBAAyB;AAAA,IAC7B,WAAW,aAAa;AACtB,mBAAa;AACb,0BAAoB;AAAA,IACtB,WAAW,mBAAmB;AAC5B,mBAAa;AACb,0BAAoB;AAAA,IACtB,WAAW,cAAc;AACvB,mBAAa;AAAA,IACf,WAAW,wBAAwB;AACjC,mBAAa;AACb,0BAAoB;AAAA,IACtB,WAAW,gBAAgB;AACzB,mBAAa,YAAY,cAAc,eAAe,CAAC;AACvD,0BAAoB,uBAAuB,cAAc,eAAe,CAAC;AAAA,IAC3E,WAAW,kBAAkB,iBAAiB,MAAM;AAClD,mBAAa,YAAY,cAAc,eAAe,CAAC;AACvD,0BAAoB,uBAAuB,cAAc,eAAe,CAAC;AAAA,IAC3E,WAAW,iBAAiB;AAC1B,mBAAa;AAAA,IACf,WAAW,iBAAiB;AAC1B,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa;AAAA,IACf;AAEA,UAAM,eAAe,aAAa;AAClC,UAAM,aACJ,CAAC,mBACD,CAAC,eACD,CAAC,gBACD,CAAC,qBACD,CAAC,gBACD,CAAC,0BACD,CAAC,kBACD,CAAC;AAEH,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,sBAAsB,cAAc,WAAW,cAAc,aAAa,CAAC;AAC9F;;;AE7RA,IAAAC,gBAA0D;;;ACA1D,IAAAC,gBAAqC;AACrC,IAAAC,eAA2B;AAC3B,IAAAC,gBAAsD;AAStD,SAAS,yBACP,cACA,QACS;AACT,MAAI,CAAC,gBAAgB,CAAC,OAAQ,QAAO;AAErC,MAAI;AACF,UAAM,UAAU,OAAO,aAAa,MAAM;AAC1C,UAAM,mBAAe,yBAAW,QAAQ,aAAa,MAAM,QAAQ;AACnE,WAAO,UAAU;AAAA,EACnB,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,OAAO,EAAE,cAAc,OAAO,CAAC;AACtE,WAAO;AAAA,EACT;AACF;AASO,SAAS,gBAAgB,EAAE,cAAc,QAAQ,UAAU,GAAyB;AACzF,QAAM,QAAQ,cAAc;AAC5B,QAAM,eAAW;AAAA,IACf,UAAM,iCAAkB,QAAQ,OAAO,QAAQ;AAAA,IAC/C,CAAC,QAAQ,OAAO,QAAQ;AAAA,EAC1B;AAEA,QAAM,6BAAyB;AAAA,IAC7B,MAAM,yBAAyB,cAAc,MAAM;AAAA,IACnD,CAAC,cAAc,MAAM;AAAA,EACvB;AAEA,QAAM,qBAAiB,2BAAY,MAAM;AACvC,QAAI,CAAC,cAAc,SAAS,CAAC,aAAa,OAAQ;AAClD,UAAM,gBAAY,kCAAmB,aAAa,QAAQ,aAAa,MAAM,QAAQ;AACrF,cAAU,SAAS;AAAA,EACrB,GAAG,CAAC,cAAc,SAAS,CAAC;AAE5B,QAAM,mBAAe,uBAAQ,MAAM;AACjC,QAAI,CAAC,SAAS,CAAC,OAAQ,QAAO;AAC9B,QAAI;AACF,iBAAO,yBAAW,QAAQ,MAAM,QAAQ;AAAA,IAC1C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADxBO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAA0D;AACxD,QAAM,CAAC,sBAAsB,uBAAuB,QAAI,wBAA6B;AACrF,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6B;AAGzD,+BAAU,MAAM;AACd,4BAAwB,MAAS;AACjC,cAAU,MAAS;AAAA,EACrB,GAAG,CAAC,aAAa,CAAC;AAGlB,+BAAU,MAAM;AACd,QAAI,SAAS,WAAW,EAAG;AAE3B,UAAM,wBAAwB,SAAS;AAAA,MACrC,CAAC,MAAM,EAAE,MAAM,YAAY;AAAA,IAC7B;AAEA,QAAI,CAAC,wBAAwB,CAAC,uBAAuB;AACnD,8BAAwB,SAAS,CAAC,EAAE,MAAM,OAAO;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,sBAAsB,QAAQ,CAAC;AAGnC,QAAM,2BAAuB;AAAA,IAC3B,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM,YAAY,oBAAoB,KAAK;AAAA,IACxE,CAAC,UAAU,oBAAoB;AAAA,EACjC;AAGA,QAAM,EAAE,gBAAgB,cAAc,UAAU,uBAAuB,IAAI,gBAAgB;AAAA,IACzF,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,YAAQ,2BAAY,MAAM;AAC9B,4BAAwB,MAAS;AACjC,cAAU,MAAS;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEpGA,IAAAC,gBAA4B;;;ACA5B,IAAAC,gBAAsC;AACtC,IAAAC,uBAA+B;;;ACD/B,IAAAC,sBAAqD;;;ACArD,IAAAC,eAAkB;AAEX,IAAM,oBAAoB,eAAE,OAAO;AAAA,EACxC,SAAS,eAAE,OAAO,EAAE,IAAI;AAAA,EACxB,MAAM,eAAE,OAAO;AAAA,EACf,IAAI,eAAE,OAAO;AAAA,EACb,OAAO,eAAE,OAAO;AAAA,EAChB,UAAU,eAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAEM,IAAM,mBAAmB,eAAE,OAAO;AAAA,EACvC,SAAS,eAAE,OAAO;AAAA,EAClB,QAAQ,eAAE,OAAO;AAAA,EACjB,UAAU,eAAE,OAAO,EAAE,IAAI;AAAA,EACzB,SAAS,eAAE,OAAO;AACpB,CAAC;AAEM,IAAM,kBAAkB,eAAE,OAAO;AAAA,EACtC,QAAQ,eAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,IAAI;AACN,CAAC;AAEM,IAAM,sBAAsB,eAAE,OAAO;AAAA,EAC1C,UAAU,eAAE,OAAO;AAAA,EACnB,aAAa,eAAE,OAAO;AAAA,EACtB,WAAW,eAAE,OAAO;AAAA,EACpB,KAAK,eAAE,OAAO;AAAA,EACd,OAAO,eAAE,MAAM,eAAe;AAChC,CAAC;AAEM,IAAM,uBAAuB,eAAE,OAAO;AAAA,EAC3C,MAAM,eAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,aAAa,eAAE,OAAO,EAAE,SAAS;AAAA,EACjC,aAAa;AAAA,EACb,UAAU,oBAAoB,SAAS;AACzC,CAAC;AAEM,IAAM,uBAAuB,eAAE,OAAO;AAAA,EAC3C,UAAU,eAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACrC,cAAc,eAAE,MAAM,oBAAoB,EAAE,SAAS;AACvD,CAAC;AAEM,IAAM,gCAAgC,eAAE,OAAO;AAAA,EACpD,SAAS,eAAE,QAAQ;AAAA,EACnB,SAAS,eAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;;;ACvBD,eAAe,aACb,YACA,QACyB;AACzB,QAAM,EAAE,eAAe,GAAG,KAAK,IAAI;AAEnC,QAAM,OAAO,MAAM,UAAU;AAAA,IAC3B,eAAe,UAAU,IAAI,aAAa;AAAA,IAC1C;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,qBAAqB,UAAU,IAAI;AAElD,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,MAAM,eAAe,OAAO,KAAK;AACzC,UAAM,IAAI;AAAA,MACR,mBAAmB,UAAU,YAAY,OAAO,MAAM,OAAO;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAGO,IAAM,sBAAsB,CAAC,WAClC,aAAa,WAAW,MAAM;AAGzB,IAAM,uBAAuB,CAAC,WACnC,aAAa,YAAY,MAAM;AAG1B,IAAM,4BAA4B,CAAC,WACxC,aAAa,kBAAkB,MAAM;AAGhC,IAAM,2BAA2B,CAAC,WACvC,aAAa,iBAAiB,MAAM;AAG/B,IAAM,4BAA4B,CAAC,WACxC,aAAa,kBAAkB,MAAM;AAGhC,IAAM,6BAA6B,CAAC,WACzC,aAAa,mBAAmB,MAAM;AAGxC,eAAsB,gBACpB,QACkC;AAClC,QAAM,EAAE,UAAU,OAAO,IAAI;AAE7B,QAAM,OAAO,MAAM,UAAU,MAAM,yBAAyB,QAAQ,IAAI;AAAA,IACtE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM,EAAE,OAAO;AAAA,IACf,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,QAAM,SAAS,8BAA8B,UAAU,IAAI;AAE3D,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,MAAM,eAAe,OAAO,KAAK;AACzC,UAAM,IAAI,MAAM,qCAAqC,OAAO,MAAM,OAAO,EAAE;AAAA,EAC7E;AACA,SAAO,OAAO;AAChB;AAGO,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAClC,IAAM,iCAAiC;;;AFhD9C,SAAS,iBACP,YACA;AACA,SAAO,SAAS,UACd,SACA;AACA,eAAO,iCAAY;AAAA,MACjB;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;AAMO,IAAM,mBAAmB,iBAAiB,mBAAmB;AAM7D,IAAM,oBAAoB,iBAAuC,oBAAoB;AAMrF,IAAM,yBAAyB,iBAAiB,yBAAyB;AAMzE,IAAM,wBAAwB,iBAA2C,wBAAwB;AAMjG,IAAM,yBAAyB,iBAA4C,yBAAyB;AAMpG,IAAM,0BAA0B,iBAAiB,0BAA0B;AAM3E,SAAS,mBAAmB,SAA0C;AAC3E,aAAO,iCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;AAGO,IAAM,8BAA8B;AACpC,IAAM,+BAA+B;AACrC,IAAM,oCAAoC;;;AD1EjD,IAAM,uBAAuB;AAEtB,SAAS,eAAe,SAAsD;AACnF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,kBAAc,qCAAe;AACnC,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAA+B,IAAI;AACnE,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAElD,QAAM,gBAAgB,iBAAiB;AACvC,QAAMC,mBAAkB,mBAAmB;AAE3C,QAAM,2BAAuB,2BAAY,CAAC,WAA+C;AACvF,WAAO;AAAA,MACL,IAAI,OAAO,YAAY;AAAA,MACvB,MAAM,OAAO,YAAY;AAAA,MACzB,OAAO,OAAO,YAAY;AAAA,MAC1B,UAAU,OAAO,YAAY;AAAA,MAC7B,MAAM,OAAO;AAAA,IACf;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,sCAAkC;AAAA,IACtC,OAAO,iBAAgE;AACrE,UAAI;AAEJ,iBAAW,UAAU,cAAc;AACjC,cAAM,YAAY,qBAAqB,MAAM;AAE7C,cAAM,SAAS,MAAM,0BAA0B,SAAS;AAExD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,uBAAuB,OAAO,eAAe,qBAAqB,EAAE;AAAA,QACtF;AAEA,qBAAa;AAAA,MACf;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,2BAA2B,oBAAoB;AAAA,EAClD;AAEA,QAAM,iCAA6B;AAAA,IACjC,OAAO,UAAkB,WAAkC;AACzD,UAAI;AACF,cAAMA,iBAAgB,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,MACxD,SAAS,gBAAgB;AACvB,gBAAQ,KAAK,uDAAuD,cAAc;AAAA,MACpF;AAAA,IACF;AAAA,IACA,CAACA,gBAAe;AAAA,EAClB;AAEA,QAAM,cAAU;AAAA,IACd,OACE,QACA,cACA,WAAmB,yBACa;AAChC,eAAS,IAAI;AAEb,UAAI,CAAC,aAAa,IAAI;AACpB,cAAM,MAAM,IAAI,MAAM,yBAAyB;AAC/C,iBAAS,GAAG;AACZ,cAAM;AAAA,MACR;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,MAAM,IAAI,MAAM,qBAAqB;AAC3C,iBAAS,GAAG;AACZ,cAAM;AAAA,MACR;AAEA,UAAI,UAAU,IAAI;AAChB,cAAM,MAAM,IAAI,MAAM,+BAA+B;AACrD,iBAAS,GAAG;AACZ,cAAM;AAAA,MACR;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM,cAAc,YAAY;AAAA,UACrD;AAAA,UACA,eAAe,YAAY;AAAA,UAC3B;AAAA,UACA,SAAS;AAAA,UACT,QAAQ,OAAO,SAAS;AAAA,UACxB;AAAA,UACA;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAED,cAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,YAAI,CAAC,gBAAgB,aAAa,WAAW,GAAG;AAC9C,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAChE;AAEA,cAAM,iBAAiB,aAAa,KAAK,CAAC,OAAO,GAAG,QAAQ;AAC5D,YAAI,gBAAgB,UAAU;AAC5B,sBAAY,eAAe,QAAQ;AAAA,QACrC;AAEA,cAAM,eAAe,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,SAAS;AACpE,sBAAc,YAAY;AAE1B,wBAAgB,IAAI;AACpB,cAAM,cAAc,MAAM,gCAAgC,YAAY;AAEtE,YAAI,YAAY,aAAa;AAC3B,gBAAM,2BAA2B,UAAU,WAAW;AAAA,QACxD;AAEA,YAAI,aAAa;AACf,sBAAY,kBAAkB;AAAA,YAC5B,UAAU,eAAe,UAAU,WAAW,EAAE;AAAA,UAClD,CAAC;AAAA,QACH;AACA,oBAAY;AAEZ,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAMC,SAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAASA,MAAK;AACd,cAAMA;AAAA,MACR,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAgB,2BAAY,MAAM;AACtC,gBAAY,IAAI;AAChB,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA,WAAW,cAAc;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADjKO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,QAAM,YAAY,oBAAoB;AAAA,IACpC;AAAA,IACA,eAAe,aAAa;AAAA,EAC9B,CAAC;AAED,QAAM;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AACf,gBAAU,UAAU,MAAS;AAC7B,oBAAc;AACd,wBAAkB;AAClB,yBAAmB;AAAA,IACrB;AAAA,EACF,CAAC;AAED,QAAM,eAAe,aAAa;AAElC,QAAM,aAAa,qBAAqB;AAAA,IACtC;AAAA,IACA,sBAAsB,UAAU;AAAA,IAChC,cAAc,UAAU;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAU,2BAAY,YAAY;AACtC,QAAI,CAAC,UAAU,gBAAgB,CAAC,UAAU,sBAAsB;AAC9D,aAAO;AAAA,IACT;AACA,WAAO,eAAe,UAAU,cAAc,UAAU,sBAAsB,WAAW;AAAA,EAC3F,GAAG,CAAC,UAAU,cAAc,UAAU,sBAAsB,gBAAgB,WAAW,CAAC;AAExF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AKrHA,IAAAC,iBAAwB;;;ACAxB,mBAA6C;AAC7C,IAAAC,eAAyB;AACzB,IAAAC,gBAAqC;AAQrC,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AACF;AAEA,IAAM,yBAAyB;AAO/B,SAAS,cAAc,OAAuB;AAC5C,SAAO,MAAM,YAAY,uBAAuB,SAAS,MAAM,QAAQ,YAAY,CAAC;AACtF;AAgBO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAA4D;AAE1D,QAAM,EAAE,cAAc,YAAY,QAAI,uBAAQ,MAAM;AAClD,UAAM,SAAkB,CAAC;AACzB,UAAM,QAAiB,CAAC;AAExB,eAAW,SAAS,QAAQ;AAC1B,UAAI,cAAc,KAAK,GAAG;AACxB,eAAO,KAAK,KAAK;AAAA,MACnB,OAAO;AACL,cAAM,KAAK,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,WAAO,EAAE,cAAc,QAAQ,aAAa,MAAM;AAAA,EACpD,GAAG,CAAC,MAAM,CAAC;AAIX,QAAM,cAAc,aAAa,CAAC;AAClC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,EACX,QAAI,yBAAW;AAAA,IACb;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,WAAW,CAAC,CAAC,WAAW,aAAa,SAAS;AAAA,MACvD,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,IACxB;AAAA,EACF,CAAC;AAGD,QAAM,gBAAY,uBAAQ,MAAM;AAC9B,QAAI,CAAC,WAAW,CAAC,QAAS,QAAO,CAAC;AAElC,WAAO,YAAY;AAAA,MACjB,CAAC,WACE;AAAA,QACC,SAAS,MAAM;AAAA,QACf,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAwB;AAAA,QAC/B;AAAA,MACF;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,aAAa,SAAS,SAAS,OAAO,CAAC;AAG3C,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,EACX,QAAI,+BAAiB;AAAA,IACnB;AAAA,IACA,OAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,WAAW,CAAC,CAAC,WAAW,YAAY,SAAS;AAAA,MACtD,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,IACxB;AAAA,EACF,CAAC;AAGD,QAAM,eAAW,uBAAQ,MAAM;AAC7B,UAAM,SAAyB,CAAC;AAGhC,QAAI,eAAe,mBAAmB;AACpC,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,QAAQ,kBAAkB,MAAM,SAAS;AAAA,QACzC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,gBAAgB,aAAa,SAAS,GAAG;AAC3C,kBAAY,QAAQ,CAAC,OAAO,UAAU;AACpC,cAAM,cAAc,aAAa,KAAK;AAEtC,YAAI,UAAU;AACd,YAAI,aAAa,WAAW,aAAa,OAAO,YAAY,WAAW,UAAU;AAC/E,oBAAU,YAAY,OAAO,SAAS;AAAA,QACxC;AAEA,eAAO,KAAK;AAAA,UACV;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,mBAAmB,cAAc,WAAW,CAAC;AAG9D,QAAM,YACH,aAAa,SAAS,KAAK,mBAAqB,YAAY,SAAS,KAAK;AAG7E,QAAM,QAAQ,eAAe;AAG7B,QAAM,cAAU,2BAAY,MAAM;AAChC,QAAI,aAAa,SAAS,GAAG;AAC3B,oBAAc;AAAA,IAChB;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,YAAY,QAAQ,eAAe,YAAY,CAAC;AAEzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAS,QAAkB;AAAA,IAClC;AAAA,EACF;AACF;;;AC1KA,IAAAC,gBAAwB;;;ACAxB,IAAAC,uBAAyB;AAEzB,IAAAC,gBAAwB;AAMxB,IAAAC,eAA2B;AAgBpB,SAAS,oBAAoB;AAAA,EAClC;AACF,GAA0D;AACxD,QAAM,EAAE,kBAAkB,IAAI,mBAAmB;AACjD,QAAM,EAAE,SAAS,IAAI,mBAAmB;AAExC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF,QAAI,+BAAS;AAAA,IACX,GAAG,eAAe,UAAU,WAAW,EAAE;AAAA,IACzC,GAAG;AAAA,IACH,SAAS,CAAC,CAAC;AAAA,IACX,iBAAiB,IAAI,KAAK;AAAA;AAAA,EAC5B,CAAC;AAED,QAAM,eAAW,uBAAQ,MAAM;AAC7B,QAAI,CAAC,cAAe,QAAO,CAAC;AAE5B,UAAM,gBAAgC,CAAC;AAEvC,kBAAc,UAAU,SAAS,QAAQ,QAAQ,CAAC,WAAW;AAC3D,aAAO,OAAO,QAAQ,CAAC,mBAAmB;AACxC,cAAM,UAAU,eAAe,MAAM;AAGrC,cAAM,iBAAiB,SAAS,eAAe,SAAS,OAAO;AAG/D,cAAM,QAAe,kBAAkB;AAAA,UACrC,IAAI,eAAe;AAAA,UACnB,QAAQ,eAAe;AAAA,UACvB,MAAM,eAAe;AAAA,UACrB,SAAS,eAAe;AAAA,UACxB,UAAU,eAAe;AAAA,UACzB,SAAS,eAAe,WAAW;AAAA,UACnC,OAAO,kBAAkB,OAAO,KAAK;AAAA,YACnC,IAAI,eAAe,MAAM,MAAM;AAAA;AAAA,YAC/B,SAAS,eAAe,MAAM;AAAA,YAC9B,MAAM,eAAe,MAAM,QAAQ;AAAA,YACnC,MAAM,eAAe,MAAM;AAAA,YAC3B,QAAQ,eAAe,MAAM;AAAA,YAC7B,SAAS,eAAe,MAAM;AAAA,YAC9B,WAAW,eAAe,MAAM;AAAA,YAChC,aAAa,eAAe,MAAM;AAAA,UACpC;AAAA,UACA,UAAU,eAAe;AAAA,UACzB,UAAU,eAAe,SAAS;AAAA,QACpC;AAGA,YAAI;AACJ,YAAI;AACF,4BAAc,yBAAW,eAAe,QAAQ,MAAM,QAAQ,EAAE,SAAS;AAAA,QAC3E,SAASC,QAAO;AACd,kBAAQ,MAAM,+CAA+C;AAAA,YAC3D,QAAQ,eAAe;AAAA,YACvB,UAAU,MAAM;AAAA,YAChB,OAAAA;AAAA,UACF,CAAC;AACD,wBAAc;AAAA,QAChB;AAEA,sBAAc,KAAK;AAAA,UACjB;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,mBAAmB,QAAQ,CAAC;AAE/C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAS,QAAkB;AAAA,IAClC;AAAA,EACF;AACF;;;AC1FO,IAAK,wBAAL,kBAAKC,2BAAL;AACL,EAAAA,8CAAA,aAAU,KAAV;AACA,EAAAA,8CAAA,eAAY,KAAZ;AACA,EAAAA,8CAAA,UAAO,KAAP;AAHU,SAAAA;AAAA,GAAA;;;ACdZ,IAAAC,eAA4B;;;ACErB,IAAM,6BAA6B;AAAA,EACxC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;;;ADJO,SAAS,kBAAkB,QAAwC;AACxE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH;AAAA,IACF,KAAK;AACH;AAAA,IACF,KAAK;AACH;AAAA,EACJ;AACF;AAOO,SAAS,wBACd,SACA,cACgB;AAGhB,QAAM,aAAa,oBAAI,IAA0B;AAGjD,UAAQ,QAAQ,CAAC,mBAAmB;AAClC,mBAAe,QAAQ,CAAC,YAAY;AAClC,YAAM,MAAM,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,QAAQ,MAAM,QAAQ,YAAY,CAAC;AAGjF,UAAI,cAAc;AAChB,cAAM,aAAa,GAAG,aAAa,MAAM,OAAO,IAAI,aAAa,QAAQ,YAAY,CAAC;AACtF,YAAI,QAAQ,YAAY;AACtB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,WAAW,IAAI,GAAG;AAG1C,UACE,CAAC,mBACD,kBAAkB,QAAQ,MAAM,IAAI,kBAAkB,gBAAgB,MAAM,GAC5E;AACA,mBAAW,IAAI,KAAK,OAAO;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGD,SAAO,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM;AAEpD,QAAI,EAAE,MAAM,MAAM,YAAY,EAAE,MAAM,MAAM,SAAS;AACnD,aAAO,OAAO,EAAE,MAAM,MAAM,OAAO,IAAI,OAAO,EAAE,MAAM,MAAM,OAAO;AAAA,IACrE;AAEA,UAAM,WAAW,WAAO,0BAAY,OAAO,EAAE,MAAM,GAAG,EAAE,MAAM,QAAQ,CAAC;AACvE,UAAM,WAAW,WAAO,0BAAY,OAAO,EAAE,MAAM,GAAG,EAAE,MAAM,QAAQ,CAAC;AACvE,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;AAEO,SAAS,uBACd,UACA,UACgB;AAChB,QAAM,WAAW,IAAI,IAAI,QAAQ;AACjC,SAAO,SAAS,OAAO,CAAC,YAAY,SAAS,IAAI,OAAO,QAAQ,MAAM,MAAM,OAAO,CAAC,CAAC;AACvF;AAEO,SAAS,sBAAsB,UAA0C;AAC9E,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,UAAM,SAAS,OAAO,QAAQ,MAAM;AACpC,WAAO,SAAS;AAAA,EAClB,CAAC;AACH;AAKO,SAAS,qBAAqB,UAA0C;AAC7E,QAAM,cAAc,IAAI,IAAI,2BAA2B,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;AACxF,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,UAAM,eAAe,QAAQ,MAAM,QAAQ,YAAY;AACvD,WAAO,CAAC,YAAY,IAAI,YAAY;AAAA,EACtC,CAAC;AACH;;;AHjEO,SAASC,YAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AAErC,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,EACX,IAAI,qBAAqB;AAAA,IACvB,QAAQ,oBAAoB,iBAAiB,CAAC;AAAA,IAC9C,SAAS,oBAAoB,cAAc,CAAC,IACxC,OAAO,mBAAmB,cAAc,CAAC,EAAE,MAAM,OAAO,IACxD,SAAS,CAAC;AAAA,IACd;AAAA,IACA,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC;AAAA,EACrC,CAAC;AAGD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,EACX,IAAI,oBAAoB;AAAA,IACtB;AAAA,EACF,CAAC;AAGD,QAAM,2BAAuB,uBAAQ,MAAM;AACzC,UAAM,UAA4B,CAAC;AAGnC,QAAI,sBAAsB,gBAAgB,SAAS,GAAG;AACpD,cAAQ,KAAK,eAAe;AAAA,IAC9B;AACA,QAAI,kBAAkB,SAAS,GAAG;AAChC,cAAQ,KAAK,iBAAiB;AAAA,IAChC;AAGA,UAAM,SAAS,wBAAwB,SAAS,oBAAoB,YAAY;AAGhF,UAAM,UAAU,sBAAsB,MAAM;AAG5C,WAAO,qBAAqB,OAAO;AAAA,EACrC,GAAG,CAAC,iBAAiB,mBAAmB,kBAAkB,CAAC;AAG3D,QAAM,YAAY,oBAAoB;AAGtC,QAAM,QAAQ,gBAAgB;AAG9B,QAAM,aAAa,MAAM;AACvB,QAAI,oBAAoB;AACtB,qBAAe;AAAA,IACjB;AACA,qBAAiB;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AFjFA,SAAS,cAAc,UAA0C;AAC/D,SAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAClC,UAAM,SAAS,OAAO,EAAE,MAAM;AAC9B,UAAM,SAAS,OAAO,EAAE,MAAM;AAC9B,QAAI,SAAS,OAAQ,QAAO;AAC5B,QAAI,SAAS,OAAQ,QAAO;AAC5B,WAAO;AAAA,EACT,CAAC;AACH;AAMO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,GAAkE;AAChE,QAAM,qBAAqB,cACvB,OAAO,YAAY,aAAa,MAAM,OAAO,IAC7C;AAGJ,QAAM,QAAQ,oBAAoB,WAAW;AAC7C,QAAM,uBAAuB,4BAA4B,aAAa,KAAK;AAC3E,QAAM,qBAAqB,yBAAyB;AAGpD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,EACX,IAAI,qBAAqB;AAAA,IACvB,QAAQ,aAAa,iBAAiB,CAAC;AAAA,IACvC,SAAS;AAAA,IACT;AAAA,IACA,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,eAAe,sBAAsB;AAAA,EAC/D,CAAC;AAGD,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,YAAY;AAAA,EACd,IAAIC,YAAW;AAAA,IACb;AAAA,IACA,UAAU,qBAAqB,CAAC,kBAAkB,IAAI,CAAC;AAAA,IACvD,oBAAoB,eAAe;AAAA,EACrC,CAAC;AAED,QAAM,kBAAc,wBAAQ,MAAM;AAChC,QAAI,oBAAoB;AACtB,UAAI,qBAAqB,SAAS,GAAG;AACnC,eAAO;AAAA,MACT;AAEA,UAAI,aAAa,eAAe;AAC9B,eAAO,YAAY,cAAc,IAAI,CAAC,WAAW;AAAA,UAC/C;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,EAAE;AAAA,MACJ;AACA,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,EACT,GAAG,CAAC,oBAAoB,sBAAsB,kBAAkB,aAAa,aAAa,CAAC;AAE3F,QAAM,oBAAoB,qBACtB,2BACA;AAEJ,QAAM,kBAAkB,qBAAqB,yBAAyB;AAEtE,QAAM,eAAW,wBAAQ,MAAM;AAC7B,QAAI,WAAW;AAGf,QAAI,CAAC,sBAAsB,oBAAoB;AAC7C,iBAAW,SAAS,OAAO,CAAC,MAAM;AAChC,cAAM,eAAe,OAAO,EAAE,MAAM,OAAO,OAAO;AAClD,eAAO,iBAAiB;AAAA,MAC1B,CAAC;AAAA,IACH;AAGA,QAAI,CAAC,oBAAoB;AACvB,iBAAW,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,IAAI,EAAE;AAAA,IACzD;AAGA,eAAW,qBAAqB,QAAQ;AAExC,WAAO,cAAc,QAAQ;AAAA,EAC/B,GAAG,CAAC,aAAa,oBAAoB,kBAAkB,CAAC;AAExD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AVjHO,SAAS,YAAY,EAAE,QAAQ,UAAU,KAAK,GAAuB;AAC1E,aAAO,+BAAS;AAAA,IACd,GAAG,oBAAoB,SAAS,MAAM;AAAA,IACtC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AiBhBA,IAAAC,iBAAsC;AACtC,IAAAC,uBAA+B;AA+BxB,SAAS,gBAAgB,SAAwD;AACtF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,kBAAc,qCAAe;AACnC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AACrD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAA+B,IAAI;AACnE,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAElD,QAAM,iBAAiB,kBAAkB;AACzC,QAAMC,mBAAkB,mBAAmB;AAE3C,QAAM,2BAAuB,4BAAY,CAAC,WAA+C;AACvF,WAAO;AAAA,MACL,IAAI,OAAO,YAAY;AAAA,MACvB,MAAM,OAAO,YAAY;AAAA,MACzB,OAAO,OAAO,YAAY;AAAA,MAC1B,UAAU,OAAO,YAAY;AAAA,MAC7B,MAAM,OAAO;AAAA,IACf;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,sCAAkC;AAAA,IACtC,OAAO,iBAAgE;AACrE,UAAI;AAEJ,iBAAW,UAAU,cAAc;AACjC,cAAM,YAAY,qBAAqB,MAAM;AAE7C,cAAM,SAAS,MAAM,0BAA0B,SAAS;AAExD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,uBAAuB,OAAO,eAAe,qBAAqB,EAAE;AAAA,QACtF;AAEA,qBAAa;AAAA,MACf;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,2BAA2B,oBAAoB;AAAA,EAClD;AAEA,QAAM,iCAA6B;AAAA,IACjC,OAAO,UAAkB,WAAkC;AACzD,UAAI;AACF,cAAMA,iBAAgB,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,MACxD,SAAS,gBAAgB;AACvB,gBAAQ,KAAK,wDAAwD,cAAc;AAAA,MACrF;AAAA,IACF;AAAA,IACA,CAACA,gBAAe;AAAA,EAClB;AAEA,QAAM,eAAW;AAAA,IACf,OACE,QACA,UACA,gBACgC;AAChC,eAAS,IAAI;AAEb,UAAI,CAAC,aAAa,IAAI;AACpB,cAAM,IAAI,MAAM,yBAAyB;AAAA,MAC3C;AAEA,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AAEA,UAAI,UAAU,IAAI;AAChB,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AAEA,UAAI;AACF,cAAM,iBAAiB,MAAM,eAAe,YAAY;AAAA,UACtD,eAAe,YAAY;AAAA,UAC3B;AAAA,UACA,QAAQ,OAAO,SAAS;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,EAAE,UAAU,aAAa,IAAI;AAEnC,YAAI,CAAC,gBAAgB,aAAa,WAAW,GAAG;AAC9C,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAEA,cAAM,iBAAiB,aAAa,KAAK,CAAC,OAAO,GAAG,QAAQ;AAC5D,YAAI,gBAAgB,UAAU;AAC5B,sBAAY,eAAe,QAAQ;AAAA,QACrC;AAEA,cAAM,eAAe,aAAa,KAAK,CAAC,OAAO,GAAG,SAAS,SAAS;AACpE,sBAAc,YAAY;AAE1B,wBAAgB,IAAI;AACpB,cAAM,cAAc,MAAM,gCAAgC,YAAY;AAEtE,YAAI,YAAY,aAAa;AAC3B,gBAAM,2BAA2B,UAAU,WAAW;AAAA,QACxD;AAEA,YAAI,aAAa;AACf,sBAAY,kBAAkB;AAAA,YAC5B,UAAU,eAAe,UAAU,WAAW,EAAE;AAAA,UAClD,CAAC;AAAA,QACH;AACA,oBAAY;AAEZ,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAMC,SAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,iBAASA,MAAK;AACd,cAAMA;AAAA,MACR,UAAE;AACA,wBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAgB,4BAAY,MAAM;AACtC,gBAAY,IAAI;AAChB,kBAAc,KAAK;AAAA,EACrB,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA,WAAW,eAAe;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzLA,IAAAC,iBAA0D;AAgDnD,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAA4D;AAC1D,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA6B;AACzD,QAAM,CAAC,8BAA8B,+BAA+B,QAAI,yBAEtE;AAGF,gCAAU,MAAM;AACd,cAAU,MAAS;AACnB,oCAAgC,MAAS;AAAA,EAC3C,GAAG,CAAC,aAAa,CAAC;AAGlB,gCAAU,MAAM;AACd,QAAI,eAAe,WAAW,EAAG;AAEjC,UAAM,cAAc,eAAe;AAAA,MACjC,CAAC,MAAM,EAAE,YAAY;AAAA,IACvB;AAEA,QAAI,CAAC,gCAAgC,CAAC,aAAa;AACjD,sCAAgC,eAAe,CAAC,EAAE,OAAO;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,8BAA8B,cAAc,CAAC;AAGjD,QAAM,4BAAwB;AAAA,IAC5B,MAAM,eAAe,KAAK,CAAC,MAAM,EAAE,YAAY,4BAA4B,KAAK;AAAA,IAChF,CAAC,gBAAgB,4BAA4B;AAAA,EAC/C;AAGA,QAAM,EAAE,gBAAgB,cAAc,UAAU,uBAAuB,IAAI,gBAAgB;AAAA,IACzF,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,YAAQ,4BAAY,MAAM;AAC9B,cAAU,MAAS;AACnB,oCAAgC,MAAS;AAAA,EAC3C,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7GA,IAAAC,iBAAwB;AA6CjB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf;AACF,GAA2D;AACzD,aAAO,wBAAQ,MAAM;AACnB,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,wBAAwB;AAAA,QACxB,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,eAAe;AAAA,QACf,wBAAwB;AAAA,QACxB,0BAA0B;AAAA,QAC1B,YAAY;AAAA,QACZ,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,cAAc,YAAY;AAEhC,UAAM,qBAAqB,YAAY,sBAAsB;AAC7D,UAAM,2BAA2B,YAAY,4BAA4B;AAEzE,UAAM,gBAAgB,aAAa,iBAAiB;AACpD,UAAM,yBAAyB,aAAa,0BAA0B;AAEtE,UAAM,mBAAmB,aAAa,kBAAkB;AACxD,UAAM,kBAAkB,aAAa,kBAAkB;AAGvD,UAAM,kBAAkB,OAAO,YAAY,aAAa,MAAM,OAAO;AACrE,UAAM,eAAe,kBAAkB,UAAa,kBAAkB;AAEtE,UAAM,eAAe,CAAC,gBAAgB,gBAAgB;AAGtD,QAAI;AACJ,QAAI,oBAAmC;AAEvC,QAAI,cAAc;AAChB,mBAAa;AAAA,IACf,WAAW,WAAW;AACpB,mBAAa;AAAA,IACf,WAAW,cAAc;AACvB,mBAAa;AAAA,IACf,WAAW,oBAAoB;AAC7B,mBAAa,4BAA4B;AACzC,0BACE,4BAA4B;AAAA,IAChC,WAAW,cAAc;AACvB,mBAAa;AAAA,IACf,WAAW,wBAAwB;AACjC,mBAAa;AACb,0BAAoB;AAAA,IACtB,WAAW,kBAAkB;AAC3B,mBAAa;AAAA,IACf,WAAW,iBAAiB;AAC1B,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa;AAAA,IACf;AAEA,UAAM,gBAAgB,aAAa;AACnC,UAAM,cACJ,CAAC,sBACD,CAAC,gBACD,CAAC,0BACD,CAAC;AAEH,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,cAAc,wBAAwB,WAAW,cAAc,aAAa,CAAC;AAChG;;;AC5IA,IAAAC,iBAA4B;AAyCrB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkD;AAChD,QAAM,YAAY,qBAAqB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,eAAe,aAAa;AAAA,EAC9B,CAAC;AAED,QAAM,eAAe,gBAAgB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AACf,gBAAU,UAAU,MAAS;AAC7B,wBAAkB;AAClB,0BAAoB;AAAA,IACtB;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,aAAa,aAAa,aAAa;AAE7D,QAAM,aAAa,sBAAsB;AAAA,IACvC;AAAA,IACA;AAAA,IACA,cAAc,UAAU;AAAA,IACxB,wBAAwB,UAAU;AAAA,IAClC,WAAW,aAAa;AAAA,IACxB,cAAc,aAAa;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,QAAM,cAAU,4BAAY,YAAY;AACtC,QAAI,CAAC,UAAU,gBAAgB,CAAC,eAAe,CAAC,UAAU,8BAA8B;AACtF,aAAO;AAAA,IACT;AACA,UAAM,WAAW,eAAe,SAAS,IACrC,UAAU,+BACV;AACJ,WAAO,aAAa,SAAS,UAAU,cAAc,QAAQ;AAAA,EAC/D,GAAG,CAAC,UAAU,cAAc,UAAU,8BAA8B,cAAc,aAAa,cAAc,CAAC;AAE9G,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA,WAAW,aAAa;AAAA,MACxB,cAAc,aAAa;AAAA,MAC3B;AAAA,MACA,OAAO,aAAa;AAAA,IACtB;AAAA,EACF;AACF;;;ACvGA,IAAAC,iBAAwB;AACxB,IAAAC,uBAA2B;AAgBpB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAAuD;AACrD,QAAMC,eAAU,iCAAW;AAAA,IACzB,SAAS,SAAS,IAAI,CAAC,aAAa;AAAA,MAClC,GAAG,oBAAoB,SAAS,EAAE,MAAM,WAAW,IAAI,OAAO,QAAQ,CAAC;AAAA,MACvE,SAAS,CAAC,CAAC;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,iBAAiB,IAAI,KAAK;AAAA,MAC1B,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB,EAAE;AAAA,EACJ,CAAC;AAED,QAAM,YAAYA,SAAQ,KAAK,CAAC,UAAU,MAAM,SAAS;AACzD,QAAM,QAAQA,SAAQ,KAAK,CAAC,UAAU,MAAM,KAAK,GAAG,SAAS;AAE7D,QAAM,aAAa,MAAM;AACvB,IAAAA,SAAQ,QAAQ,CAAC,UAAU;AACzB,YAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AAGA,QAAM,eAAW,wBAAQ,MAAM;AAC7B,UAAM,aAAiE,CAAC;AAExE,IAAAA,SAAQ,QAAQ,CAAC,OAAO,UAAU;AAChC,YAAM,UAAU,SAAS,KAAK;AAC9B,UAAI,MAAM,QAAQ,YAAY,QAAW;AACvC,mBAAW,OAAO,IAAI,MAAM,KAAK;AAAA,MACnC;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAACA,UAAS,QAAQ,CAAC;AAEtB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC7DA,IAAAC,uBAA+D;AAiBxD,SAAS,YAAY,EAAE,SAAS,UAAU,KAAK,GAAuB;AAC3E,aAAO,+BAAS;AAAA,IACd,GAAG,gBAAgB,KAAK,OAAO;AAAA,IAC/B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAOO,SAAS,WAAW,EAAE,IAAI,UAAU,KAAK,GAAsB;AACpE,aAAO,+BAAS;AAAA,IACd,GAAG,gBAAgB,KAAK,EAAE;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEO,SAAS,iBACd,SACA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY,CAAC,UAAU,cAAc,KAAK;AAAA,IAC1C,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,iBACd,SACA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY,CAAC,UAAU,cAAc,KAAK;AAAA,IAC1C,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,iBACd,SACA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY,CAAC,OAAO,cAAc,EAAE;AAAA,IACpC,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,qBACd,SAIA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY,CAAC,YAAY,kBAAkB,OAAO;AAAA,IAClD,GAAG;AAAA,EACL,CAAC;AACH;;;AC3EA,IAAAC,iBAAwB;AAuBjB,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAAkD;AAChD,QAAM,EAAE,UAAU,WAAW,yBAAyB,IAAI,mBAAmB;AAE7E,QAAM;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,sBAAsB;AAAA,IACxB;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,eAAW,wBAAQ,MAAM;AAC7B,QAAI,4BAA4B,UAAW,QAAO,CAAC;AAEnD,UAAM,gBAAgC,CAAC;AACvC,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,EAAE,aAAa,MAAM;AAC1D,oBAAc,QAAQ,CAAC,kBAAkB;AACvC,cAAM,UAAU,cAAc,MAAM,MAAM,SAAS;AAGnD,cAAM,QAAQ,SAAS,cAAc,MAAM,SAAS,OAAO;AAC3D,YAAI,CAAC,MAAO;AAEZ,sBAAc,KAAK;AAAA,UACjB;AAAA,UACA,QAAQ,cAAc;AAAA,UACtB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,UAAU,0BAA0B,SAAS,CAAC;AAEhE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;ACrEA,IAAAC,uBAAyB;AAKlB,SAAS,uBAAuB,eAAuB;AAC5D,aAAO,+BAAS;AAAA,IACd,GAAG,cAAc,cAAc,aAAa;AAAA,IAC5C,GAAG;AAAA,IACH,QAAQ,CAAC,SAAsC;AAC7C,YAAM,kBAAkB,IAAI;AAAA,QAC1B,KAAK,eACD,IAAI,CAAC,gBAAgB,YAAY,cAAc,KAAK,GACpD,OAAO,CAAC,UAAU,UAAU,MAAS,GACrC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,MAC5C;AAEA,YAAM,SAAS,MAAM,KAAK,gBAAgB,OAAO,CAAC,KAAK,CAAC;AACxD,YAAM,uBACJ,KAAK,eAAe,KAAK,CAAC,GAAG,MAAM;AACjC,cAAM,YACJ,OAAO,EAAE,aAAa,MAAM,OAAO,IAAI,OAAO,EAAE,aAAa,MAAM,OAAO;AAE5E,YAAI,cAAc,GAAG;AACnB,iBAAO,EAAE,YAAY,EAAE;AAAA,QACzB;AAEA,eAAO;AAAA,MACT,CAAC,KAAK,CAAC;AAET,aAAO;AAAA,QACL,eAAe;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACpCA,IAAAC,uBAAyB;AAwBlB,SAAS,YAAY,UAA8B,CAAC,GAAqC;AAC9F,QAAM,EAAE,UAAU,MAAM,WAAW,OAAO,IAAI;AAC9C,QAAM,EAAE,gBAAgB,IAAI,UAAU,UAAU;AAEhD,aAAO,+BAAS;AAAA,IACd,GAAG,gBAAgB;AAAA,IACnB,GAAG;AAAA,IACH,SAAS,WAAW,CAAC;AAAA,IACrB,GAAI,mBAAmB,EAAE,aAAa,EAAE,aAAa,KAAK,EAAE;AAAA,IAC5D,WAAW,aAAa,IAAI,KAAK;AAAA;AAAA,IACjC,QAAQ,UAAU,KAAK,KAAK;AAAA;AAAA,EAC9B,CAAC;AACH;;;AClCA,IAAAC,iBAAwB;;;ACIxB,IAAAC,gBAA4B;AAc5B,IAAM,gBAAgB,CACpB,MACA,WACA,YACc;AACd,SAAO;AAAA,IACL,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,CAAC;AAAA,MACvB,QAAQ,UAAU;AAAA,IACpB;AAAA,IACA,KAAK;AAAA,MACH,MAAM,QAAQ,MAAM,CAAC;AAAA,MACrB,QAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACF;AAEA,IAAM,mBAAmB,CAAC,OAAmB,WAA8B;AACzE,SAAO;AAAA,IACL,IAAI;AAAA,MACF,MAAM,MAAM,MAAM,CAAC;AAAA,MACnB,QAAQ,MAAM;AAAA,IAChB;AAAA,IACA,KAAK;AAAA,IACL,YAAQ,2BAAY,QAAQ,EAAE,UAAU,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;AAAA,IACxE,MAAM;AAAA,EACR;AACF;AAKO,SAAS,oBAAoB,MAA6C;AAC/E,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,QAAM,SAAsB,CAAC;AAC7B,OAAK,MAAM,QAAQ,CAAC,SAAqB;AAEvC,QAAI,KAAK,SAAS,aAAa,KAAK,OAAO;AACzC,YAAMC,eAAc,iBAAiB,KAAK,OAAO,KAAK,MAAM;AAC5D,aAAO,KAAKA,YAAW;AAAA,IACzB;AAGA,QAAI,KAAK,SAAS,UAAU,KAAK,UAAU;AACzC,WAAK,SAAS,QAAQ,CAAC,YAA2B;AAChD,cAAM,YAAY,QAAQ,KAAK,CAAC;AAChC,cAAM,UAAU,QAAQ,GAAG,CAAC;AAC5B,cAAMC,QAAkB,cAAc,QAAQ,MAAM,WAAW,OAAO;AACtE,eAAO,KAAKA,KAAI;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ADxEA,IAAM,uBAAuB;AAC7B,IAAM,4BAA4B;AAGlC,SAAS,mBAAmB,SAAyB;AACnD,MAAI,QAAQ,YAAY,MAAM,qBAAqB,YAAY,GAAG;AAChE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAQO,SAAS,aACd,WACA,aACA,eACA,SACA,cACA;AACA,QAAM,aAAsC,wBAAQ,MAAM;AACxD,QAAI,CAAC,WAAW,CAAC,UAAW,QAAO;AAEnC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,SAAS,aAAa,eAAe,YAAY,CAAC;AAGtD,QAAM,wBAAoB,wBAAQ,MAAM;AACtC,WAAO,CAAC,EACN,eACA,QAAQ,YACR,QAAQ,aACR,QAAQ,UACR,QAAQ,SACR,QAAQ,YACR,QAAQ;AAAA,EAEZ,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,EAAE,MAAM,WAAW,MAAM,IAAI,aAAa;AAAA,IAC9C,QAAQ;AAAA,MACN,MAAM,QAAQ,QAAQ;AAAA,MACtB,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU,QAAQ,YAAY;AAAA,MAC9B,gBAAgB,QAAQ,kBAAkB;AAAA,MAC1C,eAAe,QAAQ,iBAAiB;AAAA,MACxC,IAAI,QAAQ,MAAM;AAAA,MAClB,QAAQ,QAAQ,UAAU;AAAA,MAC1B,UAAU,mBAAmB,QAAQ,YAAY,EAAE,KAAK;AAAA,MACxD,WAAW,mBAAmB,SAAS,aAAa,EAAE,KAAK;AAAA,IAC7D;AAAA,IACA,SAAS,qBAAqB;AAAA,EAChC,CAAC;AAGD,QAAM,mBAAe,wBAAQ,MAAM,oBAAoB,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC;AAE5E,SAAO;AAAA,IACL,cAAc,QAAQ;AAAA,IACtB,cAAc,MAAM,cAAc;AAAA,IAClC,SAAS,qBAAqB,QAAQ,CAAC;AAAA,IACvC;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AACF;;;AEjFA,IAAAC,uBAAyB;AAUlB,SAAS,YAAY,EAAE,QAAQ,UAAU,KAAK,GAAuB;AAC1E,aAAO,+BAAS;AAAA,IACd,GAAG,aAAa,KAAK,EAAE,OAAO,CAAC;AAAA,IAC/B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAOO,SAAS,iBAAiB,EAAE,QAAQ,UAAU,KAAK,GAA4B;AACpF,QAAM,QAAqC,EAAE,OAAO;AAEpD,aAAO,+BAAS;AAAA,IACd,GAAG,aAAa,UAAU,KAAK;AAAA,IAC/B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AC/BA,IAAAC,uBAAoC;AAY7B,SAAS,YAAY,EAAE,aAAa,OAAO,cAAc,gBAAgB,GAAuB;AACpG,aAAO;AAAA,IACJ,cACK,mBAAmB,YAAY,OAAO,aAAa,KAAK,GAAG;AAAA,MAC1D,QAAQ,CAAC,SACN,eACK,KAAK,OAAO,CAAC,QAAQ,IAAI,MAAM,YAAY,MAAM,aAAa,YAAY,CAAC,IAC3E;AAAA,MACR;AAAA,IACH,CAAC,IACC,EAAE,UAAU,CAAC,QAAQ,UAAU,MAAM,GAAG,SAAS,+BAAU;AAAA,EACnE;AACH;;;ACxBA,IAAAC,uBAAsC;AAU/B,SAAS,sBAAsB,SAAwC;AAC3E,aAAO,kCAAY;AAAA,IAChB,YAAY;AAAA,IACZ,WAAW,MAAM;AACd,eAAS,YAAY,uCAAuC;AAAA,IAC/D;AAAA,IACA,SAAS,CAAC,UAAU;AACjB,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,eAAS,UAAU,gCAAgC;AAAA,IACtD;AAAA,EACH,CAAC;AACJ;AAOO,SAAS,qBAAqB;AAAA,EAClC;AAAA,EACA;AACH,GAAgC;AAC7B,aAAO,+BAAS;AAAA,IACb,GAAG,cAAc,MAAM,YAAY;AAAA,IACnC,GAAG;AAAA,IACH,SAAS,WAAW,CAAC,CAAC;AAAA,EACzB,CAAC;AACJ;;;ACrCA,IAAAC,iBAA+C;AAuDxC,IAAM,0BAA0B,CAAC;AAAA,EACtC;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV;AACF,MAAqE;AACnE,QAAM,yBAAqB,uBAA2B,MAAS;AAC/D,QAAM,sBAAkB,uBAAO,KAAK;AAIpC,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,WAAW;AAAA,EACb,IAAI,mBAAmB;AAAA,IACrB,QAAQ;AAAA,MACN,SAAS,WAAW;AAAA,MACpB;AAAA,IACF;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AAED,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,EACT,IAAI,6BAA6B;AAEjC,QAAM;AAAA,IACJ,aAAaC;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,EACT,IAAI,oBAAoB;AAExB,QAAM,2BAAuB,4BAAY,OAAO,kBAA0B;AACxE,QAAI,gBAAgB,QAAS;AAC7B,oBAAgB,UAAU;AAE1B,QAAI;AAEF,YAAM,kBAAkB,MAAM,gBAAgB;AAAA,QAC5C,SAAS;AAAA,QACT;AAAA,QACA,KAAK,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAAA,QACpE;AAAA,MACF,CAAC;AAGD,UAAI;AACJ,UAAI;AACF,oBAAY,MAAM,YAAY,gBAAgB,OAAO;AAAA,MACvD,SAAS,WAAgB;AAEvB,cAAM,eAAe,WAAW,WAAW;AAE3C,YAAI,SAAS;AACX,gBAAM,QAAQ;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAGA,YAAM,mBAAmB,MAAMA,kBAAiB;AAAA,QAC9C,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO,gBAAgB;AAAA,MACzB,CAAC;AAED,UAAI,CAAC,iBAAiB,YAAY,iBAAiB,OAAO;AACxD,cAAM,eAAe,iBAAiB;AAGtC,YAAI,SAAS;AACX,gBAAM,QAAQ;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,SAASC,QAAY;AACnB,YAAM,eAAeA,QAAO,WAAW;AAEvC,UAAI,SAAS;AACX,cAAM,QAAQ;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,UAAE;AACA,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,iBAAiB,iBAAiB,KAAK,SAAS,aAAaD,mBAAkB,OAAO,CAAC;AAG3F,gCAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,UAAM,iBAAiB;AAGvB,QAAI,CAAC,gBAAgB;AAEnB,UAAI,mBAAmB,YAAY,QAAW;AAC5C,2BAAmB,UAAU;AAAA,MAC/B;AACA;AAAA,IACF;AAGA,QAAI,sBAAsB;AACxB;AAAA,IACF;AAGA,QAAI,mBAAmB,mBAAmB,SAAS;AACjD,yBAAmB,UAAU;AAG7B,UAAI,gBAAgB,UAAU;AAC5B;AAAA,MACF;AAEA,2BAAqB,cAAc;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,SAAS,SAAS,sBAAsB,gBAAgB,oBAAoB,CAAC;AAEjF,QAAM,UAAU,YAAY;AAC1B,QAAI,SAAS;AACX,YAAM,qBAAqB,OAAO;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,YAAY,wBAAwB,uBAAuB;AACjE,QAAM,QAAQ,gBAAgB,WAAW,iBAAiB,WAAW;AAErE,SAAO;AAAA,IACL,UAAU,gBAAgB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3MA,IAAAE,uBAKO;AAaA,SAAS,cAAc,EAAE,UAAU,KAAK,GAA0B;AACvE,aAAO,+BAAS;AAAA,IACd,GAAG,kBAAkB;AAAA,IACrB,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAOO,SAAS,aAAa,EAAE,IAAI,UAAU,KAAK,GAAwB;AACxE,aAAO,+BAAS;AAAA,IACd,GAAG,kBAAkB,KAAK,EAAE;AAAA,IAC5B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEO,SAAS,mBACd,SACA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,mBACd,SACA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,mBACd,SACA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;AAEO,SAAS,uBACd,SAIA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;;;AC5EA,IAAAC,uBAAgD;;;ACAhD,IAAAC,eAAkB;AAGX,IAAM,0CAA0C,eAAE,OAAO;AAAA,EAC9D,gBAAgB,eAAE,OAAO,EAAE,KAAK;AAAA,EAChC,eAAe,eAAE,OAAO,EAAE,KAAK;AAAA,EAC/B,aAAa,eAAE,IAAI;AAAA;AACrB,CAAC;AAGM,IAAM,6CAA6C,eAAE,OAAO;AAAA,EACjE,SAAS,eAAE,QAAQ;AACrB,CAAC;;;ACJD,eAAsB,6BACpB,OAC+C;AAC/C,QAAM,EAAE,gBAAgB,eAAe,YAAY,IAAI;AACvD,QAAM,WAAW,iBAAiB,cAAc,iBAAiB,aAAa;AAE9E,QAAM,OAAO,MAAM,UAAU,MAAM,UAAU;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,EAAE,YAAY,CAAC;AAAA,EACtC,CAAC;AAGD,QAAM,SAAS,2CAA2C,UAAU,IAAI;AAExE,MAAI,OAAO,YAAY,OAAO;AAC5B,YAAQ,IAAI,eAAe,OAAO,KAAK;AACvC,UAAM,IAAI,MAAM,8CAA8C,OAAO,MAAM,OAAO,EAAE;AAAA,EACtF;AACA,SAAO,OAAO;AAChB;;;AFvBO,SAAS,gCACd,SAIA;AACA,aAAO,kCAAY;AAAA,IACjB,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,CAAC;AACH;;;AGdA,IAAAC,uBAA+C;AAUxC,SAAS,sBAAsB,EAAE,OAAO,UAAU,KAAK,GAAiC;AAC7F,aAAO,+BAAS;AAAA,IACd,GAAG,0BAA0B,KAAK,KAAK;AAAA,IACvC,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AChBA,IAAAC,uBAA+C;AAO/C,IAAM,sBAAsB;AAAA,EAC1B,WAAW,IAAI,KAAK;AAAA;AAAA,EACpB,QAAQ,KAAK,KAAK;AAAA;AACpB;AAQO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAA6B;AAC3B,QAAM,YAAQ,+BAAS;AAAA,IACrB,GAAG,sBAAsB,KAAK,OAAO,MAAM;AAAA,IAC3C,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,WAAW,CAAC,CAAC;AAAA,EACxB,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC3B,OAAO,MAAM,MAAM;AAAA,IACnB,YAAY,MAAM,MAAM;AAAA,EAC1B;AACF;AAQO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAAiC;AAC/B,QAAM,YAAQ,+BAAS;AAAA,IACrB,GAAG,sBAAsB,KAAK,OAAO,MAAM;AAAA,IAC3C,GAAG;AAAA,IACH,GAAG;AAAA,IACH,SAAS,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC;AAAA,EACnC,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,MAAM;AAAA,EACxB;AACF;;;AClBS;AAXF,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,YAAU,UAAU,EAAE,QAAQ,SAAS,UAAU,YAAY,OAAO,gBAAgB,CAAC;AAErF,SAAO,2EAAG,UAAS;AACrB;;;AnHjBO,IAAM,cAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["useBalance","import_query_key_factory","import_query_key_factory","import_zod","import_zod","import_zod","import_query_key_factory","import_react_query","chainId","import_zod","import_zod","import_zod","import_zod","import_react_query","import_react_query","import_zod","chainSchema","import_query_key_factory","paginationMetadataSchema","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_query_key_factory","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_react_query","import_query_key_factory","import_zod","import_query_key_factory","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_query_key_factory","import_zod","uuidSchema","getDeposits","getDeposits","import_query_key_factory","import_query_key_factory","import_zod","sortBySchema","sortOrderSchema","import_query_key_factory","import_zod","import_query_key_factory","import_zod","import_react_query","import_react_query","import_react_query","import_react_query","import_react","import_react","import_react","import_viem","import_utils","import_react","import_react","import_react_query","import_react_query","import_zod","attributeAction","error","import_react","import_viem","import_react","import_react","import_react_query","import_react","import_viem","error","BalanceSourcePriority","import_viem","useBalance","useBalance","import_react","import_react_query","attributeAction","error","import_react","import_react","import_react","import_react","import_react_query","queries","import_react_query","import_react","import_react_query","import_react_query","import_react","import_utils","approveStep","step","import_react_query","import_react_query","import_react_query","import_react","createMembership","error","import_react_query","import_react_query","import_zod","import_react_query","import_react_query"]}