@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.
- package/README.md +44 -341
- package/dist/business/index.js.map +1 -1
- package/dist/business/indexer-service.d.ts +14 -13
- package/dist/business/indexer-service.d.ts.map +1 -1
- package/dist/business/indexer-service.js +10 -0
- package/dist/business/indexer-service.js.map +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useDealers.d.ts +8 -8
- package/dist/hooks/useDealers.d.ts.map +1 -1
- package/dist/hooks/useDealers.js.map +1 -1
- package/dist/hooks/useFavorites.d.ts +1 -1
- package/dist/hooks/useFavorites.d.ts.map +1 -1
- package/dist/hooks/useFavorites.js.map +1 -1
- package/dist/hooks/useMarkets.d.ts +9 -9
- package/dist/hooks/useMarkets.d.ts.map +1 -1
- package/dist/hooks/useMarkets.js.map +1 -1
- package/dist/hooks/useOracle.d.ts +6 -6
- package/dist/hooks/useOracle.d.ts.map +1 -1
- package/dist/hooks/useOracle.js.map +1 -1
- package/dist/hooks/usePredictions.d.ts +8 -8
- package/dist/hooks/usePredictions.d.ts.map +1 -1
- package/dist/hooks/usePredictions.js.map +1 -1
- package/dist/hooks/useSSE.js.map +1 -1
- package/dist/hooks/useStats.d.ts +3 -3
- package/dist/hooks/useStats.d.ts.map +1 -1
- package/dist/hooks/useStats.js.map +1 -1
- package/dist/hooks/useWithdrawals.d.ts +5 -5
- package/dist/hooks/useWithdrawals.d.ts.map +1 -1
- package/dist/hooks/useWithdrawals.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/network/IndexerClient.d.ts +16 -16
- package/dist/network/IndexerClient.d.ts.map +1 -1
- package/dist/network/IndexerClient.js +3 -2
- package/dist/network/IndexerClient.js.map +1 -1
- package/dist/network/index.js.map +1 -1
- package/dist/stores/favorites-store.js.map +1 -1
- package/dist/stores/index.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +15 -11
package/README.md
CHANGED
|
@@ -1,380 +1,83 @@
|
|
|
1
|
-
# @
|
|
1
|
+
# @sudobility/heavymath_indexer_client
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
8
|
+
bun add @sudobility/heavymath_indexer_client
|
|
19
9
|
```
|
|
20
10
|
|
|
21
|
-
|
|
11
|
+
### Peer Dependencies
|
|
22
12
|
|
|
23
13
|
```bash
|
|
24
|
-
|
|
14
|
+
bun add react @tanstack/react-query zustand @sudobility/types @sudobility/heavymath_types
|
|
25
15
|
```
|
|
26
16
|
|
|
27
|
-
##
|
|
28
|
-
|
|
29
|
-
### 1. Setup React Query Provider
|
|
17
|
+
## Usage
|
|
30
18
|
|
|
31
|
-
```
|
|
32
|
-
import {
|
|
19
|
+
```typescript
|
|
20
|
+
import { IndexerClient, useActiveMarkets, useFavorites } from '@sudobility/heavymath_indexer_client';
|
|
33
21
|
|
|
34
|
-
|
|
22
|
+
// Create client with injected NetworkClient
|
|
23
|
+
const client = new IndexerClient('http://localhost:42069', networkClient);
|
|
35
24
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
35
|
+
### Markets
|
|
36
|
+
`useMarkets`, `useActiveMarkets`, `useMarket`, `useMarketPredictions`, `useMarketHistory`, `useMarketDetails`
|
|
63
37
|
|
|
64
|
-
|
|
65
|
-
|
|
38
|
+
### Predictions
|
|
39
|
+
`usePredictions`, `useUserPredictions`, `useActiveBets`, `usePastBets`, `usePrediction`, `useUserBettingHistory`
|
|
66
40
|
|
|
67
|
-
|
|
68
|
-
|
|
41
|
+
### Dealers
|
|
42
|
+
`useDealers`, `useIsDealer`, `useDealerNFTs`, `useDealer`, `useDealerPermissions`, `useDealerMarkets`, `useDealerDashboard`
|
|
69
43
|
|
|
70
|
-
|
|
71
|
-
|
|
44
|
+
### Withdrawals / Oracle
|
|
45
|
+
`useWithdrawals`, `useDealerWithdrawals`, `useSystemWithdrawals`, `useMarketWithdrawals`, `useOracleRequests`, `useOracleRequest`, `useMarketOracle`
|
|
72
46
|
|
|
73
|
-
|
|
47
|
+
### Favorites (with Zustand optimistic updates)
|
|
48
|
+
`useFavorites`, `useCategoryFavorites`, `useIsFavorite`
|
|
74
49
|
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
#
|
|
361
|
-
|
|
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
|
-
|
|
367
|
-
npm run lint
|
|
74
|
+
## Related Packages
|
|
368
75
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
|
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 {
|
|
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<
|
|
20
|
-
getUserPredictions(walletAddress: string, filters?: Omit<PredictionFilters, 'user'>): Promise<PaginatedResponse<
|
|
21
|
-
getDealerNFTs(walletAddress: string): Promise<
|
|
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:
|
|
24
|
-
markets:
|
|
23
|
+
nfts: DealerNftData[];
|
|
24
|
+
markets: MarketData[];
|
|
25
25
|
}>;
|
|
26
26
|
getMarketDetails(marketId: string): Promise<{
|
|
27
|
-
market:
|
|
28
|
-
predictions:
|
|
29
|
-
history:
|
|
27
|
+
market: MarketData;
|
|
28
|
+
predictions: PredictionData[];
|
|
29
|
+
history: MarketStateHistoryData[];
|
|
30
30
|
}>;
|
|
31
31
|
getUserBettingHistory(walletAddress: string): Promise<{
|
|
32
|
-
active:
|
|
33
|
-
claimed:
|
|
32
|
+
active: PredictionData[];
|
|
33
|
+
claimed: PredictionData[];
|
|
34
34
|
}>;
|
|
35
|
-
getMarketFromPrediction(predictionId: string): Promise<
|
|
36
|
-
getMarketStats(): Promise<ApiResponse<
|
|
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,
|
|
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"]}
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -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 {
|
|
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<
|
|
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<
|
|
7
|
-
export declare function useDealer(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<
|
|
8
|
-
export declare function useDealerPermissions(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<
|
|
9
|
-
export declare function useDealerMarkets(client: IndexerClient, dealerId: string | undefined, options?: Omit<UseQueryOptions<ApiResponse<
|
|
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<
|
|
12
|
-
markets: UseQueryResult<
|
|
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,
|
|
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"}
|