@sudobility/heavymath_indexer_client 0.0.3 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +44 -341
  2. package/dist/business/index.js.map +1 -1
  3. package/dist/business/indexer-service.d.ts +14 -13
  4. package/dist/business/indexer-service.d.ts.map +1 -1
  5. package/dist/business/indexer-service.js +10 -0
  6. package/dist/business/indexer-service.js.map +1 -1
  7. package/dist/hooks/index.js.map +1 -1
  8. package/dist/hooks/useDealers.d.ts +8 -8
  9. package/dist/hooks/useDealers.d.ts.map +1 -1
  10. package/dist/hooks/useDealers.js.map +1 -1
  11. package/dist/hooks/useFavorites.d.ts +1 -1
  12. package/dist/hooks/useFavorites.d.ts.map +1 -1
  13. package/dist/hooks/useFavorites.js.map +1 -1
  14. package/dist/hooks/useMarkets.d.ts +9 -9
  15. package/dist/hooks/useMarkets.d.ts.map +1 -1
  16. package/dist/hooks/useMarkets.js.map +1 -1
  17. package/dist/hooks/useOracle.d.ts +6 -6
  18. package/dist/hooks/useOracle.d.ts.map +1 -1
  19. package/dist/hooks/useOracle.js.map +1 -1
  20. package/dist/hooks/usePredictions.d.ts +8 -8
  21. package/dist/hooks/usePredictions.d.ts.map +1 -1
  22. package/dist/hooks/usePredictions.js.map +1 -1
  23. package/dist/hooks/useSSE.js.map +1 -1
  24. package/dist/hooks/useStats.d.ts +3 -3
  25. package/dist/hooks/useStats.d.ts.map +1 -1
  26. package/dist/hooks/useStats.js.map +1 -1
  27. package/dist/hooks/useWithdrawals.d.ts +5 -5
  28. package/dist/hooks/useWithdrawals.d.ts.map +1 -1
  29. package/dist/hooks/useWithdrawals.js.map +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/network/IndexerClient.d.ts +16 -16
  32. package/dist/network/IndexerClient.d.ts.map +1 -1
  33. package/dist/network/IndexerClient.js +3 -2
  34. package/dist/network/IndexerClient.js.map +1 -1
  35. package/dist/network/index.js.map +1 -1
  36. package/dist/stores/favorites-store.js.map +1 -1
  37. package/dist/stores/index.js.map +1 -1
  38. package/dist/types.d.ts.map +1 -1
  39. package/dist/types.js.map +1 -1
  40. package/package.json +15 -11
package/README.md CHANGED
@@ -1,380 +1,83 @@
1
- # @heavymath/indexer_client
1
+ # @sudobility/heavymath_indexer_client
2
2
 
3
- TypeScript client library for the Heavymath Prediction Market Indexer API. Provides React hooks, business services, and low-level API clients for querying prediction market data.
4
-
5
- ## Features
6
-
7
- - **Full API Coverage** - All REST endpoints supported
8
- - **React Hooks** - Built-in hooks using @tanstack/react-query
9
- - **Business Services** - High-level services with caching
10
- - **Network Layer** - Low-level API client for custom integrations
11
- - **TypeScript First** - Full type definitions included
12
- - **React Native Compatible** - Works in React Native environments
13
- - **Dependency Injection** - Uses NetworkClient from @sudobility/di
3
+ React and React Native compatible client library for the Heavymath prediction market indexer API. Provides a four-layer architecture (hooks, stores, business, network) with React Query integration, Zustand stores for optimistic updates, and SSE real-time subscriptions.
14
4
 
15
5
  ## Installation
16
6
 
17
7
  ```bash
18
- npm install @heavymath/indexer_client
8
+ bun add @sudobility/heavymath_indexer_client
19
9
  ```
20
10
 
21
- ## Peer Dependencies
11
+ ### Peer Dependencies
22
12
 
23
13
  ```bash
24
- npm install react @tanstack/react-query @sudobility/types @sudobility/heavymath_types @sudobility/di
14
+ bun add react @tanstack/react-query zustand @sudobility/types @sudobility/heavymath_types
25
15
  ```
26
16
 
27
- ## Quick Start
28
-
29
- ### 1. Setup React Query Provider
17
+ ## Usage
30
18
 
31
- ```tsx
32
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
19
+ ```typescript
20
+ import { IndexerClient, useActiveMarkets, useFavorites } from '@sudobility/heavymath_indexer_client';
33
21
 
34
- const queryClient = new QueryClient();
22
+ // Create client with injected NetworkClient
23
+ const client = new IndexerClient('http://localhost:42069', networkClient);
35
24
 
