@liberfi.io/react 0.1.10 → 0.1.12

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/README.md CHANGED
@@ -121,11 +121,15 @@ Each subscription hook manages WebSocket lifecycle automatically (subscribe on m
121
121
 
122
122
  ### Types
123
123
 
124
- | Name | Definition | Description |
125
- | ------------------------ | ----------------------------------------------------------------- | ------------------------------- |
126
- | `DexClientProviderProps` | `PropsWithChildren<{ client, subscribeClient, queryKeyPrefix? }>` | Props for `DexClientProvider`. |
127
- | `DexClientContextValue` | `{ client, subscribeClient, queryKeyPrefix }` | Shape of the context value. |
128
- | `SubscriptionOptions` | `{ enabled?: boolean; onError?: (error: Error) => void }` | Options for subscription hooks. |
124
+ | Name | Definition | Description |
125
+ | ------------------------- | ----------------------------------------------------------------- | ----------------------------------------- |
126
+ | `DexClientProviderProps` | `PropsWithChildren<{ client, subscribeClient, queryKeyPrefix? }>` | Props for `DexClientProvider`. |
127
+ | `DexClientContextValue` | `{ client, subscribeClient, queryKeyPrefix }` | Shape of the context value. |
128
+ | `SubscriptionOptions` | `{ enabled?: boolean; onError?: (error: Error) => void }` | Options for subscription hooks. |
129
+ | `QueryHookConfig` | `{ name, queryKey, fetch, defaultOptions? }` | Config for `createQueryHook`. |
130
+ | `QueryHookReturn` | `{ queryKey, fetch, useQuery }` | Return type of `createQueryHook`. |
131
+ | `InfiniteQueryHookConfig` | `{ name, queryKey, fetch }` | Config for `createInfiniteQueryHook`. |
132
+ | `InfiniteQueryHookReturn` | `{ queryKey, useInfiniteQuery }` | Return type of `createInfiniteQueryHook`. |
129
133
 
130
134
  ### Constants
131
135
 
@@ -133,6 +137,33 @@ Each subscription hook manages WebSocket lifecycle automatically (subscribe on m
133
137
  | -------------------------- | ----------- | ---------------------------------- |
134
138
  | `DEFAULT_QUERY_KEY_PREFIX` | `"liberfi"` | Default prefix for all query keys. |
135
139
 
140
+ ### Factory Functions
141
+
142
+ #### `createQueryHook<TParams, TData>(config): QueryHookReturn<TParams, TData>`
143
+
144
+ Creates a `useQuery`-based hook, its `queryKey` builder, and a standalone `fetch` function from a single declarative config.
145
+
146
+ | Config Field | Type | Description |
147
+ | ---------------- | ---------------------------------------------------------- | ---------------------------------------------- |
148
+ | `name` | `string` | Key name segment (e.g. `"token"`). |
149
+ | `queryKey` | `(params: TParams) => string[]` | Builds the variable segments of the query key. |
150
+ | `fetch` | `(client: API.IClient, params: TParams) => Promise<TData>` | Fetches data using the API client. |
151
+ | `defaultOptions` | `Partial<Omit<UseQueryOptions, "queryKey" \| "queryFn">>` | Default options merged below caller options. |
152
+
153
+ Returns `{ queryKey, fetch, useQuery }`.
154
+
155
+ #### `createInfiniteQueryHook<TParams, TData>(config): InfiniteQueryHookReturn<TParams, TData>`
156
+
157
+ Creates a `useInfiniteQuery`-based hook and its `queryKey` builder for cursor-paginated endpoints. `TData` must extend `{ hasNext?: boolean; endCursor?: string }`.
158
+
159
+ | Config Field | Type | Description |
160
+ | ------------ | --------------------------------------------------------------------------------------- | ---------------------------------------------- |
161
+ | `name` | `string` | Key name segment (e.g. `"walletPortfolios"`). |
162
+ | `queryKey` | `(params: TParams) => string[]` | Builds the variable segments of the query key. |
163
+ | `fetch` | `(client: API.IClient, params: TParams, cursor: string \| undefined) => Promise<TData>` | Fetches a single page of data. |
164
+
165
+ Returns `{ queryKey, useInfiniteQuery }`.
166
+
136
167
  ### Utility Functions
137
168
 
138
169
  | Function | Signature | Description |
@@ -236,6 +267,33 @@ function RefreshButton({ address }: { address: string }) {
236
267
  }
237
268
  ```
238
269
 
270
+ ### Creating a custom query hook
271
+
272
+ ```tsx
273
+ import { createQueryHook } from "@liberfi.io/react";
274
+
275
+ interface MyDataParams {
276
+ chain: string;
277
+ id: string;
278
+ }
279
+
280
+ interface MyData {
281
+ value: number;
282
+ }
283
+
284
+ const {
285
+ queryKey: myDataQueryKey,
286
+ fetch: fetchMyData,
287
+ useQuery: useMyDataQuery,
288
+ } = createQueryHook<MyDataParams, MyData>({
289
+ name: "myData",
290
+ queryKey: (p) => [p.chain, p.id],
291
+ fetch: (client, p) => client.getMyData(p.chain, p.id),
292
+ });
293
+
294
+ export { myDataQueryKey, fetchMyData, useMyDataQuery };
295
+ ```
296
+
239
297
  ### Infinite scrolling
240
298
 
241
299
  ```tsx
@@ -269,9 +327,49 @@ function PortfolioList({ walletAddress }: { walletAddress: string }) {
269
327
  }
270
328
  ```
271
329
 
330
+ ## Testing
331
+
332
+ ### Unit Tests
333
+
334
+ Unit tests mock the API client and verify hook behavior (query keys, fetch delegation, subscription lifecycle).
335
+
336
+ ```bash
337
+ pnpm test
338
+ ```
339
+
340
+ ### Integration Tests
341
+
342
+ Integration tests use the real `@liberfi.io/client` to verify end-to-end API communication.
343
+
344
+ **Setup:**
345
+
346
+ ```bash
347
+ cp .env.test.example .env.test # review and adjust URLs if needed
348
+ ```
349
+
350
+ Required environment variables (in `.env.test`):
351
+
352
+ | Variable | Description |
353
+ | ------------------------ | ------------------------------------------------- |
354
+ | `CHAINSTREAM_BASE_URL` | REST API server URL |
355
+ | `API_BASE_URL` | Auth API base URL (for fetching the access token) |
356
+ | `CHAINSTREAM_STREAM_URL` | _(optional)_ WebSocket URL, defaults to SDK value |
357
+
358
+ **Run:**
359
+
360
+ ```bash
361
+ pnpm test:integration
362
+ ```
363
+
364
+ When the environment variables are not set, integration tests are automatically skipped.
365
+
366
+ **Architecture:**
367
+
368
+ - `src/__integration__/fetch.integration.test.ts` — Tests standalone `fetch*` functions against the real API in a Node environment. Validates API response shapes and end-to-end data flow.
369
+ - `src/__integration__/hooks.integration.test.tsx` — Tests hooks via `renderHook` with a real client, verifying provider injection and full end-to-end data fetching through React Query. Uses a custom jsdom environment (`jsdom-with-fetch.js`) that injects Node's native `fetch` and removes `XMLHttpRequest` to bypass CORS.
370
+
272
371
  ## Future Improvements
273
372
 
274
- - Export `createQueryHook` and `createInfiniteQueryHook` factories so consumers can create custom hooks.
275
373
  - Add a standalone `fetch` function to infinite query hooks for API consistency.
276
374
  - Add a mutation key to `useSendTxMutation` for cache introspection.
277
375
  - Consolidate `version.ts` global side effect into a shared utility.
package/dist/index.d.mts CHANGED
@@ -3,7 +3,7 @@ import { PropsWithChildren } from 'react';
3
3
  import * as _liberfi_io_types from '@liberfi.io/types';
4
4
  import { API, Chain, Token, TokenResolution, TokenCandle, TokenHolder, TokenMarketData, TokenSecurity, TokenStats, Trade, WalletPnl, WalletPortfolioPnls, WalletPortfolios, Portfolio, PortfolioPnl, Activity } from '@liberfi.io/types';
5
5
  import * as _tanstack_react_query from '@tanstack/react-query';
6
- import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
6
+ import { UseQueryOptions, UseQueryResult, UseInfiniteQueryOptions, InfiniteData, UseInfiniteQueryResult, UseMutationOptions } from '@tanstack/react-query';
7
7
  import * as react_jsx_runtime from 'react/jsx-runtime';
8
8
 
9
9
  declare global {
@@ -45,6 +45,65 @@ declare const DexClientContext: react.Context<DexClientContextValue | null>;
45
45
  */
46
46
  declare function useDexClient(): DexClientContextValue;
47
47
 
48
+ interface QueryHookConfig<TParams, TData> {
49
+ /** Key name segment (e.g. `"token"`, `"newTokens"`). */
50
+ name: string;
51
+ /** Builds the variable segments of the query key from `params`. */
52
+ queryKey: (params: TParams) => string[];
53
+ /** Fetches data using the API client. */
54
+ fetch: (client: API.IClient, params: TParams) => Promise<TData>;
55
+ /** Default options merged *below* caller-supplied options. */
56
+ defaultOptions?: Partial<Omit<UseQueryOptions<TData, Error, TData, string[]>, "queryKey" | "queryFn">>;
57
+ }
58
+ interface QueryHookReturn<TParams, TData> {
59
+ /**
60
+ * Builds the full query key including the namespace prefix.
61
+ *
62
+ * Useful for manual cache operations such as `queryClient.invalidateQueries`
63
+ * or `queryClient.prefetchQuery`.
64
+ *
65
+ * @param params - Hook parameters.
66
+ * @param prefix - Override the default prefix (`DEFAULT_QUERY_KEY_PREFIX`).
67
+ */
68
+ queryKey: (params: TParams, prefix?: string) => string[];
69
+ /** Fetches data using the API client (for use outside React). */
70
+ fetch: (client: API.IClient, params: TParams) => Promise<TData>;
71
+ /** React hook that fetches and caches data via TanStack Query. */
72
+ useQuery: (params: TParams, options?: Omit<UseQueryOptions<TData, Error, TData, string[]>, "queryKey" | "queryFn">) => UseQueryResult<TData, Error>;
73
+ }
74
+ /**
75
+ * Creates a `useQuery`-based hook, its `queryKey` builder and a standalone
76
+ * `fetch` function from a single declarative config object.
77
+ */
78
+ declare function createQueryHook<TParams, TData>(config: QueryHookConfig<TParams, TData>): QueryHookReturn<TParams, TData>;
79
+
80
+ interface CursorPaginatedResult {
81
+ hasNext?: boolean;
82
+ endCursor?: string;
83
+ }
84
+ interface InfiniteQueryHookConfig<TParams, TData extends CursorPaginatedResult> {
85
+ /** Key name segment (e.g. `"walletPortfolios"`). */
86
+ name: string;
87
+ /** Builds the variable segments of the query key from `params`. */
88
+ queryKey: (params: TParams) => string[];
89
+ /** Fetches a single page of data. */
90
+ fetch: (client: API.IClient, params: TParams, cursor: string | undefined) => Promise<TData>;
91
+ }
92
+ interface InfiniteQueryHookReturn<TParams, TData extends CursorPaginatedResult> {
93
+ /**
94
+ * Builds the full query key including the namespace prefix and an
95
+ * `"infinite"` tag to distinguish it from the non-infinite variant.
96
+ */
97
+ queryKey: (params: TParams, prefix?: string) => string[];
98
+ /** React hook that fetches cursor-paginated data via TanStack Query. */
99
+ useInfiniteQuery: (params: TParams, options?: Omit<UseInfiniteQueryOptions<TData, Error, InfiniteData<TData>, string[], string | undefined>, "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam">) => UseInfiniteQueryResult<InfiniteData<TData>, Error>;
100
+ }
101
+ /**
102
+ * Creates a `useInfiniteQuery`-based hook and its `queryKey` builder for
103
+ * cursor-paginated endpoints.
104
+ */
105
+ declare function createInfiniteQueryHook<TParams, TData extends CursorPaginatedResult>(config: InfiniteQueryHookConfig<TParams, TData>): InfiniteQueryHookReturn<TParams, TData>;
106
+
48
107
  interface SubscriptionOptions {
49
108
  /** Set to `false` to pause the subscription. Defaults to `true`. */
50
109
  enabled?: boolean;
@@ -439,4 +498,4 @@ type DexClientProviderProps = PropsWithChildren<{
439
498
  */
440
499
  declare function DexClientProvider({ client, subscribeClient, queryKeyPrefix, children, }: DexClientProviderProps): react_jsx_runtime.JSX.Element;
441
500
 
442
- export { DEFAULT_QUERY_KEY_PREFIX, DexClientContext, type DexClientContextValue, DexClientProvider, type DexClientProviderProps, type SubscriptionOptions, type UseFinalStretchTokensQueryParams, type UseFinalStretchTokensSubscriptionParams, type UseMigratedTokensQueryParams, type UseMigratedTokensSubscriptionParams, type UseNewTokensQueryParams, type UseNewTokensSubscriptionParams, type UseSearchTokensQueryParams, type UseSendTxMutationParams, type UseStockTokensQueryParams, type UseStockTokensSubscriptionParams, type UseSwapRouteQueryParams, type UseTokenActivitiesQueryParams, type UseTokenActivitiesSubscriptionParams, type UseTokenCandlesQueryParams, type UseTokenCandlesSubscriptionParams, type UseTokenHoldersQueryParams, type UseTokenMarketDataQueryParams, type UseTokenQueryParams, type UseTokenSecurityQueryParams, type UseTokenStatsQueryParams, type UseTokenSubscriptionParams, type UseTokenTradesQueryParams, type UseTokenTradesSubscriptionParams, type UseTokensQueryParams, type UseTrendingTokensQueryParams, type UseTrendingTokensSubscriptionParams, type UseTxSuccessQueryParams, type UseWalletActivitiesQueryParams, type UseWalletActivitiesSubscriptionParams, type UseWalletPnlQueryParams, type UseWalletPnlSubscriptionParams, type UseWalletPortfolioPnlsByTokensQueryParams, type UseWalletPortfolioPnlsInfiniteQueryParams, type UseWalletPortfolioPnlsQueryParams, type UseWalletPortfolioPnlsSubscriptionParams, type UseWalletPortfoliosByTokensQueryParams, type UseWalletPortfoliosInfiniteQueryParams, type UseWalletPortfoliosQueryParams, type UseWalletPortfoliosSubscriptionParams, type UseWalletTradesQueryParams, type UseWalletTradesSubscriptionParams, fetchFinalStretchTokens, fetchMigratedTokens, fetchNewTokens, fetchPresignedUploadUrl, fetchSearchTokens, fetchStockTokens, fetchSwapRoute, fetchToken, fetchTokenActivities, fetchTokenCandles, fetchTokenHolders, fetchTokenMarketData, fetchTokenSecurity, fetchTokenStats, fetchTokenTrades, fetchTokens, fetchTrendingTokens, fetchTxSuccess, fetchWalletActivities, fetchWalletPnl, fetchWalletPortfolioPnls, fetchWalletPortfolioPnlsByTokens, fetchWalletPortfolios, fetchWalletPortfoliosByTokens, fetchWalletTrades, finalStretchTokensQueryKey, migratedTokensQueryKey, newTokensQueryKey, presignedUploadUrlQueryKey, searchTokensQueryKey, sendTx, stockTokensQueryKey, swapRouteQueryKey, toKeySegment, toSortedKeySegment, tokenActivitiesQueryKey, tokenCandlesQueryKey, tokenHoldersQueryKey, tokenMarketDataQueryKey, tokenQueryKey, tokenSecurityQueryKey, tokenStatsQueryKey, tokenTradesQueryKey, tokensQueryKey, trendingTokensQueryKey, txSuccessQueryKey, useDexClient, useFinalStretchTokensQuery, useFinalStretchTokensSubscription, useMigratedTokensQuery, useMigratedTokensSubscription, useNewTokensQuery, useNewTokensSubscription, usePresignedUploadUrlQuery, useSearchTokensQuery, useSendTxMutation, useStockTokensQuery, useStockTokensSubscription, useSwapRouteQuery, useTokenActivitiesQuery, useTokenActivitiesSubscription, useTokenCandlesQuery, useTokenCandlesSubscription, useTokenHoldersQuery, useTokenMarketDataQuery, useTokenQuery, useTokenSecurityQuery, useTokenStatsQuery, useTokenSubscription, useTokenTradesQuery, useTokenTradesSubscription, useTokensQuery, useTrendingTokensQuery, useTrendingTokensSubscription, useTxSuccessQuery, useWalletActivitiesQuery, useWalletActivitiesSubscription, useWalletPnlQuery, useWalletPnlSubscription, useWalletPortfolioPnlsByTokensQuery, useWalletPortfolioPnlsInfiniteQuery, useWalletPortfolioPnlsQuery, useWalletPortfolioPnlsSubscription, useWalletPortfoliosByTokensQuery, useWalletPortfoliosInfiniteQuery, useWalletPortfoliosQuery, useWalletPortfoliosSubscription, useWalletTradesQuery, useWalletTradesSubscription, walletActivitiesQueryKey, walletPnlQueryKey, walletPortfolioPnlsByTokensQueryKey, walletPortfolioPnlsInfiniteQueryKey, walletPortfolioPnlsQueryKey, walletPortfoliosByTokensQueryKey, walletPortfoliosInfiniteQueryKey, walletPortfoliosQueryKey, walletTradesQueryKey };
501
+ export { DEFAULT_QUERY_KEY_PREFIX, DexClientContext, type DexClientContextValue, DexClientProvider, type DexClientProviderProps, type InfiniteQueryHookConfig, type InfiniteQueryHookReturn, type QueryHookConfig, type QueryHookReturn, type SubscriptionOptions, type UseFinalStretchTokensQueryParams, type UseFinalStretchTokensSubscriptionParams, type UseMigratedTokensQueryParams, type UseMigratedTokensSubscriptionParams, type UseNewTokensQueryParams, type UseNewTokensSubscriptionParams, type UseSearchTokensQueryParams, type UseSendTxMutationParams, type UseStockTokensQueryParams, type UseStockTokensSubscriptionParams, type UseSwapRouteQueryParams, type UseTokenActivitiesQueryParams, type UseTokenActivitiesSubscriptionParams, type UseTokenCandlesQueryParams, type UseTokenCandlesSubscriptionParams, type UseTokenHoldersQueryParams, type UseTokenMarketDataQueryParams, type UseTokenQueryParams, type UseTokenSecurityQueryParams, type UseTokenStatsQueryParams, type UseTokenSubscriptionParams, type UseTokenTradesQueryParams, type UseTokenTradesSubscriptionParams, type UseTokensQueryParams, type UseTrendingTokensQueryParams, type UseTrendingTokensSubscriptionParams, type UseTxSuccessQueryParams, type UseWalletActivitiesQueryParams, type UseWalletActivitiesSubscriptionParams, type UseWalletPnlQueryParams, type UseWalletPnlSubscriptionParams, type UseWalletPortfolioPnlsByTokensQueryParams, type UseWalletPortfolioPnlsInfiniteQueryParams, type UseWalletPortfolioPnlsQueryParams, type UseWalletPortfolioPnlsSubscriptionParams, type UseWalletPortfoliosByTokensQueryParams, type UseWalletPortfoliosInfiniteQueryParams, type UseWalletPortfoliosQueryParams, type UseWalletPortfoliosSubscriptionParams, type UseWalletTradesQueryParams, type UseWalletTradesSubscriptionParams, createInfiniteQueryHook, createQueryHook, fetchFinalStretchTokens, fetchMigratedTokens, fetchNewTokens, fetchPresignedUploadUrl, fetchSearchTokens, fetchStockTokens, fetchSwapRoute, fetchToken, fetchTokenActivities, fetchTokenCandles, fetchTokenHolders, fetchTokenMarketData, fetchTokenSecurity, fetchTokenStats, fetchTokenTrades, fetchTokens, fetchTrendingTokens, fetchTxSuccess, fetchWalletActivities, fetchWalletPnl, fetchWalletPortfolioPnls, fetchWalletPortfolioPnlsByTokens, fetchWalletPortfolios, fetchWalletPortfoliosByTokens, fetchWalletTrades, finalStretchTokensQueryKey, migratedTokensQueryKey, newTokensQueryKey, presignedUploadUrlQueryKey, searchTokensQueryKey, sendTx, stockTokensQueryKey, swapRouteQueryKey, toKeySegment, toSortedKeySegment, tokenActivitiesQueryKey, tokenCandlesQueryKey, tokenHoldersQueryKey, tokenMarketDataQueryKey, tokenQueryKey, tokenSecurityQueryKey, tokenStatsQueryKey, tokenTradesQueryKey, tokensQueryKey, trendingTokensQueryKey, txSuccessQueryKey, useDexClient, useFinalStretchTokensQuery, useFinalStretchTokensSubscription, useMigratedTokensQuery, useMigratedTokensSubscription, useNewTokensQuery, useNewTokensSubscription, usePresignedUploadUrlQuery, useSearchTokensQuery, useSendTxMutation, useStockTokensQuery, useStockTokensSubscription, useSwapRouteQuery, useTokenActivitiesQuery, useTokenActivitiesSubscription, useTokenCandlesQuery, useTokenCandlesSubscription, useTokenHoldersQuery, useTokenMarketDataQuery, useTokenQuery, useTokenSecurityQuery, useTokenStatsQuery, useTokenSubscription, useTokenTradesQuery, useTokenTradesSubscription, useTokensQuery, useTrendingTokensQuery, useTrendingTokensSubscription, useTxSuccessQuery, useWalletActivitiesQuery, useWalletActivitiesSubscription, useWalletPnlQuery, useWalletPnlSubscription, useWalletPortfolioPnlsByTokensQuery, useWalletPortfolioPnlsInfiniteQuery, useWalletPortfolioPnlsQuery, useWalletPortfolioPnlsSubscription, useWalletPortfoliosByTokensQuery, useWalletPortfoliosInfiniteQuery, useWalletPortfoliosQuery, useWalletPortfoliosSubscription, useWalletTradesQuery, useWalletTradesSubscription, walletActivitiesQueryKey, walletPnlQueryKey, walletPortfolioPnlsByTokensQueryKey, walletPortfolioPnlsInfiniteQueryKey, walletPortfolioPnlsQueryKey, walletPortfoliosByTokensQueryKey, walletPortfoliosInfiniteQueryKey, walletPortfoliosQueryKey, walletTradesQueryKey };
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { PropsWithChildren } from 'react';
3
3
  import * as _liberfi_io_types from '@liberfi.io/types';
4
4
  import { API, Chain, Token, TokenResolution, TokenCandle, TokenHolder, TokenMarketData, TokenSecurity, TokenStats, Trade, WalletPnl, WalletPortfolioPnls, WalletPortfolios, Portfolio, PortfolioPnl, Activity } from '@liberfi.io/types';
5
5
  import * as _tanstack_react_query from '@tanstack/react-query';
6
- import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
6
+ import { UseQueryOptions, UseQueryResult, UseInfiniteQueryOptions, InfiniteData, UseInfiniteQueryResult, UseMutationOptions } from '@tanstack/react-query';
7
7
  import * as react_jsx_runtime from 'react/jsx-runtime';
8
8
 
9
9
  declare global {
@@ -45,6 +45,65 @@ declare const DexClientContext: react.Context<DexClientContextValue | null>;
45
45
  */
46
46
  declare function useDexClient(): DexClientContextValue;
47
47
 
48
+ interface QueryHookConfig<TParams, TData> {
49
+ /** Key name segment (e.g. `"token"`, `"newTokens"`). */
50
+ name: string;
51
+ /** Builds the variable segments of the query key from `params`. */
52
+ queryKey: (params: TParams) => string[];
53
+ /** Fetches data using the API client. */
54
+ fetch: (client: API.IClient, params: TParams) => Promise<TData>;
55
+ /** Default options merged *below* caller-supplied options. */
56
+ defaultOptions?: Partial<Omit<UseQueryOptions<TData, Error, TData, string[]>, "queryKey" | "queryFn">>;
57
+ }
58
+ interface QueryHookReturn<TParams, TData> {
59
+ /**
60
+ * Builds the full query key including the namespace prefix.
61
+ *
62
+ * Useful for manual cache operations such as `queryClient.invalidateQueries`
63
+ * or `queryClient.prefetchQuery`.
64
+ *
65
+ * @param params - Hook parameters.
66
+ * @param prefix - Override the default prefix (`DEFAULT_QUERY_KEY_PREFIX`).
67
+ */
68
+ queryKey: (params: TParams, prefix?: string) => string[];
69
+ /** Fetches data using the API client (for use outside React). */
70
+ fetch: (client: API.IClient, params: TParams) => Promise<TData>;
71
+ /** React hook that fetches and caches data via TanStack Query. */
72
+ useQuery: (params: TParams, options?: Omit<UseQueryOptions<TData, Error, TData, string[]>, "queryKey" | "queryFn">) => UseQueryResult<TData, Error>;
73
+ }
74
+ /**
75
+ * Creates a `useQuery`-based hook, its `queryKey` builder and a standalone
76
+ * `fetch` function from a single declarative config object.
77
+ */
78
+ declare function createQueryHook<TParams, TData>(config: QueryHookConfig<TParams, TData>): QueryHookReturn<TParams, TData>;
79
+
80
+ interface CursorPaginatedResult {
81
+ hasNext?: boolean;
82
+ endCursor?: string;
83
+ }
84
+ interface InfiniteQueryHookConfig<TParams, TData extends CursorPaginatedResult> {
85
+ /** Key name segment (e.g. `"walletPortfolios"`). */
86
+ name: string;
87
+ /** Builds the variable segments of the query key from `params`. */
88
+ queryKey: (params: TParams) => string[];
89
+ /** Fetches a single page of data. */
90
+ fetch: (client: API.IClient, params: TParams, cursor: string | undefined) => Promise<TData>;
91
+ }
92
+ interface InfiniteQueryHookReturn<TParams, TData extends CursorPaginatedResult> {
93
+ /**
94
+ * Builds the full query key including the namespace prefix and an
95
+ * `"infinite"` tag to distinguish it from the non-infinite variant.
96
+ */
97
+ queryKey: (params: TParams, prefix?: string) => string[];
98
+ /** React hook that fetches cursor-paginated data via TanStack Query. */
99
+ useInfiniteQuery: (params: TParams, options?: Omit<UseInfiniteQueryOptions<TData, Error, InfiniteData<TData>, string[], string | undefined>, "queryKey" | "queryFn" | "initialPageParam" | "getNextPageParam">) => UseInfiniteQueryResult<InfiniteData<TData>, Error>;
100
+ }
101
+ /**
102
+ * Creates a `useInfiniteQuery`-based hook and its `queryKey` builder for
103
+ * cursor-paginated endpoints.
104
+ */
105
+ declare function createInfiniteQueryHook<TParams, TData extends CursorPaginatedResult>(config: InfiniteQueryHookConfig<TParams, TData>): InfiniteQueryHookReturn<TParams, TData>;
106
+
48
107
  interface SubscriptionOptions {
49
108
  /** Set to `false` to pause the subscription. Defaults to `true`. */
50
109
  enabled?: boolean;
@@ -439,4 +498,4 @@ type DexClientProviderProps = PropsWithChildren<{
439
498
  */
440
499
  declare function DexClientProvider({ client, subscribeClient, queryKeyPrefix, children, }: DexClientProviderProps): react_jsx_runtime.JSX.Element;
441
500
 
442
- export { DEFAULT_QUERY_KEY_PREFIX, DexClientContext, type DexClientContextValue, DexClientProvider, type DexClientProviderProps, type SubscriptionOptions, type UseFinalStretchTokensQueryParams, type UseFinalStretchTokensSubscriptionParams, type UseMigratedTokensQueryParams, type UseMigratedTokensSubscriptionParams, type UseNewTokensQueryParams, type UseNewTokensSubscriptionParams, type UseSearchTokensQueryParams, type UseSendTxMutationParams, type UseStockTokensQueryParams, type UseStockTokensSubscriptionParams, type UseSwapRouteQueryParams, type UseTokenActivitiesQueryParams, type UseTokenActivitiesSubscriptionParams, type UseTokenCandlesQueryParams, type UseTokenCandlesSubscriptionParams, type UseTokenHoldersQueryParams, type UseTokenMarketDataQueryParams, type UseTokenQueryParams, type UseTokenSecurityQueryParams, type UseTokenStatsQueryParams, type UseTokenSubscriptionParams, type UseTokenTradesQueryParams, type UseTokenTradesSubscriptionParams, type UseTokensQueryParams, type UseTrendingTokensQueryParams, type UseTrendingTokensSubscriptionParams, type UseTxSuccessQueryParams, type UseWalletActivitiesQueryParams, type UseWalletActivitiesSubscriptionParams, type UseWalletPnlQueryParams, type UseWalletPnlSubscriptionParams, type UseWalletPortfolioPnlsByTokensQueryParams, type UseWalletPortfolioPnlsInfiniteQueryParams, type UseWalletPortfolioPnlsQueryParams, type UseWalletPortfolioPnlsSubscriptionParams, type UseWalletPortfoliosByTokensQueryParams, type UseWalletPortfoliosInfiniteQueryParams, type UseWalletPortfoliosQueryParams, type UseWalletPortfoliosSubscriptionParams, type UseWalletTradesQueryParams, type UseWalletTradesSubscriptionParams, fetchFinalStretchTokens, fetchMigratedTokens, fetchNewTokens, fetchPresignedUploadUrl, fetchSearchTokens, fetchStockTokens, fetchSwapRoute, fetchToken, fetchTokenActivities, fetchTokenCandles, fetchTokenHolders, fetchTokenMarketData, fetchTokenSecurity, fetchTokenStats, fetchTokenTrades, fetchTokens, fetchTrendingTokens, fetchTxSuccess, fetchWalletActivities, fetchWalletPnl, fetchWalletPortfolioPnls, fetchWalletPortfolioPnlsByTokens, fetchWalletPortfolios, fetchWalletPortfoliosByTokens, fetchWalletTrades, finalStretchTokensQueryKey, migratedTokensQueryKey, newTokensQueryKey, presignedUploadUrlQueryKey, searchTokensQueryKey, sendTx, stockTokensQueryKey, swapRouteQueryKey, toKeySegment, toSortedKeySegment, tokenActivitiesQueryKey, tokenCandlesQueryKey, tokenHoldersQueryKey, tokenMarketDataQueryKey, tokenQueryKey, tokenSecurityQueryKey, tokenStatsQueryKey, tokenTradesQueryKey, tokensQueryKey, trendingTokensQueryKey, txSuccessQueryKey, useDexClient, useFinalStretchTokensQuery, useFinalStretchTokensSubscription, useMigratedTokensQuery, useMigratedTokensSubscription, useNewTokensQuery, useNewTokensSubscription, usePresignedUploadUrlQuery, useSearchTokensQuery, useSendTxMutation, useStockTokensQuery, useStockTokensSubscription, useSwapRouteQuery, useTokenActivitiesQuery, useTokenActivitiesSubscription, useTokenCandlesQuery, useTokenCandlesSubscription, useTokenHoldersQuery, useTokenMarketDataQuery, useTokenQuery, useTokenSecurityQuery, useTokenStatsQuery, useTokenSubscription, useTokenTradesQuery, useTokenTradesSubscription, useTokensQuery, useTrendingTokensQuery, useTrendingTokensSubscription, useTxSuccessQuery, useWalletActivitiesQuery, useWalletActivitiesSubscription, useWalletPnlQuery, useWalletPnlSubscription, useWalletPortfolioPnlsByTokensQuery, useWalletPortfolioPnlsInfiniteQuery, useWalletPortfolioPnlsQuery, useWalletPortfolioPnlsSubscription, useWalletPortfoliosByTokensQuery, useWalletPortfoliosInfiniteQuery, useWalletPortfoliosQuery, useWalletPortfoliosSubscription, useWalletTradesQuery, useWalletTradesSubscription, walletActivitiesQueryKey, walletPnlQueryKey, walletPortfolioPnlsByTokensQueryKey, walletPortfolioPnlsInfiniteQueryKey, walletPortfolioPnlsQueryKey, walletPortfoliosByTokensQueryKey, walletPortfoliosInfiniteQueryKey, walletPortfoliosQueryKey, walletTradesQueryKey };
501
+ export { DEFAULT_QUERY_KEY_PREFIX, DexClientContext, type DexClientContextValue, DexClientProvider, type DexClientProviderProps, type InfiniteQueryHookConfig, type InfiniteQueryHookReturn, type QueryHookConfig, type QueryHookReturn, type SubscriptionOptions, type UseFinalStretchTokensQueryParams, type UseFinalStretchTokensSubscriptionParams, type UseMigratedTokensQueryParams, type UseMigratedTokensSubscriptionParams, type UseNewTokensQueryParams, type UseNewTokensSubscriptionParams, type UseSearchTokensQueryParams, type UseSendTxMutationParams, type UseStockTokensQueryParams, type UseStockTokensSubscriptionParams, type UseSwapRouteQueryParams, type UseTokenActivitiesQueryParams, type UseTokenActivitiesSubscriptionParams, type UseTokenCandlesQueryParams, type UseTokenCandlesSubscriptionParams, type UseTokenHoldersQueryParams, type UseTokenMarketDataQueryParams, type UseTokenQueryParams, type UseTokenSecurityQueryParams, type UseTokenStatsQueryParams, type UseTokenSubscriptionParams, type UseTokenTradesQueryParams, type UseTokenTradesSubscriptionParams, type UseTokensQueryParams, type UseTrendingTokensQueryParams, type UseTrendingTokensSubscriptionParams, type UseTxSuccessQueryParams, type UseWalletActivitiesQueryParams, type UseWalletActivitiesSubscriptionParams, type UseWalletPnlQueryParams, type UseWalletPnlSubscriptionParams, type UseWalletPortfolioPnlsByTokensQueryParams, type UseWalletPortfolioPnlsInfiniteQueryParams, type UseWalletPortfolioPnlsQueryParams, type UseWalletPortfolioPnlsSubscriptionParams, type UseWalletPortfoliosByTokensQueryParams, type UseWalletPortfoliosInfiniteQueryParams, type UseWalletPortfoliosQueryParams, type UseWalletPortfoliosSubscriptionParams, type UseWalletTradesQueryParams, type UseWalletTradesSubscriptionParams, createInfiniteQueryHook, createQueryHook, fetchFinalStretchTokens, fetchMigratedTokens, fetchNewTokens, fetchPresignedUploadUrl, fetchSearchTokens, fetchStockTokens, fetchSwapRoute, fetchToken, fetchTokenActivities, fetchTokenCandles, fetchTokenHolders, fetchTokenMarketData, fetchTokenSecurity, fetchTokenStats, fetchTokenTrades, fetchTokens, fetchTrendingTokens, fetchTxSuccess, fetchWalletActivities, fetchWalletPnl, fetchWalletPortfolioPnls, fetchWalletPortfolioPnlsByTokens, fetchWalletPortfolios, fetchWalletPortfoliosByTokens, fetchWalletTrades, finalStretchTokensQueryKey, migratedTokensQueryKey, newTokensQueryKey, presignedUploadUrlQueryKey, searchTokensQueryKey, sendTx, stockTokensQueryKey, swapRouteQueryKey, toKeySegment, toSortedKeySegment, tokenActivitiesQueryKey, tokenCandlesQueryKey, tokenHoldersQueryKey, tokenMarketDataQueryKey, tokenQueryKey, tokenSecurityQueryKey, tokenStatsQueryKey, tokenTradesQueryKey, tokensQueryKey, trendingTokensQueryKey, txSuccessQueryKey, useDexClient, useFinalStretchTokensQuery, useFinalStretchTokensSubscription, useMigratedTokensQuery, useMigratedTokensSubscription, useNewTokensQuery, useNewTokensSubscription, usePresignedUploadUrlQuery, useSearchTokensQuery, useSendTxMutation, useStockTokensQuery, useStockTokensSubscription, useSwapRouteQuery, useTokenActivitiesQuery, useTokenActivitiesSubscription, useTokenCandlesQuery, useTokenCandlesSubscription, useTokenHoldersQuery, useTokenMarketDataQuery, useTokenQuery, useTokenSecurityQuery, useTokenStatsQuery, useTokenSubscription, useTokenTradesQuery, useTokenTradesSubscription, useTokensQuery, useTrendingTokensQuery, useTrendingTokensSubscription, useTxSuccessQuery, useWalletActivitiesQuery, useWalletActivitiesSubscription, useWalletPnlQuery, useWalletPnlSubscription, useWalletPortfolioPnlsByTokensQuery, useWalletPortfolioPnlsInfiniteQuery, useWalletPortfolioPnlsQuery, useWalletPortfolioPnlsSubscription, useWalletPortfoliosByTokensQuery, useWalletPortfoliosInfiniteQuery, useWalletPortfoliosQuery, useWalletPortfoliosSubscription, useWalletTradesQuery, useWalletTradesSubscription, walletActivitiesQueryKey, walletPnlQueryKey, walletPortfolioPnlsByTokensQueryKey, walletPortfolioPnlsInfiniteQueryKey, walletPortfolioPnlsQueryKey, walletPortfoliosByTokensQueryKey, walletPortfoliosInfiniteQueryKey, walletPortfoliosQueryKey, walletTradesQueryKey };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var react=require('react'),reactQuery=require('@tanstack/react-query'),jsxRuntime=require('react/jsx-runtime');typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/react"]="0.1.10");var y="liberfi",d=react.createContext(null);function a(){let e=react.useContext(d);if(e===null)throw new Error("useDexClient must be used within a DexClientProvider");return e}function i(e){return e==null?"":e instanceof Date?e.toISOString():String(e)}function c(e){return !e||e.length===0?"[]":JSON.stringify([...e].sort())}function s(e){function r(n,l=y){return [l,e.name,...e.queryKey(n)]}function t(n,l){return e.fetch(n,l)}function o(n,l={}){let{client:m,queryKeyPrefix:f}=a();return reactQuery.useQuery({queryKey:r(n,f),queryFn:()=>e.fetch(m,n),...e.defaultOptions,...l})}return {queryKey:r,fetch:t,useQuery:o}}var {queryKey:L,fetch:N,useQuery:G}=s({name:"finalStretchTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getFinalStretchTokens(r,t)});var {queryKey:J,fetch:j,useQuery:z}=s({name:"migratedTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getMigratedTokens(r,t)});var {queryKey:re,fetch:te,useQuery:oe}=s({name:"newTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getNewTokens(r,t)});function b(e=y){return [e,"presignedUploadUrl"]}async function S(e){return await e.getPresignedUploadUrl()}function ce(e={}){let{client:r,queryKeyPrefix:t}=a();return reactQuery.useQuery({queryKey:b(t),queryFn:async()=>S(r),staleTime:0,...e})}var {queryKey:me,fetch:de,useQuery:pe}=s({name:"searchTokens",queryKey:e=>[i(e.cursor),i(e.limit),i(e.direction),c(e.chains),i(e.keyword),c(e.filters),i(e.sortBy),i(e.sortDirection)],fetch:(e,r)=>e.searchTokens(r)});async function C(e,r){return await e.sendTx(r)}function xe(e={}){let{client:r}=a();return reactQuery.useMutation({mutationFn:async t=>C(r,t),...e})}var {queryKey:Ce,fetch:ge,useQuery:Ae}=s({name:"stockTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getStockTokens(r,t)});var {queryKey:De,fetch:qe,useQuery:We}=s({name:"swapRoute",queryKey:e=>[e.chain,e.userAddress,e.input,e.output,e.mode,e.amount,i(e.slippage),i(e.priorityFee),i(e.tipFee),i(e.isAntiMev)],fetch:(e,r)=>e.swapRoute(r)});var {queryKey:ve,fetch:He,useQuery:Re}=s({name:"tokenCandles",queryKey:e=>[e.chain,e.address,e.resolution,i(e.after),i(e.before),i(e.limit)],fetch:(e,{chain:r,address:t,resolution:o,...n})=>e.getTokenCandles(r,t,o,n)});var {queryKey:Me,fetch:Le,useQuery:Ne}=s({name:"tokenHolders",queryKey:e=>[e.chain,e.address,i(e.cursor),i(e.limit),i(e.direction)],fetch:(e,{chain:r,address:t,...o})=>e.getTokenHolders(r,t,o)});var {queryKey:Ye,fetch:Xe,useQuery:Je}=s({name:"tokenMarketData",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getTokenMarketData(r.chain,r.address)});var {queryKey:Ze,fetch:$e,useQuery:er}=s({name:"token",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getToken(r.chain,r.address)});var {queryKey:or,fetch:ir,useQuery:nr}=s({name:"tokenSecurity",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getTokenSecurity(r.chain,r.address)});var {queryKey:ur,fetch:cr,useQuery:fr}=s({name:"tokens",queryKey:e=>[e.chain,[...e.addresses].sort().join(",")],fetch:(e,r)=>e.getTokens(r.chain,r.addresses)});var {queryKey:mr,fetch:dr,useQuery:pr}=s({name:"tokenStats",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getTokenStats(r.chain,r.address)});var {queryKey:kr,fetch:xr,useQuery:br}=s({name:"tokenTrades",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getTokenTrades(r,t,o)});var {queryKey:gr,fetch:Ar,useQuery:Kr}=s({name:"trendingTokens",queryKey:e=>[e.chain,e.resolution,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,resolution:t,...o})=>e.getTrendingTokens(r,t,o)});var {queryKey:qr,fetch:Wr,useQuery:Or}=s({name:"txSuccess",queryKey:e=>[e.chain,e.txHash,i(e.timeout)],fetch:(e,{chain:r,txHash:t,timeout:o})=>e.checkTxSuccess(r,t,o)});var {queryKey:Hr,fetch:Rr,useQuery:Fr}=s({name:"walletPnl",queryKey:e=>[e.chain,e.address,i(e.resolution??"all")],fetch:(e,{chain:r,address:t,resolution:o})=>e.getWalletPnl(r,t,o)});var {queryKey:Lr,fetch:Nr,useQuery:Gr}=s({name:"walletPortfolioPnls",queryKey:e=>[e.chain,e.address,i(e.cursor),i(e.limit)],fetch:(e,{chain:r,address:t,cursor:o,limit:n})=>e.getWalletPortfolioPnls(r,t,{cursor:o,limit:n})});function p(e){function r(o,n=y){return [n,e.name,"infinite",...e.queryKey(o)]}function t(o,n={}){let{client:l,queryKeyPrefix:m}=a();return reactQuery.useInfiniteQuery({queryKey:r(o,m),queryFn:({pageParam:f})=>e.fetch(l,o,f),initialPageParam:void 0,getNextPageParam:f=>f.hasNext?f.endCursor:void 0,...n})}return {queryKey:r,useInfiniteQuery:t}}var {queryKey:$r,useInfiniteQuery:et}=p({name:"walletPortfolioPnls",queryKey:e=>[e.chain,e.address,i(e.limit)],fetch:(e,r,t)=>e.getWalletPortfolioPnls(r.chain,r.address,{cursor:t,limit:r.limit??100})});var {queryKey:it,fetch:nt,useQuery:st}=s({name:"walletPortfolios",queryKey:e=>[e.chain,e.address,i(e.cursor),i(e.limit)],fetch:(e,{chain:r,address:t,cursor:o,limit:n})=>e.getWalletPortfolios(r,t,{cursor:o,limit:n})});var {queryKey:ct,fetch:ft,useQuery:lt}=s({name:"walletPortfoliosByTokens",queryKey:e=>[e.chain,e.address,...[...e.tokenAddresses].sort()],fetch:(e,{chain:r,address:t,tokenAddresses:o})=>e.getWalletPortfoliosByTokens(r,t,o)});var {queryKey:pt,useInfiniteQuery:Pt}=p({name:"walletPortfolios",queryKey:e=>[e.chain,e.address,i(e.limit)],fetch:(e,r,t)=>e.getWalletPortfolios(r.chain,r.address,{cursor:t,limit:r.limit??100})});var {queryKey:kt,fetch:xt,useQuery:bt}=s({name:"walletPortfolioPnlsByTokens",queryKey:e=>[e.chain,e.address,...[...e.tokenAddresses].sort()],fetch:(e,{chain:r,address:t,tokenAddresses:o})=>e.getWalletPortfolioPnlsByTokens(r,t,o)});var {queryKey:gt,fetch:At,useQuery:Kt}=s({name:"walletTrades",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getWalletTrades(r,t,o)});var {queryKey:qt,fetch:Wt,useQuery:Ot}=s({name:"tokenActivities",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getTokenActivities(r,t,o)});var {queryKey:Ht,fetch:Rt,useQuery:Ft}=s({name:"walletActivities",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getWalletActivities(r,t,o)});function u(e,r,t,o){let n=react.useRef(r);n.current=r;let l=react.useRef(o?.onError);l.current=o?.onError,react.useEffect(()=>{if(o?.enabled===false)return;let m;try{m=e(f=>n.current(f));}catch(f){l.current?.(f instanceof Error?f:new Error(String(f)));}return ()=>m?.unsubscribe()},t);}function Gt(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeToken(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Jt(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTokenCandles(e.chain,e.address,e.resolution,n),r,[o,e.chain,e.address,e.resolution,t?.enabled],t);}function $t(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTokenTrades(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function oo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletPnl(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function ao(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletPortfolios(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function lo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletPortfolioPnls(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Po(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletTrades(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function xo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTokenActivities(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Co(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletActivities(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Io(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeNewTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function Wo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTrendingTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function vo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeMigratedTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function _o(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeFinalStretchTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function No(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeStockTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function Bi({client:e,subscribeClient:r,queryKeyPrefix:t=y,children:o}){let n=react.useMemo(()=>({client:e,subscribeClient:r,queryKeyPrefix:t}),[e,r,t]);return jsxRuntime.jsx(d.Provider,{value:n,children:o})}exports.DEFAULT_QUERY_KEY_PREFIX=y;exports.DexClientContext=d;exports.DexClientProvider=Bi;exports.fetchFinalStretchTokens=N;exports.fetchMigratedTokens=j;exports.fetchNewTokens=te;exports.fetchPresignedUploadUrl=S;exports.fetchSearchTokens=de;exports.fetchStockTokens=ge;exports.fetchSwapRoute=qe;exports.fetchToken=$e;exports.fetchTokenActivities=Wt;exports.fetchTokenCandles=He;exports.fetchTokenHolders=Le;exports.fetchTokenMarketData=Xe;exports.fetchTokenSecurity=ir;exports.fetchTokenStats=dr;exports.fetchTokenTrades=xr;exports.fetchTokens=cr;exports.fetchTrendingTokens=Ar;exports.fetchTxSuccess=Wr;exports.fetchWalletActivities=Rt;exports.fetchWalletPnl=Rr;exports.fetchWalletPortfolioPnls=Nr;exports.fetchWalletPortfolioPnlsByTokens=xt;exports.fetchWalletPortfolios=nt;exports.fetchWalletPortfoliosByTokens=ft;exports.fetchWalletTrades=At;exports.finalStretchTokensQueryKey=L;exports.migratedTokensQueryKey=J;exports.newTokensQueryKey=re;exports.presignedUploadUrlQueryKey=b;exports.searchTokensQueryKey=me;exports.sendTx=C;exports.stockTokensQueryKey=Ce;exports.swapRouteQueryKey=De;exports.toKeySegment=i;exports.toSortedKeySegment=c;exports.tokenActivitiesQueryKey=qt;exports.tokenCandlesQueryKey=ve;exports.tokenHoldersQueryKey=Me;exports.tokenMarketDataQueryKey=Ye;exports.tokenQueryKey=Ze;exports.tokenSecurityQueryKey=or;exports.tokenStatsQueryKey=mr;exports.tokenTradesQueryKey=kr;exports.tokensQueryKey=ur;exports.trendingTokensQueryKey=gr;exports.txSuccessQueryKey=qr;exports.useDexClient=a;exports.useFinalStretchTokensQuery=G;exports.useFinalStretchTokensSubscription=_o;exports.useMigratedTokensQuery=z;exports.useMigratedTokensSubscription=vo;exports.useNewTokensQuery=oe;exports.useNewTokensSubscription=Io;exports.usePresignedUploadUrlQuery=ce;exports.useSearchTokensQuery=pe;exports.useSendTxMutation=xe;exports.useStockTokensQuery=Ae;exports.useStockTokensSubscription=No;exports.useSwapRouteQuery=We;exports.useTokenActivitiesQuery=Ot;exports.useTokenActivitiesSubscription=xo;exports.useTokenCandlesQuery=Re;exports.useTokenCandlesSubscription=Jt;exports.useTokenHoldersQuery=Ne;exports.useTokenMarketDataQuery=Je;exports.useTokenQuery=er;exports.useTokenSecurityQuery=nr;exports.useTokenStatsQuery=pr;exports.useTokenSubscription=Gt;exports.useTokenTradesQuery=br;exports.useTokenTradesSubscription=$t;exports.useTokensQuery=fr;exports.useTrendingTokensQuery=Kr;exports.useTrendingTokensSubscription=Wo;exports.useTxSuccessQuery=Or;exports.useWalletActivitiesQuery=Ft;exports.useWalletActivitiesSubscription=Co;exports.useWalletPnlQuery=Fr;exports.useWalletPnlSubscription=oo;exports.useWalletPortfolioPnlsByTokensQuery=bt;exports.useWalletPortfolioPnlsInfiniteQuery=et;exports.useWalletPortfolioPnlsQuery=Gr;exports.useWalletPortfolioPnlsSubscription=lo;exports.useWalletPortfoliosByTokensQuery=lt;exports.useWalletPortfoliosInfiniteQuery=Pt;exports.useWalletPortfoliosQuery=st;exports.useWalletPortfoliosSubscription=ao;exports.useWalletTradesQuery=Kt;exports.useWalletTradesSubscription=Po;exports.walletActivitiesQueryKey=Ht;exports.walletPnlQueryKey=Hr;exports.walletPortfolioPnlsByTokensQueryKey=kt;exports.walletPortfolioPnlsInfiniteQueryKey=$r;exports.walletPortfolioPnlsQueryKey=Lr;exports.walletPortfoliosByTokensQueryKey=ct;exports.walletPortfoliosInfiniteQueryKey=pt;exports.walletPortfoliosQueryKey=it;exports.walletTradesQueryKey=gt;//# sourceMappingURL=index.js.map
1
+ 'use strict';var react=require('react'),reactQuery=require('@tanstack/react-query'),jsxRuntime=require('react/jsx-runtime');typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/react"]="0.1.12");var y="liberfi",p=react.createContext(null);function a(){let e=react.useContext(p);if(e===null)throw new Error("useDexClient must be used within a DexClientProvider");return e}function s(e){function r(n,l=y){return [l,e.name,...e.queryKey(n)]}function t(n,l){return e.fetch(n,l)}function o(n,l={}){let{client:m,queryKeyPrefix:f}=a();return reactQuery.useQuery({queryKey:r(n,f),queryFn:()=>e.fetch(m,n),...e.defaultOptions,...l})}return {queryKey:r,fetch:t,useQuery:o}}function d(e){function r(o,n=y){return [n,e.name,"infinite",...e.queryKey(o)]}function t(o,n={}){let{client:l,queryKeyPrefix:m}=a();return reactQuery.useInfiniteQuery({queryKey:r(o,m),queryFn:({pageParam:f})=>e.fetch(l,o,f),initialPageParam:void 0,getNextPageParam:f=>f.hasNext?f.endCursor:void 0,...n})}return {queryKey:r,useInfiniteQuery:t}}function i(e){return e==null?"":e instanceof Date?e.toISOString():String(e)}function c(e){return !e||e.length===0?"[]":JSON.stringify([...e].sort())}var {queryKey:Y,fetch:X,useQuery:J}=s({name:"finalStretchTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getFinalStretchTokens(r,t)});var {queryKey:$,fetch:ee,useQuery:re}=s({name:"migratedTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getMigratedTokens(r,t)});var {queryKey:ne,fetch:se,useQuery:ae}=s({name:"newTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getNewTokens(r,t)});function S(e=y){return [e,"presignedUploadUrl"]}async function Q(e){return await e.getPresignedUploadUrl()}function me(e={}){let{client:r,queryKeyPrefix:t}=a();return reactQuery.useQuery({queryKey:S(t),queryFn:async()=>Q(r),staleTime:0,...e})}var {queryKey:he,fetch:Te,useQuery:ke}=s({name:"searchTokens",queryKey:e=>[i(e.cursor),i(e.limit),i(e.direction),c(e.chains),i(e.keyword),c(e.filters),i(e.sortBy),i(e.sortDirection)],fetch:(e,r)=>e.searchTokens(r)});async function g(e,r){return await e.sendTx(r)}function Ce(e={}){let{client:r}=a();return reactQuery.useMutation({mutationFn:async t=>g(r,t),...e})}var {queryKey:Ie,fetch:Ue,useQuery:De}=s({name:"stockTokens",queryKey:e=>[e.chain,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,...t})=>e.getStockTokens(r,t)});var {queryKey:we,fetch:Ee,useQuery:He}=s({name:"swapRoute",queryKey:e=>[e.chain,e.userAddress,e.input,e.output,e.mode,e.amount,i(e.slippage),i(e.priorityFee),i(e.tipFee),i(e.isAntiMev)],fetch:(e,r)=>e.swapRoute(r)});var {queryKey:_e,fetch:Be,useQuery:Me}=s({name:"tokenCandles",queryKey:e=>[e.chain,e.address,e.resolution,i(e.after),i(e.before),i(e.limit)],fetch:(e,{chain:r,address:t,resolution:o,...n})=>e.getTokenCandles(r,t,o,n)});var {queryKey:Ve,fetch:Ye,useQuery:Xe}=s({name:"tokenHolders",queryKey:e=>[e.chain,e.address,i(e.cursor),i(e.limit),i(e.direction)],fetch:(e,{chain:r,address:t,...o})=>e.getTokenHolders(r,t,o)});var {queryKey:ze,fetch:Ze,useQuery:$e}=s({name:"tokenMarketData",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getTokenMarketData(r.chain,r.address)});var {queryKey:tr,fetch:or,useQuery:ir}=s({name:"token",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getToken(r.chain,r.address)});var {queryKey:ar,fetch:ur,useQuery:cr}=s({name:"tokenSecurity",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getTokenSecurity(r.chain,r.address)});var {queryKey:yr,fetch:mr,useQuery:dr}=s({name:"tokens",queryKey:e=>[e.chain,[...e.addresses].sort().join(",")],fetch:(e,r)=>e.getTokens(r.chain,r.addresses)});var {queryKey:hr,fetch:Tr,useQuery:kr}=s({name:"tokenStats",queryKey:e=>[e.chain,e.address],fetch:(e,r)=>e.getTokenStats(r.chain,r.address)});var {queryKey:Qr,fetch:Cr,useQuery:gr}=s({name:"tokenTrades",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getTokenTrades(r,t,o)});var {queryKey:Ur,fetch:Dr,useQuery:qr}=s({name:"trendingTokens",queryKey:e=>[e.chain,e.resolution,i(e.sortBy),i(e.sortDirection),c(e.keywords),c(e.excludeKeywords),c(e.filters)],fetch:(e,{chain:r,resolution:t,...o})=>e.getTrendingTokens(r,t,o)});var {queryKey:Er,fetch:Hr,useQuery:vr}=s({name:"txSuccess",queryKey:e=>[e.chain,e.txHash,i(e.timeout)],fetch:(e,{chain:r,txHash:t,timeout:o})=>e.checkTxSuccess(r,t,o)});var {queryKey:Br,fetch:Mr,useQuery:Lr}=s({name:"walletPnl",queryKey:e=>[e.chain,e.address,i(e.resolution??"all")],fetch:(e,{chain:r,address:t,resolution:o})=>e.getWalletPnl(r,t,o)});var {queryKey:Yr,fetch:Xr,useQuery:Jr}=s({name:"walletPortfolioPnls",queryKey:e=>[e.chain,e.address,i(e.cursor),i(e.limit)],fetch:(e,{chain:r,address:t,cursor:o,limit:n})=>e.getWalletPortfolioPnls(r,t,{cursor:o,limit:n})});var {queryKey:$r,useInfiniteQuery:et}=d({name:"walletPortfolioPnls",queryKey:e=>[e.chain,e.address,i(e.limit)],fetch:(e,r,t)=>e.getWalletPortfolioPnls(r.chain,r.address,{cursor:t,limit:r.limit??100})});var {queryKey:it,fetch:nt,useQuery:st}=s({name:"walletPortfolios",queryKey:e=>[e.chain,e.address,i(e.cursor),i(e.limit)],fetch:(e,{chain:r,address:t,cursor:o,limit:n})=>e.getWalletPortfolios(r,t,{cursor:o,limit:n})});var {queryKey:ct,fetch:ft,useQuery:lt}=s({name:"walletPortfoliosByTokens",queryKey:e=>[e.chain,e.address,...[...e.tokenAddresses].sort()],fetch:(e,{chain:r,address:t,tokenAddresses:o})=>e.getWalletPortfoliosByTokens(r,t,o)});var {queryKey:pt,useInfiniteQuery:Pt}=d({name:"walletPortfolios",queryKey:e=>[e.chain,e.address,i(e.limit)],fetch:(e,r,t)=>e.getWalletPortfolios(r.chain,r.address,{cursor:t,limit:r.limit??100})});var {queryKey:kt,fetch:xt,useQuery:bt}=s({name:"walletPortfolioPnlsByTokens",queryKey:e=>[e.chain,e.address,...[...e.tokenAddresses].sort()],fetch:(e,{chain:r,address:t,tokenAddresses:o})=>e.getWalletPortfolioPnlsByTokens(r,t,o)});var {queryKey:gt,fetch:At,useQuery:Kt}=s({name:"walletTrades",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getWalletTrades(r,t,o)});var {queryKey:qt,fetch:Wt,useQuery:Ot}=s({name:"tokenActivities",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getTokenActivities(r,t,o)});var {queryKey:vt,fetch:Rt,useQuery:Ft}=s({name:"walletActivities",queryKey:e=>[e.chain,e.address,i(e.before),i(e.after),i(e.beforeBlockHeight),i(e.afterBlockHeight),i(e.type),i(e.poolAddress)],fetch:(e,{chain:r,address:t,...o})=>e.getWalletActivities(r,t,o)});function u(e,r,t,o){let n=react.useRef(r);n.current=r;let l=react.useRef(o?.onError);l.current=o?.onError,react.useEffect(()=>{if(o?.enabled===false)return;let m;try{m=e(f=>n.current(f));}catch(f){l.current?.(f instanceof Error?f:new Error(String(f)));}return ()=>m?.unsubscribe()},t);}function Gt(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeToken(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Jt(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTokenCandles(e.chain,e.address,e.resolution,n),r,[o,e.chain,e.address,e.resolution,t?.enabled],t);}function $t(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTokenTrades(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function oo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletPnl(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function ao(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletPortfolios(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function lo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletPortfolioPnls(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Po(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletTrades(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function xo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTokenActivities(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Co(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeWalletActivities(e.chain,e.address,n),r,[o,e.chain,e.address,t?.enabled],t);}function Io(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeNewTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function Wo(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeTrendingTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function Ho(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeMigratedTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function _o(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeFinalStretchTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function No(e,r,t){let{subscribeClient:o}=a();u(n=>o.subscribeStockTokens(e.chain,n),r,[o,e.chain,t?.enabled],t);}function Li({client:e,subscribeClient:r,queryKeyPrefix:t=y,children:o}){let n=react.useMemo(()=>({client:e,subscribeClient:r,queryKeyPrefix:t}),[e,r,t]);return jsxRuntime.jsx(p.Provider,{value:n,children:o})}exports.DEFAULT_QUERY_KEY_PREFIX=y;exports.DexClientContext=p;exports.DexClientProvider=Li;exports.createInfiniteQueryHook=d;exports.createQueryHook=s;exports.fetchFinalStretchTokens=X;exports.fetchMigratedTokens=ee;exports.fetchNewTokens=se;exports.fetchPresignedUploadUrl=Q;exports.fetchSearchTokens=Te;exports.fetchStockTokens=Ue;exports.fetchSwapRoute=Ee;exports.fetchToken=or;exports.fetchTokenActivities=Wt;exports.fetchTokenCandles=Be;exports.fetchTokenHolders=Ye;exports.fetchTokenMarketData=Ze;exports.fetchTokenSecurity=ur;exports.fetchTokenStats=Tr;exports.fetchTokenTrades=Cr;exports.fetchTokens=mr;exports.fetchTrendingTokens=Dr;exports.fetchTxSuccess=Hr;exports.fetchWalletActivities=Rt;exports.fetchWalletPnl=Mr;exports.fetchWalletPortfolioPnls=Xr;exports.fetchWalletPortfolioPnlsByTokens=xt;exports.fetchWalletPortfolios=nt;exports.fetchWalletPortfoliosByTokens=ft;exports.fetchWalletTrades=At;exports.finalStretchTokensQueryKey=Y;exports.migratedTokensQueryKey=$;exports.newTokensQueryKey=ne;exports.presignedUploadUrlQueryKey=S;exports.searchTokensQueryKey=he;exports.sendTx=g;exports.stockTokensQueryKey=Ie;exports.swapRouteQueryKey=we;exports.toKeySegment=i;exports.toSortedKeySegment=c;exports.tokenActivitiesQueryKey=qt;exports.tokenCandlesQueryKey=_e;exports.tokenHoldersQueryKey=Ve;exports.tokenMarketDataQueryKey=ze;exports.tokenQueryKey=tr;exports.tokenSecurityQueryKey=ar;exports.tokenStatsQueryKey=hr;exports.tokenTradesQueryKey=Qr;exports.tokensQueryKey=yr;exports.trendingTokensQueryKey=Ur;exports.txSuccessQueryKey=Er;exports.useDexClient=a;exports.useFinalStretchTokensQuery=J;exports.useFinalStretchTokensSubscription=_o;exports.useMigratedTokensQuery=re;exports.useMigratedTokensSubscription=Ho;exports.useNewTokensQuery=ae;exports.useNewTokensSubscription=Io;exports.usePresignedUploadUrlQuery=me;exports.useSearchTokensQuery=ke;exports.useSendTxMutation=Ce;exports.useStockTokensQuery=De;exports.useStockTokensSubscription=No;exports.useSwapRouteQuery=He;exports.useTokenActivitiesQuery=Ot;exports.useTokenActivitiesSubscription=xo;exports.useTokenCandlesQuery=Me;exports.useTokenCandlesSubscription=Jt;exports.useTokenHoldersQuery=Xe;exports.useTokenMarketDataQuery=$e;exports.useTokenQuery=ir;exports.useTokenSecurityQuery=cr;exports.useTokenStatsQuery=kr;exports.useTokenSubscription=Gt;exports.useTokenTradesQuery=gr;exports.useTokenTradesSubscription=$t;exports.useTokensQuery=dr;exports.useTrendingTokensQuery=qr;exports.useTrendingTokensSubscription=Wo;exports.useTxSuccessQuery=vr;exports.useWalletActivitiesQuery=Ft;exports.useWalletActivitiesSubscription=Co;exports.useWalletPnlQuery=Lr;exports.useWalletPnlSubscription=oo;exports.useWalletPortfolioPnlsByTokensQuery=bt;exports.useWalletPortfolioPnlsInfiniteQuery=et;exports.useWalletPortfolioPnlsQuery=Jr;exports.useWalletPortfolioPnlsSubscription=lo;exports.useWalletPortfoliosByTokensQuery=lt;exports.useWalletPortfoliosInfiniteQuery=Pt;exports.useWalletPortfoliosQuery=st;exports.useWalletPortfoliosSubscription=ao;exports.useWalletTradesQuery=Kt;exports.useWalletTradesSubscription=Po;exports.walletActivitiesQueryKey=vt;exports.walletPnlQueryKey=Br;exports.walletPortfolioPnlsByTokensQueryKey=kt;exports.walletPortfolioPnlsInfiniteQueryKey=$r;exports.walletPortfolioPnlsQueryKey=Yr;exports.walletPortfoliosByTokensQueryKey=ct;exports.walletPortfoliosInfiniteQueryKey=pt;exports.walletPortfoliosQueryKey=it;exports.walletTradesQueryKey=gt;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map