@turtleclub/hooks 0.5.0-beta.5 → 0.5.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +6 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -15
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/v2/schemas/shared.ts +5 -14
package/dist/index.cjs.map
CHANGED
|
@@ -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/schemas/shared.ts","../src/v2/opportunities/schema.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/products/queries.ts","../src/v2/products/schema.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/widget/api.ts","../src/v2/supported-chains/queries.ts","../src/v2/supported-chains/schema.ts","../src/v2/supported-chains/api.ts","../src/v2/supported-tokens/queries.ts","../src/v2/supported-tokens/schema.ts","../src/v2/supported-tokens/api.ts","../src/v2/users/queries.ts","../src/v2/users/schemas.ts","../src/v2/users/api.ts","../src/v2/earn-opportunities/hooks.ts","../src/v2/lib/query-config.ts","../src/v2/earn-route/hooks.ts","../src/v2/earn-membership/hooks.ts","../src/v2/earn-deposits/hooks.ts","../src/v2/enso-balances/hooks.ts","../src/v2/opportunities/hooks.ts","../src/v2/products/hooks.ts","../src/v2/balance/hooks/useTokenBalance.ts","../src/v2/balance/types.ts","../src/v2/balance/schema.ts","../src/v2/balance/api.ts","../src/v2/balance/queries.ts","../src/v2/balance/hooks/useBalance.ts","../src/v2/balance/hooks/useGetOnChainBalance.ts","../src/v2/balance/hooks/usePortfolioBalance.ts","../src/v2/supported-chains/hooks.ts","../src/v2/supported-tokens/hooks.ts","../src/v2/balance/hooks/useEnsoBalances.ts","../src/v2/balance/utils.ts","../src/v2/balance/constants.ts","../src/v2/widget/hooks.ts","../src/v2/geocheck/useGeocheck.ts","../src/v2/swap/useSwapRoute.ts","../src/v2/swap/route-processor.ts","../src/v2/users/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 { productsQueries } from \"./products/queries\";\nimport { ensoBalancesQueries } from \"./enso-balances/queries\";\nimport { widgetQueries } from \"./widget/queries\";\nimport { supportedChainsQueries } from \"./supported-chains/queries\";\nimport { supportedTokensQueries } from \"./supported-tokens/queries\";\nimport { usersQueries } from \"./users/queries\";\n\n// Merged query keys for cache invalidation\nexport const queries = mergeQueryKeys(\n opportunitiesQueries,\n earnOpportunitiesQueries,\n earnRouteQueries,\n earnMembershipQueries,\n earnDepositsQueries,\n productsQueries,\n ensoBalancesQueries,\n widgetQueries,\n supportedChainsQueries,\n supportedTokensQueries,\n usersQueries\n);\n\n// Features - Earn API\nexport * from \"./earn-opportunities\";\nexport * from \"./earn-route\";\nexport * from \"./earn-membership\";\nexport * from \"./earn-deposits\";\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 \"./swap\";\nexport * from \"./users\";\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 { getOpportunities, getOpportunityById } from \"./api\";\nimport type { OpportunityFilters } 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) => ({\n queryKey: [id],\n queryFn: () => getOpportunityById(id),\n }),\n});\n","export const API_BASE_URL = \"https://api.turtle.club\";\nexport const EARN_BASE_URL = \"https://earn.turtle.club\";\n\nexport type ApiDomain = \"api\" | \"earn\";\n\nexport interface ApiClientConfig {\n apiUrl?: string;\n earnUrl?: string;\n getToken?: () => string | null;\n debug?: 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>(\n endpoint: string,\n options?: ApiClientOptions\n ): 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 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(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n error\n );\n }\n }\n}\n\nexport const apiClient = ApiClient.getInstance();\n","import { z } from \"zod\";\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 logoUrl: z.string().optional(),\n ecosystem: z.string().optional(),\n status: z.string().optional(),\n explorerUrl: z.string().optional(),\n});\n\nexport const tokenSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n symbol: z.string(),\n address: z.string(),\n chain: chainSchema,\n decimals: z.number(),\n logoUrl: z.string().optional(),\n isNative: z.boolean(),\n priceUsd: z.number().optional(),\n});\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 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\nexport const productSchema = z.object({\n id: z.string(),\n name: z.string(),\n title: z.string().optional().nullable(),\n subtitle: z.string().optional().nullable(),\n description: z.string().optional().nullable(),\n logoUrl: z.string().optional().nullable(),\n productUrl: z.string().optional().nullable(),\n startedAt: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n productType: z.string().optional().nullable(),\n organization: organizationSchema,\n createdAt: z.string().optional().nullable(),\n});\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 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().optional(),\n protocol: z.object({ id: z.string() }),\n marketAddress: z.string().min(1, \"Market address is required\"),\n depositUrl: z.string().optional().nullable(),\n providerMetadata: z.any().optional().nullable(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\n\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});\n\n// Opportunity Type Enum\nconst opportunityTypeEnum = z.enum([\n 'vault',\n 'lending',\n 'staking',\n 'stablecoin',\n '',\n])\n\n// Opportunity Status Enum\nconst opportunityStatusEnum = z.enum([\n 'active',\n 'paused',\n 'deprecated',\n 'draft',\n 'ended',\n])\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 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 createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n\n // Relationships\n depositTokens: z.array(tokenSchema),\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\n // Will be deprecated\n exposure: z.array(z.string()),\n explorerUrl: z.string().nullable(),\n});\n\n// Pagination metadata schema\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),\n has_next: z.boolean(),\n has_previous: z.boolean(),\n});\n\nexport type Chain = z.infer<typeof chainSchema>;\nexport type Token = z.infer<typeof tokenSchema>;\nexport type Organization = z.infer<typeof organizationSchema>;\nexport type Product = z.infer<typeof productSchema>;\nexport type VaultConfig = z.infer<typeof vaultConfigSchema>;\nexport type LendingConfig = z.infer<typeof lendingConfigSchema>;\nexport type Incentive = z.infer<typeof incentiveSchema>;\nexport type Opportunity = z.infer<typeof opportunitySchema>;\nexport type PaginationMetadata = z.infer<typeof paginationMetadataSchema>;\n","import { z } from \"zod\";\nimport { opportunitySchema } from \"../schemas/shared\";\n\nexport const opportunityFiltersSchema = z.object({\n tokenId: z.string().uuid().optional(),\n chain: z.string().optional(),\n productId: z.string().uuid().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","import { apiClient } from \"../lib/api-client\";\nimport type { OpportunityFilters, OpportunitiesResponse } from \"./schema\";\nimport type { Opportunity } from \"../schemas/shared\";\nimport { opportunitySchema } from \"../schemas/shared\";\nimport { opportunitiesResponseSchema } 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 options?: { debug?: boolean }\n): Promise<Opportunity> {\n const data = await apiClient.fetch(`/turtle/opportunities/${id}`, {\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","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 { chainSchema, tokenSchema } from \"../schemas/shared\";\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\";\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 { 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 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})\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<\n typeof UploadProductLogoRequestSchema\n>\nexport type UploadProductLogoResponse = z.infer<\n typeof UploadProductLogoResponseSchema\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 \"../schemas/shared\";\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 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 { getSupportedChains } from \"./api\";\n\nexport const supportedChainsQueries = createQueryKeys(\"supportedChains\", {\n all: {\n queryKey: null,\n queryFn: () => getSupportedChains(),\n },\n});\n","import { z } from \"zod\";\nimport { chainSchema } from \"../schemas/shared\";\n\n// Supported chains response schema\nexport const supportedChainsResponseSchema = z.object({\n chains: z.array(chainSchema),\n});\n\n// Types\nexport type SupportedChainsResponse = z.infer<typeof supportedChainsResponseSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport type { SupportedChainsResponse } from \"./schema\";\nimport { supportedChainsResponseSchema } from \"./schema\";\n\n// GET /turtle/chains\nexport async function getSupportedChains(\n options?: { debug?: boolean }\n): Promise<SupportedChainsResponse> {\n const data = await apiClient.fetch(\"/turtle/chains\", {\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 { 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 { z } from \"zod\";\nimport { tokenSchema, chainSchema } from \"../schemas/shared\";\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 page: z.number().optional(),\n});\n\n// Supported token filters\nexport interface SupportedTokenFilters {\n page?: number;\n limit?: number;\n search?: string;\n}\n\n// Types\nexport type SupportedToken = z.infer<typeof supportedTokenSchema>;\nexport type SupportedTokensResponse = z.infer<typeof supportedTokensResponseSchema>;\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?.page !== undefined) params.append(\"page\", filters.page.toString());\n if (filters?.limit !== undefined) params.append(\"limit\", filters.limit.toString());\n if (filters?.search) params.append(\"search\", filters.search);\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 { 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, tokenSchema } from \"../schemas/shared\";\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 { 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","// Default TanStack Query configuration\n// Override per-query as needed\n\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","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","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 { useQuery, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport { opportunitiesQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { OpportunitiesResponse, OpportunityFilters } from \"./schema\";\nimport type { Opportunity } from \"../schemas/shared\";\n\nexport interface UseOpportunitiesOptions\n extends Omit<UseQueryOptions<OpportunitiesResponse>, \"queryKey\" | \"queryFn\"> {\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\n extends Omit<UseQueryOptions<Opportunity>, \"queryKey\" | \"queryFn\"> {\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","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 { 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 type { Opportunity, Token } from \"../schemas/shared\";\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 { z } from \"zod\";\nimport { chainSchema } from \"../schemas/shared\";\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 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 { 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 { useMemo } from \"react\";\nimport type { UseBalanceParams } from \"../types\";\nimport type { TokenBalance } from \"../types\";\nimport { useGetOnChainBalance } from \"../hooks/useGetOnChainBalance\";\nimport { usePortfolioBalance } from \"./usePortfolioBalance\";\nimport { useEnsoBalances } from \"../hooks/useEnsoBalances\";\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 * 3. Enso - fallback\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 // Fetch Enso balances (always enabled when address exists)\n const {\n balances: ensoBalances,\n isLoading: isEnsoLoading,\n error: ensoError,\n refetch: refetchEnso,\n } = useEnsoBalances({\n address,\n chainIds,\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 if (ensoBalances.length > 0) {\n sources.push(ensoBalances); // Priority 3\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, ensoBalances, depositOpportunity]);\n\n // Aggregate loading states\n const isLoading = isOnChainLoading || isPortfolioLoading || isEnsoLoading;\n\n // Return first error encountered\n const error = onChainError || portfolioError || ensoError;\n\n // Refetch all sources\n const refetchAll = () => {\n if (depositOpportunity) {\n refetchOnChain();\n }\n refetchPortfolio();\n refetchEnso();\n };\n\n return {\n balances: consolidatedBalances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","import type { Token } from \"../../schemas/shared\";\nimport { useReadContracts } from \"wagmi\";\nimport { erc20Abi } from \"viem\";\nimport { useMemo } from \"react\";\nimport type { TokenBalance } from \"../types\";\nimport { queryDefaults } from \"../../lib/query-config\";\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 // Build multicall contracts array: only balanceOf for each token\n const contracts = useMemo(() => {\n if (!address || !enabled) return [];\n\n return tokens.map((token) => ({\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 }, [tokens, address, chainId, enabled]);\n\n // Fetch on-chain data with auto-refresh\n const {\n data: results,\n isLoading,\n error,\n refetch,\n } = useReadContracts({\n contracts,\n query: {\n ...queryDefaults,\n enabled: enabled && !!address && tokens.length > 0,\n refetchInterval: 5_000,\n refetchOnWindowFocus: true,\n },\n });\n\n // Transform results into TokenBalance format\n const balances = useMemo(() => {\n if (!results || results.length === 0) return [];\n\n return tokens.map((token, index) => {\n const result = results[index];\n\n // Extract balance value\n let balance = \"0\";\n if (result?.status === \"success\" && typeof result.result === \"bigint\") {\n balance = result.result.toString();\n }\n\n return {\n token,\n amount: balance,\n source: \"onchain\" as const,\n };\n });\n }, [results, tokens]);\n\n return {\n balances,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { Token } from \"../../schemas/shared\";\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 { 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,\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 { useQuery } from \"@tanstack/react-query\";\nimport { supportedChainsQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { Chain } from \"../schemas/shared\";\n\nexport interface UseSupportedChainsResult {\n /** List of supported chains */\n chains: Chain[];\n /** Get chain by chainId */\n getChainByChainId: (chainId: string) => Chain | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch all supported chains with helper methods\n */\nexport function useSupportedChains(): UseSupportedChainsResult {\n const { data, isLoading, error, refetch } = useQuery({\n ...supportedChainsQueries.all,\n ...queryDefaults,\n });\n\n const chains = data?.chains ?? [];\n\n return {\n chains,\n getChainByChainId: (chainId: string) => chains.find((chain) => chain.chainId === chainId),\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\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 { SupportedTokenFilters } from \"./schema\";\nimport type { Token } from \"../schemas/shared\";\n\nexport interface UseSupportedTokensOptions extends SupportedTokenFilters {\n enabled?: boolean;\n}\n\nexport interface UseSupportedTokensResult {\n tokens: Token[];\n total: number;\n limit: number;\n page: number;\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n getTokenById: (id: string) => Token | undefined;\n getToken: (address: string, chainId: string) => Token | undefined;\n}\n\n/**\n * Hook to fetch supported tokens with pagination and search\n */\nexport function useSupportedTokens({\n page = 0,\n limit = 20,\n search,\n enabled = true,\n}: UseSupportedTokensOptions = {}): UseSupportedTokensResult {\n const { data, isLoading, error, refetch } = useQuery({\n ...supportedTokensQueries.list({ page, limit, search }),\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 // Map SupportedToken to Token (remove 'active' field)\n const tokens: Token[] = useMemo(() => {\n if (!data?.tokens) return [];\n return data.tokens.map(({ active, ...token }) => token);\n }, [data?.tokens]);\n\n return {\n tokens,\n total: data?.total ?? 0,\n limit: data?.limit ?? limit,\n page: data?.page ?? page,\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 { useMemo } from \"react\";\nimport { useMultiChainBalances } from \"../../enso-balances/hooks\";\nimport type { TokenBalance } from \"../types\";\nimport type { Token } from \"../../schemas/shared\";\nimport { useSupportedChains } from \"../../supported-chains\";\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 type { Token } from \"../schemas/shared\";\nimport type { TokenBalance } from \"./types\";\nimport { BalanceSourcePriority } from \"./types\";\nimport { formatUnits } from \"viem\";\nimport { EXCLUDE_TOKEN_ADDRESS_LIST } from \"./constants\";\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: `${chain}-${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}-${balance.token.address.toLowerCase()}`;\n\n // Skip receipt token if provided\n if (receiptToken) {\n const receiptKey = `${receiptToken.chain}-${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 { 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, queryOptions } from \"@tanstack/react-query\";\nimport type { UseQueryOptions, UseQueryResult } from \"@tanstack/react-query\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GeoCheckResponse {\n canInteract: boolean;\n}\n\nexport interface UseGeocheckOptions {\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n}\n\n// ============================================================================\n// Query Function\n// ============================================================================\n\nconst INDEXER_ENDPOINT = \"https://api.turtle.xyz\";\n\nasync function fetchGeocheck(): Promise<GeoCheckResponse> {\n const url = `${INDEXER_ENDPOINT}/turtle/geocheck`;\n\n const response = await fetch(url, {\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch geocheck: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Validate response structure\n if (typeof data.canInteract !== \"boolean\") {\n throw new Error(\"Invalid geocheck response format\");\n }\n\n return data as GeoCheckResponse;\n}\n\n// ============================================================================\n// Query Options\n// ============================================================================\n\nexport const geocheckQueryOptions = () =>\n queryOptions({\n queryKey: [\"geocheck\"] as const,\n queryFn: fetchGeocheck,\n });\n\n// ============================================================================\n// Hook\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(\n options: UseGeocheckOptions = {}\n): UseQueryResult<GeoCheckResponse> {\n const { enabled = true, staleTime, gcTime } = options;\n\n return useQuery({\n ...geocheckQueryOptions(),\n enabled,\n staleTime: staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: gcTime ?? 10 * 60 * 1000, // 10 minutes\n refetchOnWindowFocus: false,\n retry: 1,\n } as UseQueryOptions<GeoCheckResponse>);\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","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport { apiClient, type ApiClientConfig } from \"./api-client\";\n\nexport interface TurtleHooksProviderProps extends ApiClientConfig {\n children: React.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 * 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 debug,\n}: TurtleHooksProviderProps) {\n const config = useMemo(\n () => ({ apiUrl, earnUrl, getToken, debug }),\n [apiUrl, earnUrl, getToken, debug]\n );\n\n useEffect(() => {\n apiClient.configure(config);\n }, [config]);\n\n return <>{children}</>;\n}\n"],"mappings":"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","names":["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_zod","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_zod","import_query_key_factory","import_zod","import_react_query","import_react_query","import_react_query","import_react_query","queries","import_react_query","import_react_query","import_react","import_utils","BalanceSourcePriority","import_zod","import_query_key_factory","import_react","import_viem","import_react","import_react_query","import_react","import_react_query","import_react_query","import_react","import_viem","error","import_react","import_viem","import_react_query","import_react_query","import_react","import_utils","approveStep","step","import_react_query","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/v2/index.ts","../src/v2/opportunities/queries.ts","../src/v2/lib/api-client.ts","../src/v2/schemas/shared.ts","../src/v2/opportunities/schema.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/products/queries.ts","../src/v2/products/schema.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/widget/api.ts","../src/v2/supported-chains/queries.ts","../src/v2/supported-chains/schema.ts","../src/v2/supported-chains/api.ts","../src/v2/supported-tokens/queries.ts","../src/v2/supported-tokens/schema.ts","../src/v2/supported-tokens/api.ts","../src/v2/users/queries.ts","../src/v2/users/schemas.ts","../src/v2/users/api.ts","../src/v2/earn-opportunities/hooks.ts","../src/v2/lib/query-config.ts","../src/v2/earn-route/hooks.ts","../src/v2/earn-membership/hooks.ts","../src/v2/earn-deposits/hooks.ts","../src/v2/enso-balances/hooks.ts","../src/v2/opportunities/hooks.ts","../src/v2/products/hooks.ts","../src/v2/balance/hooks/useTokenBalance.ts","../src/v2/balance/types.ts","../src/v2/balance/schema.ts","../src/v2/balance/api.ts","../src/v2/balance/queries.ts","../src/v2/balance/hooks/useBalance.ts","../src/v2/balance/hooks/useGetOnChainBalance.ts","../src/v2/balance/hooks/usePortfolioBalance.ts","../src/v2/supported-chains/hooks.ts","../src/v2/supported-tokens/hooks.ts","../src/v2/balance/hooks/useEnsoBalances.ts","../src/v2/balance/utils.ts","../src/v2/balance/constants.ts","../src/v2/widget/hooks.ts","../src/v2/geocheck/useGeocheck.ts","../src/v2/swap/useSwapRoute.ts","../src/v2/swap/route-processor.ts","../src/v2/users/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 { productsQueries } from \"./products/queries\";\nimport { ensoBalancesQueries } from \"./enso-balances/queries\";\nimport { widgetQueries } from \"./widget/queries\";\nimport { supportedChainsQueries } from \"./supported-chains/queries\";\nimport { supportedTokensQueries } from \"./supported-tokens/queries\";\nimport { usersQueries } from \"./users/queries\";\n\n// Merged query keys for cache invalidation\nexport const queries = mergeQueryKeys(\n opportunitiesQueries,\n earnOpportunitiesQueries,\n earnRouteQueries,\n earnMembershipQueries,\n earnDepositsQueries,\n productsQueries,\n ensoBalancesQueries,\n widgetQueries,\n supportedChainsQueries,\n supportedTokensQueries,\n usersQueries\n);\n\n// Features - Earn API\nexport * from \"./earn-opportunities\";\nexport * from \"./earn-route\";\nexport * from \"./earn-membership\";\nexport * from \"./earn-deposits\";\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 \"./swap\";\nexport * from \"./users\";\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 { getOpportunities, getOpportunityById } from \"./api\";\nimport type { OpportunityFilters } 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) => ({\n queryKey: [id],\n queryFn: () => getOpportunityById(id),\n }),\n});\n","export const API_BASE_URL = \"https://api.turtle.club\";\nexport const EARN_BASE_URL = \"https://earn.turtle.club\";\n\nexport type ApiDomain = \"api\" | \"earn\";\n\nexport interface ApiClientConfig {\n apiUrl?: string;\n earnUrl?: string;\n getToken?: () => string | null;\n debug?: 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>(\n endpoint: string,\n options?: ApiClientOptions\n ): 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 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(\n error instanceof Error ? error.message : \"Unknown error\",\n 0,\n error\n );\n }\n }\n}\n\nexport const apiClient = ApiClient.getInstance();\n","import { z } from \"zod\";\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 logoUrl: z.string().optional(),\n ecosystem: z.string().optional(),\n status: z.string().optional(),\n explorerUrl: z.string().optional(),\n});\n\nexport const tokenSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n symbol: z.string(),\n address: z.string(),\n chain: chainSchema,\n decimals: z.number(),\n logoUrl: z.string().optional(),\n isNative: z.boolean(),\n priceUsd: z.number().optional(),\n price: z.string().optional(),\n amount: z.string().optional(),\n rawAmount: z.string().optional(),\n});\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 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\nexport const productSchema = z.object({\n id: z.string(),\n name: z.string(),\n title: z.string().optional().nullable(),\n subtitle: z.string().optional().nullable(),\n description: z.string().optional().nullable(),\n logoUrl: z.string().optional().nullable(),\n productUrl: z.string().optional().nullable(),\n startedAt: z.string().optional().nullable(),\n status: z.string().optional().nullable(),\n productType: z.string().optional().nullable(),\n organization: organizationSchema,\n createdAt: z.string().optional().nullable(),\n});\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 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().optional(),\n protocol: z.object({ id: z.string() }),\n marketAddress: z.string().min(1, \"Market address is required\"),\n depositUrl: z.string().optional().nullable(),\n providerMetadata: z.any().optional().nullable(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\n\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});\n\n// Opportunity Type Enum\nconst opportunityTypeEnum = z.enum([\"vault\", \"lending\", \"staking\", \"stablecoin\", \"\"]);\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 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 createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n\n // Relationships\n depositTokens: z.array(tokenSchema),\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\n // Will be deprecated\n exposure: z.array(z.string()),\n explorerUrl: z.string().nullable(),\n});\n\n// Pagination metadata schema\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),\n has_next: z.boolean(),\n has_previous: z.boolean(),\n});\n\nexport type Chain = z.infer<typeof chainSchema>;\nexport type Token = z.infer<typeof tokenSchema>;\nexport type Organization = z.infer<typeof organizationSchema>;\nexport type Product = z.infer<typeof productSchema>;\nexport type VaultConfig = z.infer<typeof vaultConfigSchema>;\nexport type LendingConfig = z.infer<typeof lendingConfigSchema>;\nexport type Incentive = z.infer<typeof incentiveSchema>;\nexport type Opportunity = z.infer<typeof opportunitySchema>;\nexport type PaginationMetadata = z.infer<typeof paginationMetadataSchema>;\n","import { z } from \"zod\";\nimport { opportunitySchema } from \"../schemas/shared\";\n\nexport const opportunityFiltersSchema = z.object({\n tokenId: z.string().uuid().optional(),\n chain: z.string().optional(),\n productId: z.string().uuid().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","import { apiClient } from \"../lib/api-client\";\nimport type { OpportunityFilters, OpportunitiesResponse } from \"./schema\";\nimport type { Opportunity } from \"../schemas/shared\";\nimport { opportunitySchema } from \"../schemas/shared\";\nimport { opportunitiesResponseSchema } 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 options?: { debug?: boolean }\n): Promise<Opportunity> {\n const data = await apiClient.fetch(`/turtle/opportunities/${id}`, {\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","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 { chainSchema, tokenSchema } from \"../schemas/shared\";\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\";\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 { 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 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})\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<\n typeof UploadProductLogoRequestSchema\n>\nexport type UploadProductLogoResponse = z.infer<\n typeof UploadProductLogoResponseSchema\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 \"../schemas/shared\";\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 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 { getSupportedChains } from \"./api\";\n\nexport const supportedChainsQueries = createQueryKeys(\"supportedChains\", {\n all: {\n queryKey: null,\n queryFn: () => getSupportedChains(),\n },\n});\n","import { z } from \"zod\";\nimport { chainSchema } from \"../schemas/shared\";\n\n// Supported chains response schema\nexport const supportedChainsResponseSchema = z.object({\n chains: z.array(chainSchema),\n});\n\n// Types\nexport type SupportedChainsResponse = z.infer<typeof supportedChainsResponseSchema>;\n","import { apiClient } from \"../lib/api-client\";\nimport type { SupportedChainsResponse } from \"./schema\";\nimport { supportedChainsResponseSchema } from \"./schema\";\n\n// GET /turtle/chains\nexport async function getSupportedChains(\n options?: { debug?: boolean }\n): Promise<SupportedChainsResponse> {\n const data = await apiClient.fetch(\"/turtle/chains\", {\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 { 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 { z } from \"zod\";\nimport { tokenSchema, chainSchema } from \"../schemas/shared\";\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 page: z.number().optional(),\n});\n\n// Supported token filters\nexport interface SupportedTokenFilters {\n page?: number;\n limit?: number;\n search?: string;\n}\n\n// Types\nexport type SupportedToken = z.infer<typeof supportedTokenSchema>;\nexport type SupportedTokensResponse = z.infer<typeof supportedTokensResponseSchema>;\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?.page !== undefined) params.append(\"page\", filters.page.toString());\n if (filters?.limit !== undefined) params.append(\"limit\", filters.limit.toString());\n if (filters?.search) params.append(\"search\", filters.search);\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 { 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, tokenSchema } from \"../schemas/shared\";\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 { 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","// Default TanStack Query configuration\n// Override per-query as needed\n\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","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","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 { useQuery, type UseQueryOptions, type UseQueryResult } from \"@tanstack/react-query\";\nimport { opportunitiesQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { OpportunitiesResponse, OpportunityFilters } from \"./schema\";\nimport type { Opportunity } from \"../schemas/shared\";\n\nexport interface UseOpportunitiesOptions\n extends Omit<UseQueryOptions<OpportunitiesResponse>, \"queryKey\" | \"queryFn\"> {\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\n extends Omit<UseQueryOptions<Opportunity>, \"queryKey\" | \"queryFn\"> {\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","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 { 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 type { Opportunity, Token } from \"../schemas/shared\";\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 { z } from \"zod\";\nimport { chainSchema } from \"../schemas/shared\";\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 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 { 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 { useMemo } from \"react\";\nimport type { UseBalanceParams } from \"../types\";\nimport type { TokenBalance } from \"../types\";\nimport { useGetOnChainBalance } from \"../hooks/useGetOnChainBalance\";\nimport { usePortfolioBalance } from \"./usePortfolioBalance\";\nimport { useEnsoBalances } from \"../hooks/useEnsoBalances\";\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 * 3. Enso - fallback\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 // Fetch Enso balances (always enabled when address exists)\n const {\n balances: ensoBalances,\n isLoading: isEnsoLoading,\n error: ensoError,\n refetch: refetchEnso,\n } = useEnsoBalances({\n address,\n chainIds,\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 if (ensoBalances.length > 0) {\n sources.push(ensoBalances); // Priority 3\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, ensoBalances, depositOpportunity]);\n\n // Aggregate loading states\n const isLoading = isOnChainLoading || isPortfolioLoading || isEnsoLoading;\n\n // Return first error encountered\n const error = onChainError || portfolioError || ensoError;\n\n // Refetch all sources\n const refetchAll = () => {\n if (depositOpportunity) {\n refetchOnChain();\n }\n refetchPortfolio();\n refetchEnso();\n };\n\n return {\n balances: consolidatedBalances,\n isLoading,\n error,\n refetchAll,\n };\n}\n","import type { Token } from \"../../schemas/shared\";\nimport { useReadContracts } from \"wagmi\";\nimport { erc20Abi } from \"viem\";\nimport { useMemo } from \"react\";\nimport type { TokenBalance } from \"../types\";\nimport { queryDefaults } from \"../../lib/query-config\";\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 // Build multicall contracts array: only balanceOf for each token\n const contracts = useMemo(() => {\n if (!address || !enabled) return [];\n\n return tokens.map((token) => ({\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 }, [tokens, address, chainId, enabled]);\n\n // Fetch on-chain data with auto-refresh\n const {\n data: results,\n isLoading,\n error,\n refetch,\n } = useReadContracts({\n contracts,\n query: {\n ...queryDefaults,\n enabled: enabled && !!address && tokens.length > 0,\n refetchInterval: 5_000,\n refetchOnWindowFocus: true,\n },\n });\n\n // Transform results into TokenBalance format\n const balances = useMemo(() => {\n if (!results || results.length === 0) return [];\n\n return tokens.map((token, index) => {\n const result = results[index];\n\n // Extract balance value\n let balance = \"0\";\n if (result?.status === \"success\" && typeof result.result === \"bigint\") {\n balance = result.result.toString();\n }\n\n return {\n token,\n amount: balance,\n source: \"onchain\" as const,\n };\n });\n }, [results, tokens]);\n\n return {\n balances,\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { Token } from \"../../schemas/shared\";\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 { 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,\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 { useQuery } from \"@tanstack/react-query\";\nimport { supportedChainsQueries } from \"./queries\";\nimport { queryDefaults } from \"../lib/query-config\";\nimport type { Chain } from \"../schemas/shared\";\n\nexport interface UseSupportedChainsResult {\n /** List of supported chains */\n chains: Chain[];\n /** Get chain by chainId */\n getChainByChainId: (chainId: string) => Chain | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch all supported chains with helper methods\n */\nexport function useSupportedChains(): UseSupportedChainsResult {\n const { data, isLoading, error, refetch } = useQuery({\n ...supportedChainsQueries.all,\n ...queryDefaults,\n });\n\n const chains = data?.chains ?? [];\n\n return {\n chains,\n getChainByChainId: (chainId: string) => chains.find((chain) => chain.chainId === chainId),\n isLoading,\n error: error ? (error as Error) : null,\n refetch,\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 { SupportedTokenFilters } from \"./schema\";\nimport type { Token } from \"../schemas/shared\";\n\nexport interface UseSupportedTokensOptions extends SupportedTokenFilters {\n enabled?: boolean;\n}\n\nexport interface UseSupportedTokensResult {\n tokens: Token[];\n total: number;\n limit: number;\n page: number;\n isLoading: boolean;\n error: Error | null;\n refetch: () => void;\n getTokenById: (id: string) => Token | undefined;\n getToken: (address: string, chainId: string) => Token | undefined;\n}\n\n/**\n * Hook to fetch supported tokens with pagination and search\n */\nexport function useSupportedTokens({\n page = 0,\n limit = 20,\n search,\n enabled = true,\n}: UseSupportedTokensOptions = {}): UseSupportedTokensResult {\n const { data, isLoading, error, refetch } = useQuery({\n ...supportedTokensQueries.list({ page, limit, search }),\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 // Map SupportedToken to Token (remove 'active' field)\n const tokens: Token[] = useMemo(() => {\n if (!data?.tokens) return [];\n return data.tokens.map(({ active, ...token }) => token);\n }, [data?.tokens]);\n\n return {\n tokens,\n total: data?.total ?? 0,\n limit: data?.limit ?? limit,\n page: data?.page ?? page,\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 { useMemo } from \"react\";\nimport { useMultiChainBalances } from \"../../enso-balances/hooks\";\nimport type { TokenBalance } from \"../types\";\nimport type { Token } from \"../../schemas/shared\";\nimport { useSupportedChains } from \"../../supported-chains\";\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 type { Token } from \"../schemas/shared\";\nimport type { TokenBalance } from \"./types\";\nimport { BalanceSourcePriority } from \"./types\";\nimport { formatUnits } from \"viem\";\nimport { EXCLUDE_TOKEN_ADDRESS_LIST } from \"./constants\";\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: `${chain}-${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}-${balance.token.address.toLowerCase()}`;\n\n // Skip receipt token if provided\n if (receiptToken) {\n const receiptKey = `${receiptToken.chain}-${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 { 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, queryOptions } from \"@tanstack/react-query\";\nimport type { UseQueryOptions, UseQueryResult } from \"@tanstack/react-query\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GeoCheckResponse {\n canInteract: boolean;\n}\n\nexport interface UseGeocheckOptions {\n enabled?: boolean;\n staleTime?: number;\n gcTime?: number;\n}\n\n// ============================================================================\n// Query Function\n// ============================================================================\n\nconst INDEXER_ENDPOINT = \"https://api.turtle.xyz\";\n\nasync function fetchGeocheck(): Promise<GeoCheckResponse> {\n const url = `${INDEXER_ENDPOINT}/turtle/geocheck`;\n\n const response = await fetch(url, {\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch geocheck: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // Validate response structure\n if (typeof data.canInteract !== \"boolean\") {\n throw new Error(\"Invalid geocheck response format\");\n }\n\n return data as GeoCheckResponse;\n}\n\n// ============================================================================\n// Query Options\n// ============================================================================\n\nexport const geocheckQueryOptions = () =>\n queryOptions({\n queryKey: [\"geocheck\"] as const,\n queryFn: fetchGeocheck,\n });\n\n// ============================================================================\n// Hook\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(\n options: UseGeocheckOptions = {}\n): UseQueryResult<GeoCheckResponse> {\n const { enabled = true, staleTime, gcTime } = options;\n\n return useQuery({\n ...geocheckQueryOptions(),\n enabled,\n staleTime: staleTime ?? 5 * 60 * 1000, // 5 minutes\n gcTime: gcTime ?? 10 * 60 * 1000, // 10 minutes\n refetchOnWindowFocus: false,\n retry: 1,\n } as UseQueryOptions<GeoCheckResponse>);\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","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport { apiClient, type ApiClientConfig } from \"./api-client\";\n\nexport interface TurtleHooksProviderProps extends ApiClientConfig {\n children: React.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 * 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 debug,\n}: TurtleHooksProviderProps) {\n const config = useMemo(\n () => ({ apiUrl, earnUrl, getToken, debug }),\n [apiUrl, earnUrl, getToken, debug]\n );\n\n useEffect(() => {\n apiClient.configure(config);\n }, [config]);\n\n return <>{children}</>;\n}\n"],"mappings":"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","names":["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_zod","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_zod","import_query_key_factory","import_zod","import_react_query","import_react_query","import_react_query","import_react_query","queries","import_react_query","import_react_query","import_react","import_utils","BalanceSourcePriority","import_zod","import_query_key_factory","import_react","import_viem","import_react","import_react_query","import_react","import_react_query","import_react_query","import_react","import_viem","error","import_react","import_viem","import_react_query","import_react_query","import_react","import_utils","approveStep","step","import_react_query","import_react"]}
|