36
- function App() {
37
- return (
38
- <QueryClientProvider client={queryClient}>
39
- <YourApp />
40
- </QueryClientProvider>
41
- );
25
+ // Use hooks in React components
26
+ function Dashboard({ wallet }) {
27
+ const { data: markets } = useActiveMarkets(client, 20);
28
+ const { favorites, addFavorite, removeFavorite } = useFavorites(client, wallet);
29
+ // ...
42
30
  }
43
31
  ```
44
32
 
45
- ### 2. Create IndexerClient with NetworkClient
46
-
47
- ```tsx
48
- import { useMemo } from 'react';
49
- import { useNetworkService } from '@sudobility/di'; // Or your DI container
50
- import { IndexerClient } from '@heavymath/indexer_client';
51
-
52
- // Create a hook to provide IndexerClient
53
- function useIndexerClient() {
54
- const networkClient = useNetworkService();
55
- return useMemo(
56
- () => new IndexerClient('http://localhost:42069', networkClient),
57
- [networkClient]
58
- );
59
- }
60
- ```
33
+ ## Available Hooks
61
34
 
62
- ### 3. Use Hooks in Your Components
35
+ ### Markets
36
+ `useMarkets`, `useActiveMarkets`, `useMarket`, `useMarketPredictions`, `useMarketHistory`, `useMarketDetails`
63
37
 
64
- ```tsx
65
- import { useActiveMarkets, useUserPredictions } from '@heavymath/indexer_client';
38
+ ### Predictions
39
+ `usePredictions`, `useUserPredictions`, `useActiveBets`, `usePastBets`, `usePrediction`, `useUserBettingHistory`
66
40
 
67
- function BettorDashboard({ wallet }: { wallet: string }) {
68
- const client = useIndexerClient();
41
+ ### Dealers
42
+ `useDealers`, `useIsDealer`, `useDealerNFTs`, `useDealer`, `useDealerPermissions`, `useDealerMarkets`, `useDealerDashboard`
69
43
 
70
- const { data: markets, isLoading: marketsLoading } = useActiveMarkets(client, 20);
71
- const { data: myBets, isLoading: betsLoading } = useUserPredictions(client, wallet);
44
+ ### Withdrawals / Oracle
45
+ `useWithdrawals`, `useDealerWithdrawals`, `useSystemWithdrawals`, `useMarketWithdrawals`, `useOracleRequests`, `useOracleRequest`, `useMarketOracle`
72
46
 
73
- if (marketsLoading || betsLoading) return <div>Loading...</div>;
47
+ ### Favorites (with Zustand optimistic updates)
48
+ `useFavorites`, `useCategoryFavorites`, `useIsFavorite`
74
49
 
75
- return (
76
- <div>
77
- <h2>Active Markets</h2>
78
- {markets?.data?.map(market => (
79
- <MarketCard key={market.id} market={market} />
80
- ))}
50
+ ### SSE (real-time)
51
+ `useSSE`, `useMarketUpdates`, `useAllMarketUpdates`, `useUserPredictionUpdates`
81
52
 
82
- <h2>My Bets</h2>
83
- {myBets?.data?.map(bet => (
84
- <BetCard key={bet.id} bet={bet} />
85
- ))}
86
- </div>
87
- );
88
- }
89
- ```
53
+ ### Stats
54
+ `useMarketStats`, `useHealth`
90
55
 
91
56
  ## Architecture
92
57
 
93
- The library is organized into three layers:
94
-
95
- ### 1. Network Layer
96
-
97
- Low-level API client that accepts a `NetworkClient` instance.
98
-
99
- ```tsx
100
- import type { NetworkClient } from '@sudobility/types';
101
- import { IndexerClient } from '@heavymath/indexer_client';
102
-
103
- // Get NetworkClient from your DI container
104
- const networkClient: NetworkClient = getNetworkService();
105
-
106
- const client = new IndexerClient('http://localhost:42069', networkClient);
107
-
108
- // Direct API calls
109
- const markets = await client.getMarkets({ status: 'Active', limit: 10 });
110
- const market = await client.getMarket('1-market-123');
111
- ```
112
-
113
- ### 2. Business Layer
114
-
115
- High-level services with caching and business logic.
116
-
117
- ```tsx
118
- import type { NetworkClient } from '@sudobility/types';
119
- import { IndexerService } from '@heavymath/indexer_client';
120
-
121
- const networkClient: NetworkClient = getNetworkService();
122
-
123
- const service = new IndexerService({
124
- indexerUrl: 'http://localhost:42069',
125
- networkClient,
126
- cacheTTL: 5 * 60 * 1000, // 5 minutes (optional)
127
- });
128
-
129
- // Business methods with caching
130
- const activeMarkets = await service.getActiveMarkets(20);
131
- const userPredictions = await service.getUserPredictions('0x123...');
132
- const dealerDashboard = await service.getDealerDashboard('0x123...');
133
- ```
134
-
135
- ### 3. Hooks Layer
136
-
137
- React hooks using @tanstack/react-query for data fetching.
138
-
139
- ```tsx
140
- import { useActiveMarkets, useUserPredictions, useDealerDashboard } from '@heavymath/indexer_client';
141
-
142
- // All hooks take IndexerClient as first parameter
143
- const { data, isLoading, error, refetch } = useActiveMarkets(client, 20);
144
- ```
145
-
146
- ## Common Use Cases
147
-
148
- ### Dealer Dashboard
149
-
150
- ```tsx
151
- import { useDealerDashboard, useIsDealer } from '@heavymath/indexer_client';
152
-
153
- function DealerDashboard({ wallet }: { wallet: string }) {
154
- const client = useIndexerClient();
155
-
156
- const { data: isDealer, isLoading: checkingDealer } = useIsDealer(client, wallet);
157
- const { nfts, markets, isLoading } = useDealerDashboard(client, wallet);
158
-
159
- if (checkingDealer) return <div>Checking dealer status...</div>;
160
- if (!isDealer) return <div>You are not a dealer</div>;
161
- if (isLoading) return <div>Loading dashboard...</div>;
162
-
163
- return (
164
- <div>
165
- <h2>My Dealer NFTs</h2>
166
- {nfts.data?.map(nft => (
167
- <div key={nft.id}>Token #{nft.tokenId}</div>
168
- ))}
169
-
170
- <h2>My Markets</h2>
171
- {markets.data?.map(market => (
172
- <MarketCard key={market.id} market={market} />
173
- ))}
174
- </div>
175
- );
176
- }
177
- ```
178
-
179
- ### Market Details Page
180
-
181
- ```tsx
182
- import { useMarketDetails } from '@heavymath/indexer_client';
183
-
184
- function MarketPage({ marketId }: { marketId: string }) {
185
- const client = useIndexerClient();
186
-
187
- const { market, predictions, history, isLoading, isError } = useMarketDetails(client, marketId);
188
-
189
- if (isLoading) return <div>Loading...</div>;
190
- if (isError) return <div>Error loading market</div>;
191
-
192
- return (
193
- <div>
194
- <h1>{market.data?.data?.title}</h1>
195
- <p>{market.data?.data?.description}</p>
196
- <p>Status: {market.data?.data?.status}</p>
197
-
198
- <h2>Predictions ({predictions.data?.data?.length || 0})</h2>
199
- {predictions.data?.data?.map(pred => (
200
- <div key={pred.id}>
201
- {pred.userAddress}: {pred.percentage}%
202
- </div>
203
- ))}
204
-
205
- <h2>State History</h2>
206
- {history.data?.data?.map(state => (
207
- <div key={state.id}>
208
- {state.fromState} → {state.toState}
209
- </div>
210
- ))}
211
- </div>
212
- );
213
- }
214
58
  ```
215
-
216
- ### Wallet Favorites
217
-
218
- ```tsx
219
- import { useFavorites } from '@heavymath/indexer_client';
220
-
221
- function FavoritesPage({ wallet }: { wallet: string }) {
222
- const client = useIndexerClient();
223
-
224
- const { favorites, isLoading, addFavorite, removeFavorite, refresh } = useFavorites(
225
- client,
226
- wallet
227
- );
228
-
229
- const handleAddFavorite = async () => {
230
- await addFavorite.mutateAsync({
231
- category: 'sports',
232
- subcategory: 'soccer',
233
- type: 'team',
234
- id: 'team-123',
235
- });
236
- };
237
-
238
- const handleRemoveFavorite = async (id: number) => {
239
- await removeFavorite.mutateAsync(id);
240
- };
241
-
242
- if (isLoading) return <div>Loading...</div>;
243
-
244
- return (
245
- <div>
246
- <h2>My Favorites</h2>
247
- {favorites.map(fav => (
248
- <div key={fav.id}>
249
- {fav.category}/{fav.subcategory}: {fav.itemId}
250
- <button onClick={() => handleRemoveFavorite(fav.id)}>Remove</button>
251
- </div>
252
- ))}
253
- <button onClick={handleAddFavorite}>Add Favorite</button>
254
- </div>
255
- );
256
- }
59
+ Hooks (React Query) --> Zustand Stores --> Business Layer (caching) --> Network Layer (HTTP)
257
60
  ```
258
61
 
259
- ## Available Hooks
260
-
261
- ### Market Hooks
262
- - `useMarkets(client, filters?)` - Get all markets with filtering
263
- - `useActiveMarkets(client, limit?)` - Get active markets only
264
- - `useMarket(client, marketId)` - Get specific market
265
- - `useMarketPredictions(client, marketId)` - Get market's predictions
266
- - `useMarketHistory(client, marketId)` - Get market's state history
267
- - `useMarketDetails(client, marketId)` - Get complete market details
268
-
269
- ### Prediction Hooks
270
- - `usePredictions(client, filters?)` - Get predictions with filtering
271
- - `useUserPredictions(client, wallet, filters?)` - Get user's predictions
272
- - `useActiveBets(client, wallet)` - Get user's active bets
273
- - `usePastBets(client, wallet)` - Get user's claimed bets
274
- - `usePrediction(client, predictionId)` - Get specific prediction
275
- - `useUserBettingHistory(client, wallet)` - Get complete betting history
276
-
277
- ### Dealer Hooks
278
- - `useDealers(client, filters?)` - Get dealer NFTs with filtering
279
- - `useIsDealer(client, wallet)` - Check if wallet is a dealer
280
- - `useDealerNFTs(client, wallet)` - Get wallet's dealer NFTs
281
- - `useDealer(client, dealerId)` - Get specific dealer NFT
282
- - `useDealerPermissions(client, dealerId)` - Get dealer's permissions
283
- - `useDealerMarkets(client, dealerId)` - Get dealer's markets
284
- - `useDealerDashboard(client, wallet)` - Get complete dealer dashboard
285
-
286
- ### Withdrawal Hooks
287
- - `useWithdrawals(client, filters?)` - Get withdrawals with filtering
288
- - `useDealerWithdrawals(client, dealer)` - Get dealer's withdrawals
289
- - `useSystemWithdrawals(client)` - Get system withdrawals
290
- - `useMarketWithdrawals(client, marketId)` - Get market's withdrawals
291
-
292
- ### Oracle Hooks
293
- - `useOracleRequests(client, filters?)` - Get oracle requests with filtering
294
- - `useOracleRequest(client, requestId)` - Get specific oracle request
295
- - `useMarketOracle(client, marketId)` - Get market's oracle request
296
- - `useTimedOutOracleRequests(client)` - Get timed out requests
297
- - `usePendingOracleRequests(client)` - Get pending requests
298
-
299
- ### Favorites Hooks
300
- - `useFavorites(client, wallet, filters?)` - Get favorites with add/remove/refresh
301
- - `useCategoryFavorites(client, wallet, category)` - Get favorites by category
302
- - `useIsFavorite(client, wallet, item)` - Check if item is favorited with toggle
303
-
304
- ### Stats Hooks
305
- - `useMarketStats(client)` - Get market statistics
306
- - `useHealth(client)` - Get indexer health status
307
-
308
- ## API Endpoints
309
-
310
- The client supports all REST endpoints:
311
-
312
- - **Markets**: `/api/markets`, `/api/markets/:id`, `/api/markets/:id/predictions`, `/api/markets/:id/history`
313
- - **Predictions**: `/api/predictions`, `/api/predictions/:id`
314
- - **Dealers**: `/api/dealers`, `/api/dealers/:id`, `/api/dealers/:id/permissions`, `/api/dealers/:id/markets`
315
- - **Withdrawals**: `/api/withdrawals`
316
- - **Oracle**: `/api/oracle/requests`, `/api/oracle/requests/:id`
317
- - **Favorites**: `/api/wallet/:address/favorites` (GET, POST, DELETE)
318
- - **Analytics**: `/api/stats/markets`, `/api/health`
319
-
320
- ## TypeScript Support
321
-
322
- Full TypeScript definitions included:
323
-
324
- ```tsx
325
- import type {
326
- // Core types (from @sudobility/heavymath_types)
327
- MarketData,
328
- PredictionData,
329
- DealerNftData,
330
- DealerPermissionData,
331
- MarketStateHistoryData,
332
- FeeWithdrawalData,
333
- OracleRequestData,
334
- WalletFavoriteData,
335
- CreateFavoriteRequest,
336
- // Enums
337
- MarketStatus,
338
- ClaimType,
339
- WithdrawalType,
340
- // Response wrappers (from @sudobility/types)
341
- ApiResponse,
342
- PaginatedResponse,
343
- NetworkClient,
344
- // Filter types
345
- MarketFilters,
346
- PredictionFilters,
347
- DealerFilters,
348
- WithdrawalFilters,
349
- OracleFilters,
350
- WalletFavoritesFilters,
351
- } from '@heavymath/indexer_client';
352
- ```
62
+ All hooks accept `IndexerClient` as their first parameter. SSE hooks accept an endpoint URL.
353
63
 
354
64
  ## Development
355
65
 
356
66
  ```bash
357
- # Install dependencies
358
- npm install
359
-
360
- # Build
361
- npm run build
362
-
363
- # Type check
364
- npm run typecheck
67
+ bun run build # Compile TypeScript to dist/
68
+ bun run typecheck # Type validation
69
+ bun run test:run # Run tests once
70
+ bun run lint # ESLint check
71
+ bun run check-all # Lint + typecheck + tests
72
+ ```
365
73
 
366
- # Lint
367
- npm run lint
74
+ ## Related Packages
368
75
 
369
- # Format
370
- npm run format
371
-
372
- # Run all checks
373
- npm run check-all
374
- ```
76
+ - `@sudobility/heavymath_types` -- shared type definitions
77
+ - `@sudobility/heavymath_indexer` -- the backend indexer this client connects to
78
+ - `@sudobility/heavymath_lib` -- business logic hooks
79
+ - `heavymath_app` -- frontend web application
375
80
 
376
81
  ## License
377
82
 
378
- BUSL 1.1 - Business Use Source License
379
-
380
- Copyright (c) 2025 Sudobility Inc.
83
+ BUSL-1.1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/business/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/business/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC","sourcesContent":["/**\n * Business layer exports\n */\n\nexport * from './indexer-service';\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { NetworkClient } from '@sudobility/types';
2
2
  import { IndexerClient } from '../network/IndexerClient';
3
- import type { Market, Prediction, DealerNFT, PaginatedResponse, ApiResponse, PredictionFilters, StateHistory, MarketStats } from '../types';
3
+ import type { MarketData, PredictionData, DealerNftData, PaginatedResponse, ApiResponse, PredictionFilters, MarketStateHistoryData, MarketStatsData } from '../types';
4
4
  export interface IndexerServiceConfig {
5
5
  indexerUrl: string;
6
6
  networkClient: NetworkClient;
@@ -16,25 +16,26 @@ export declare class IndexerService {
16
16
  private getCacheKey;
17
17
  private getCache;
18
18
  private setCache;
19
- getActiveMarkets(limit?: number): Promise<PaginatedResponse<Market>>;
20
- getUserPredictions(walletAddress: string, filters?: Omit<PredictionFilters, 'user'>): Promise<PaginatedResponse<Prediction>>;
21
- getDealerNFTs(walletAddress: string): Promise<DealerNFT[]>;
19
+ getActiveMarkets(limit?: number): Promise<PaginatedResponse<MarketData>>;
20
+ getUserPredictions(walletAddress: string, filters?: Omit<PredictionFilters, 'user'>): Promise<PaginatedResponse<PredictionData>>;
21
+ getDealerNFTs(walletAddress: string): Promise<DealerNftData[]>;
22
22
  getDealerDashboard(walletAddress: string): Promise<{
23
- nfts: DealerNFT[];
24
- markets: Market[];
23
+ nfts: DealerNftData[];
24
+ markets: MarketData[];
25
25
  }>;
26
26
  getMarketDetails(marketId: string): Promise<{
27
- market: Market;
28
- predictions: Prediction[];
29
- history: StateHistory[];
27
+ market: MarketData;
28
+ predictions: PredictionData[];
29
+ history: MarketStateHistoryData[];
30
30
  }>;
31
31
  getUserBettingHistory(walletAddress: string): Promise<{
32
- active: Prediction[];
33
- claimed: Prediction[];
32
+ active: PredictionData[];
33
+ claimed: PredictionData[];
34
34
  }>;
35
- getMarketFromPrediction(predictionId: string): Promise<Market | null>;
36
- getMarketStats(): Promise<ApiResponse<MarketStats>>;
35
+ getMarketFromPrediction(predictionId: string): Promise<MarketData | null>;
36
+ getMarketStats(): Promise<ApiResponse<MarketStatsData>>;
37
37
  clearCache(): void;
38
+ invalidateCache(prefix: string): number;
38
39
  getClient(): IndexerClient;
39
40
  }
40
41
  //# sourceMappingURL=indexer-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexer-service.d.ts","sourceRoot":"","sources":["../../src/business/indexer-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACZ,MAAM,UAAU,CAAC;AAKlB,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,KAAK,CAAyD;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAMvB,MAAM,EAAE,oBAAoB;WAW1B,WAAW,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc;IAWvE,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,QAAQ;IAeH,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAyBxE,kBAAkB,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GACxC,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAwB5B,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAwB1D,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9D,IAAI,EAAE,SAAS,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IAoCW,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACvD,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;KACzB,CAAC;IAuCW,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QACjE,MAAM,EAAE,UAAU,EAAE,CAAC;QACrB,OAAO,EAAE,UAAU,EAAE,CAAC;KACvB,CAAC;IAqCW,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBrE,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAmBzD,UAAU,IAAI,IAAI;IAOlB,SAAS,IAAI,aAAa;CAGlC"}
1
+ {"version":3,"file":"indexer-service.d.ts","sourceRoot":"","sources":["../../src/business/indexer-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EAChB,MAAM,UAAU,CAAC;AAKlB,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,KAAK,CAAyD;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAMvB,MAAM,EAAE,oBAAoB;WAW1B,WAAW,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc;IAWvE,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,QAAQ;IAoBH,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IA6B5E,kBAAkB,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GACxC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IA4BhC,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA6B9D,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAC9D,IAAI,EAAE,aAAa,EAAE,CAAC;QACtB,OAAO,EAAE,UAAU,EAAE,CAAC;KACvB,CAAC;IAyCW,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACvD,MAAM,EAAE,UAAU,CAAC;QACnB,WAAW,EAAE,cAAc,EAAE,CAAC;QAC9B,OAAO,EAAE,sBAAsB,EAAE,CAAC;KACnC,CAAC;IA4CW,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QACjE,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,OAAO,EAAE,cAAc,EAAE,CAAC;KAC3B,CAAC;IA0CW,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAuBzE,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAoB7D,UAAU,IAAI,IAAI;IAqBlB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAgBvC,SAAS,IAAI,aAAa;CAGlC"}
@@ -194,6 +194,16 @@ export class IndexerService {
194
194
  clearCache() {
195
195
  this.cache.clear();
196
196
  }
197
+ invalidateCache(prefix) {
198
+ let count = 0;
199
+ for (const key of this.cache.keys()) {
200
+ if (key.startsWith(prefix)) {
201
+ this.cache.delete(key);
202
+ count++;
203
+ }
204
+ }
205
+ return count;
206
+ }
197
207
  getClient() {
198
208
  return this.indexerClient;
199
209
  }
@@ -1 +1 @@
1
- {"version":3,"file":"indexer-service.js","sourceRoot":"","sources":["../../src/business/indexer-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexer-service.js","sourceRoot":"","sources":["../../src/business/indexer-service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Business service for Heavymath Indexer operations\n * Provides high-level methods with caching for frequently accessed data\n */\n\nimport type { NetworkClient } from '@sudobility/types';\nimport { IndexerClient } from '../network/IndexerClient';\nimport type {\n MarketData,\n PredictionData,\n DealerNftData,\n PaginatedResponse,\n ApiResponse,\n PredictionFilters,\n MarketStateHistoryData,\n MarketStatsData,\n} from '../types';\n\n/**\n * Configuration for IndexerService\n */\nexport interface IndexerServiceConfig {\n indexerUrl: string;\n networkClient: NetworkClient;\n cacheTTL?: number; // Cache time-to-live in milliseconds (default: 5 minutes)\n}\n\n/**\n * Business service for indexer operations\n * Implements caching and high-level business logic\n */\nexport class IndexerService {\n private static instance: IndexerService;\n private indexerClient: IndexerClient;\n private cache = new Map<string, { data: unknown; expires: number }>();\n private readonly CACHE_TTL: number;\n\n /**\n * Create an IndexerService instance\n * @param config - Configuration including indexerUrl and networkClient from @sudobility/di\n */\n constructor(config: IndexerServiceConfig) {\n if (!config.indexerUrl) {\n throw new Error('indexerUrl is required in IndexerServiceConfig');\n }\n if (!config.networkClient) {\n throw new Error('networkClient is required in IndexerServiceConfig');\n }\n this.indexerClient = new IndexerClient(config.indexerUrl, config.networkClient);\n this.CACHE_TTL = config.cacheTTL || 5 * 60 * 1000; // 5 minutes default\n }\n\n public static getInstance(config: IndexerServiceConfig): IndexerService {\n if (!IndexerService.instance) {\n IndexerService.instance = new IndexerService(config);\n }\n return IndexerService.instance;\n }\n\n // =============================================================================\n // PRIVATE CACHE METHODS\n // =============================================================================\n\n private getCacheKey(...args: unknown[]): string {\n return args.map(arg => (typeof arg === 'object' ? JSON.stringify(arg) : arg)).join(':');\n }\n\n private getCache<T>(key: string): T | null {\n const cached = this.cache.get(key);\n if (cached && cached.expires > Date.now()) {\n return cached.data as T;\n }\n this.cache.delete(key);\n return null;\n }\n\n private setCache<T>(key: string, data: T): void {\n this.cache.set(key, {\n data,\n expires: Date.now() + this.CACHE_TTL,\n });\n }\n\n // =============================================================================\n // PUBLIC BUSINESS METHODS\n // =============================================================================\n\n /**\n * Get active markets with caching.\n * Commonly used for displaying available markets to bettors.\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @param limit - Maximum number of markets to return (default: 50)\n * @returns Paginated list of active markets\n * @throws Error if the API request fails (with a descriptive message)\n */\n public async getActiveMarkets(limit: number = 50): Promise<PaginatedResponse<MarketData>> {\n const cacheKey = this.getCacheKey('active-markets', limit);\n const cached = this.getCache<PaginatedResponse<MarketData>>(cacheKey);\n if (cached) return cached;\n\n try {\n const result = await this.indexerClient.getMarkets({\n status: 'Active',\n limit,\n });\n\n this.setCache(cacheKey, result);\n return result;\n } catch (error) {\n throw new Error(\n `Failed to get active markets: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Get user's predictions (betting history) with caching.\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @param walletAddress - User's wallet address\n * @param filters - Additional prediction filters (excluding 'user', which is set automatically)\n * @returns Paginated list of the user's predictions\n * @throws Error if the API request fails\n */\n public async getUserPredictions(\n walletAddress: string,\n filters?: Omit<PredictionFilters, 'user'>\n ): Promise<PaginatedResponse<PredictionData>> {\n const cacheKey = this.getCacheKey('user-predictions', walletAddress, filters);\n const cached = this.getCache<PaginatedResponse<PredictionData>>(cacheKey);\n if (cached) return cached;\n\n try {\n const result = await this.indexerClient.getPredictions({\n user: walletAddress,\n ...filters,\n });\n\n this.setCache(cacheKey, result);\n return result;\n } catch (error) {\n throw new Error(\n `Failed to get user predictions: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Check if wallet is a dealer and get their NFTs with caching.\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @param walletAddress - Wallet address to check\n * @returns Array of dealer NFTs owned by the wallet (empty if not a dealer)\n * @throws Error if the API request fails\n */\n public async getDealerNFTs(walletAddress: string): Promise<DealerNftData[]> {\n const cacheKey = this.getCacheKey('dealer-nfts', walletAddress);\n const cached = this.getCache<DealerNftData[]>(cacheKey);\n if (cached) return cached;\n\n try {\n const result = await this.indexerClient.getDealers({\n owner: walletAddress,\n });\n\n const nfts = result.data ?? [];\n this.setCache(cacheKey, nfts);\n return nfts;\n } catch (error) {\n throw new Error(\n `Failed to get dealer NFTs: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Get dealer's dashboard (all markets for their NFTs) with caching.\n * Fetches dealer NFTs and then all markets for each NFT in parallel.\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @param walletAddress - Dealer's wallet address\n * @returns Object containing the dealer's NFTs and their aggregated markets (deduplicated)\n * @throws Error if the API request fails\n */\n public async getDealerDashboard(walletAddress: string): Promise<{\n nfts: DealerNftData[];\n markets: MarketData[];\n }> {\n const cacheKey = this.getCacheKey('dealer-dashboard', walletAddress);\n const cached = this.getCache<{ nfts: DealerNftData[]; markets: MarketData[] }>(cacheKey);\n if (cached) return cached;\n\n try {\n // Get dealer NFTs\n const nfts = await this.getDealerNFTs(walletAddress);\n\n // Get markets for each NFT\n const marketPromises = nfts.map(nft => this.indexerClient.getDealerMarkets(nft.id));\n const marketResults = await Promise.all(marketPromises);\n\n // Flatten markets and remove duplicates\n const marketsMap = new Map<string, MarketData>();\n marketResults.forEach(result => {\n if (result.data) {\n result.data.forEach(market => marketsMap.set(market.id, market));\n }\n });\n const markets = Array.from(marketsMap.values());\n\n const result = { nfts, markets };\n this.setCache(cacheKey, result);\n return result;\n } catch (error) {\n throw new Error(\n `Failed to get dealer dashboard: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Get complete market details including predictions and history with caching.\n * Fetches market, predictions, and history in parallel.\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @param marketId - Chain-prefixed market ID (e.g., '1-market-123')\n * @returns Object containing the market data, its predictions, and state history\n * @throws Error if the market is not found or the API request fails\n */\n public async getMarketDetails(marketId: string): Promise<{\n market: MarketData;\n predictions: PredictionData[];\n history: MarketStateHistoryData[];\n }> {\n const cacheKey = this.getCacheKey('market-details', marketId);\n const cached = this.getCache<{\n market: MarketData;\n predictions: PredictionData[];\n history: MarketStateHistoryData[];\n }>(cacheKey);\n if (cached) return cached;\n\n try {\n const [marketResult, predictionsResult, historyResult] = await Promise.all([\n this.indexerClient.getMarket(marketId),\n this.indexerClient.getMarketPredictions(marketId),\n this.indexerClient.getMarketHistory(marketId),\n ]);\n\n if (!marketResult.data) {\n throw new Error('Market not found');\n }\n\n const result = {\n market: marketResult.data,\n predictions: predictionsResult.data || [],\n history: historyResult.data || [],\n };\n\n this.setCache(cacheKey, result);\n return result;\n } catch (error) {\n throw new Error(\n `Failed to get market details: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Get user's betting history (active + past bets) with caching.\n * Fetches active and claimed predictions in parallel (limited to 100 each).\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @param walletAddress - User's wallet address\n * @returns Object containing arrays of active (unclaimed) and claimed predictions\n * @throws Error if the API request fails\n */\n public async getUserBettingHistory(walletAddress: string): Promise<{\n active: PredictionData[];\n claimed: PredictionData[];\n }> {\n const cacheKey = this.getCacheKey('user-betting-history', walletAddress);\n const cached = this.getCache<{ active: PredictionData[]; claimed: PredictionData[] }>(cacheKey);\n if (cached) return cached;\n\n try {\n const [activeResult, claimedResult] = await Promise.all([\n this.indexerClient.getPredictions({\n user: walletAddress,\n claimed: false,\n limit: 100,\n }),\n this.indexerClient.getPredictions({\n user: walletAddress,\n claimed: true,\n limit: 100,\n }),\n ]);\n\n const result = {\n active: activeResult.data || [],\n claimed: claimedResult.data || [],\n };\n\n this.setCache(cacheKey, result);\n return result;\n } catch (error) {\n throw new Error(\n `Failed to get user betting history: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Get market from a prediction (navigate from bet to market).\n * First fetches the prediction to get the marketId, then fetches the market.\n * Note: this method does not use caching since it involves two sequential requests.\n *\n * @param predictionId - Chain-prefixed prediction ID\n * @returns The market data if found, or null if the prediction has no associated market\n * @throws Error if the API request fails\n */\n public async getMarketFromPrediction(predictionId: string): Promise<MarketData | null> {\n try {\n const predictionResult = await this.indexerClient.getPrediction(predictionId);\n if (!predictionResult.data) {\n return null;\n }\n\n const marketResult = await this.indexerClient.getMarket(predictionResult.data.marketId);\n return marketResult.data || null;\n } catch (error) {\n throw new Error(\n `Failed to get market from prediction: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Get market statistics with caching.\n * Results are cached for the configured TTL (default: 5 minutes).\n *\n * @returns Aggregate market statistics wrapped in an API response\n * @throws Error if the API request fails\n */\n public async getMarketStats(): Promise<ApiResponse<MarketStatsData>> {\n const cacheKey = this.getCacheKey('market-stats');\n const cached = this.getCache<ApiResponse<MarketStatsData>>(cacheKey);\n if (cached) return cached;\n\n try {\n const result = await this.indexerClient.getMarketStats();\n this.setCache(cacheKey, result);\n return result;\n } catch (error) {\n throw new Error(\n `Failed to get market stats: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Clear the entire internal cache.\n * Use {@link invalidateCache} for targeted invalidation.\n */\n public clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Invalidate cache entries whose keys start with the given prefix.\n * Useful for targeted cache invalidation when SSE events indicate\n * specific data has changed (e.g., invalidating all market-related caches).\n *\n * @param prefix - The cache key prefix to match (e.g., 'active-markets', 'dealer-dashboard')\n * @returns The number of cache entries that were invalidated\n *\n * @example\n * ```ts\n * // Invalidate all market-related caches\n * service.invalidateCache('active-markets');\n *\n * // Invalidate all caches for a specific user\n * service.invalidateCache('user-predictions:0x123...');\n * ```\n */\n public invalidateCache(prefix: string): number {\n let count = 0;\n for (const key of this.cache.keys()) {\n if (key.startsWith(prefix)) {\n this.cache.delete(key);\n count++;\n }\n }\n return count;\n }\n\n /**\n * Get the underlying IndexerClient for direct API access.\n *\n * @returns The IndexerClient instance used by this service\n */\n public getClient(): IndexerClient {\n return this.indexerClient;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAKA,cAAc,cAAc,CAAC;AAG7B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,cAAc,CAAC;AAG7B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAKA,cAAc,cAAc,CAAC;AAG7B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,cAAc,CAAC;AAG7B,cAAc,kBAAkB,CAAC;AAGjC,cAAc,aAAa,CAAC;AAG5B,cAAc,YAAY,CAAC;AAG3B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC","sourcesContent":["/**\n * React hooks for Heavymath Prediction Market Indexer API\n */\n\n// Market hooks\nexport * from './useMarkets';\n\n// Prediction hooks\nexport * from './usePredictions';\n\n// Dealer NFT hooks\nexport * from './useDealers';\n\n// Fee withdrawal hooks\nexport * from './useWithdrawals';\n\n// Oracle hooks\nexport * from './useOracle';\n\n// Analytics and stats hooks\nexport * from './useStats';\n\n// Favorites hooks\nexport * from './useFavorites';\n\n// Real-time SSE hooks\nexport * from './useSSE';\n"]}
@@ -1,15 +1,15 @@
1
1
  import { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
2
- import type { DealerNFT, DealerPermission, Market, PaginatedResponse, ApiResponse, DealerFilters } from '../types';
2
+ import type { DealerNftData, DealerPermissionData, MarketData, PaginatedResponse, ApiResponse, DealerFilters } from '../types';
3
3
  import { IndexerClient } from '../network/IndexerClient';
4
- export declare function useDealers(client: IndexerClient, filters?: DealerFilters, options?: Omit<UseQueryOptions<PaginatedResponse<DealerNFT>>, 'queryKey' | 'queryFn'>): UseQueryResult<PaginatedResponse<DealerNFT>>;
4
+ export declare function useDealers(client: IndexerClient, filters?: DealerFilters, options?: Omit<UseQueryOptions<PaginatedResponse<DealerNftData>>, 'queryKey' | 'queryFn'>): UseQueryResult<PaginatedResponse<DealerNftData>>;
5
5
  export declare function useIsDealer(client: IndexerClient, walletAddress: string | undefined, options?: Omit<UseQueryOptions<boolean>, 'queryKey' | 'queryFn'>): UseQueryResult<boolean>;
6
- export declare function useDealerNFTs(client: IndexerClient, walletAddress: string | undefined, options?: Omit<UseQueryOptions<DealerNFT[]>, 'queryKey' | 'queryFn'>): UseQueryResult<DealerNFT[]>;
7
- export declare function useDealer(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<DealerNFT>>, 'queryKey' | 'queryFn'>): UseQueryResult<ApiResponse<DealerNFT>>;
8
- export declare function useDealerPermissions(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<DealerPermission[]>>, 'queryKey' | 'queryFn'>): UseQueryResult<ApiResponse<DealerPermission[]>>;
9
- export declare function useDealerMarkets(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<Market[]>>, 'queryKey' | 'queryFn'>): UseQueryResult<ApiResponse<Market[]>>;
6
+ export declare function useDealerNFTs(client: IndexerClient, walletAddress: string | undefined, options?: Omit<UseQueryOptions<DealerNftData[]>, 'queryKey' | 'queryFn'>): UseQueryResult<DealerNftData[]>;
7
+ export declare function useDealer(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<DealerNftData>>, 'queryKey' | 'queryFn'>): UseQueryResult<ApiResponse<DealerNftData>>;
8
+ export declare function useDealerPermissions(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<DealerPermissionData[]>>, 'queryKey' | 'queryFn'>): UseQueryResult<ApiResponse<DealerPermissionData[]>>;
9
+ export declare function useDealerMarkets(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<MarketData[]>>, 'queryKey' | 'queryFn'>): UseQueryResult<ApiResponse<MarketData[]>>;
10
10
  export declare function useDealerDashboard(client: IndexerClient, walletAddress: string | undefined): {
11
- nfts: UseQueryResult<DealerNFT[]>;
12
- markets: UseQueryResult<Market[]>;
11
+ nfts: UseQueryResult<DealerNftData[]>;
12
+ markets: UseQueryResult<MarketData[]>;
13
13
  isLoading: boolean;
14
14
  isError: boolean;
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useDealers.d.ts","sourceRoot":"","sources":["../../src/hooks/useDealers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAY,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAWzD,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GACpF,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAU9C;AAWD,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAC/D,cAAc,CAAC,OAAO,CAAC,CAazB;AAWD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GACnE,cAAc,CAAC,SAAS,EAAE,CAAC,CAa7B;AAWD,wBAAgB,SAAS,CACvB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAC9E,cAAc,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAYxC;AAWD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GACvF,cAAc,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAYjD;AAWD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAC7E,cAAc,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAYvC;AAWD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC;IACD,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAgCA"}
1
+ {"version":3,"file":"useDealers.d.ts","sourceRoot":"","sources":["../../src/hooks/useDealers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAY,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,aAAa,EACd,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAWzD,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GACxF,cAAc,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAUlD;AAWD,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAC/D,cAAc,CAAC,OAAO,CAAC,CAazB;AAWD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GACvE,cAAc,CAAC,aAAa,EAAE,CAAC,CAajC;AAWD,wBAAgB,SAAS,CACvB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAClF,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAY5C;AAWD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GAC3F,cAAc,CAAC,WAAW,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAYrD;AAWD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,GACjF,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAY3C;AAWD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC;IACD,IAAI,EAAE,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAgCA"}