@whisk/steakhouse 0.0.4 → 0.0.5

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 (63) hide show
  1. package/dist/client.d.ts +1 -12
  2. package/dist/client.js +1 -10
  3. package/dist/client.js.map +1 -1
  4. package/dist/index.d.ts +6 -5
  5. package/dist/index.js +1 -4
  6. package/dist/index.js.map +1 -1
  7. package/dist/metadata/types.d.ts +3 -1
  8. package/dist/metadata/vaults.js +17 -15
  9. package/dist/metadata/vaults.js.map +1 -1
  10. package/dist/queries/fragments/vaultDetail.d.ts +265 -0
  11. package/dist/queries/fragments/vaultDetail.js +148 -0
  12. package/dist/queries/fragments/vaultDetail.js.map +1 -0
  13. package/dist/queries/getDetailedVault.d.ts +591 -0
  14. package/dist/queries/getDetailedVault.js +92 -0
  15. package/dist/queries/getDetailedVault.js.map +1 -0
  16. package/dist/queries/getVaults.d.ts +274 -13
  17. package/dist/queries/getVaults.js +36 -10
  18. package/dist/queries/getVaults.js.map +1 -1
  19. package/dist/queries/index.d.ts +6 -5
  20. package/dist/queries/index.js +6 -8
  21. package/dist/queries/index.js.map +1 -1
  22. package/dist/queries/steakhouseMetadata.d.ts +13 -0
  23. package/dist/queries/steakhouseMetadata.js +12 -0
  24. package/dist/queries/steakhouseMetadata.js.map +1 -0
  25. package/dist/queries/types.d.ts +2 -4
  26. package/dist/react/hooks/index.d.ts +8 -5
  27. package/dist/react/hooks/index.js +2 -0
  28. package/dist/react/hooks/index.js.map +1 -1
  29. package/dist/react/hooks/useDetailedVault.d.ts +12 -0
  30. package/dist/react/hooks/useDetailedVault.js +16 -0
  31. package/dist/react/hooks/useDetailedVault.js.map +1 -0
  32. package/dist/react/hooks/useSteakhouseQuery.d.ts +2 -4
  33. package/dist/react/hooks/useSteakhouseQuery.js +1 -1
  34. package/dist/react/hooks/useSteakhouseQuery.js.map +1 -1
  35. package/dist/react/hooks/useVaults.d.ts +7 -14
  36. package/dist/react/hooks/useVaults.js +3 -1
  37. package/dist/react/hooks/useVaults.js.map +1 -1
  38. package/dist/react/index.d.ts +8 -5
  39. package/dist/react/index.js +1 -8
  40. package/dist/react/index.js.map +1 -1
  41. package/dist/react/provider.d.ts +3 -5
  42. package/package.json +3 -3
  43. package/src/client.ts +3 -19
  44. package/src/index.ts +1 -2
  45. package/src/metadata/types.ts +3 -1
  46. package/src/metadata/vaults.ts +17 -17
  47. package/src/queries/fragments/vaultDetail.ts +151 -0
  48. package/src/queries/getDetailedVault.test.ts +212 -0
  49. package/src/queries/getDetailedVault.ts +132 -0
  50. package/src/queries/getVaults.test.ts +186 -0
  51. package/src/queries/getVaults.ts +62 -13
  52. package/src/queries/index.ts +9 -7
  53. package/src/queries/steakhouseMetadata.ts +19 -0
  54. package/src/react/hooks/index.ts +1 -0
  55. package/src/react/hooks/useDetailedVault.ts +19 -0
  56. package/src/react/hooks/useSteakhouseQuery.ts +3 -3
  57. package/src/react/hooks/useVaults.ts +7 -2
  58. package/src/react/index.ts +1 -6
  59. package/dist/queries/fragments/vault.d.ts +0 -19
  60. package/dist/queries/fragments/vault.js +0 -16
  61. package/dist/queries/fragments/vault.js.map +0 -1
  62. package/src/client.test.ts +0 -27
  63. package/src/queries/fragments/vault.ts +0 -15
@@ -0,0 +1,591 @@
1
+ import * as gql_tada from 'gql.tada';
2
+ import { WhiskClient } from '@whisk/client';
3
+ import { Address } from '../metadata/types.js';
4
+ import { VaultDetail } from './fragments/vaultDetail.js';
5
+ import { SteakhouseMetadata } from './steakhouseMetadata.js';
6
+ import '@whisk/graphql';
7
+
8
+ /** Historical data type extracted from the fragment */
9
+ type VaultHistoricalData = {
10
+ daily: Array<{
11
+ bucketTimestamp: number;
12
+ totalSupplied: {
13
+ formatted: string;
14
+ usd: number | null;
15
+ };
16
+ supplyApy7d: {
17
+ total: number;
18
+ };
19
+ }>;
20
+ };
21
+ /** Query for fetching a single vault without historical data */
22
+ declare const vaultQuery: gql_tada.TadaDocumentNode<{
23
+ erc4626Vaults: {
24
+ items: ({
25
+ __typename?: "MorphoVault";
26
+ chain: {
27
+ id: number;
28
+ name: string;
29
+ icon: string;
30
+ };
31
+ vaultAddress: `0x${string}`;
32
+ name: string;
33
+ symbol: string;
34
+ decimals: number;
35
+ asset: {
36
+ address: `0x${string}`;
37
+ symbol: string;
38
+ name: string;
39
+ icon: string | null;
40
+ priceUsd: number | null;
41
+ decimals: number;
42
+ };
43
+ totalAssets: {
44
+ raw: bigint;
45
+ formatted: string;
46
+ usd: number | null;
47
+ };
48
+ apy: {
49
+ base: number;
50
+ total: number;
51
+ rewards: {
52
+ asset: {
53
+ symbol: string;
54
+ icon: string | null;
55
+ };
56
+ apr: number;
57
+ }[];
58
+ fee: number;
59
+ };
60
+ totalLiquidity: {
61
+ formatted: string;
62
+ usd: number | null;
63
+ };
64
+ v1PerformanceFee: number;
65
+ feeRecipientAddress: `0x${string}` | null;
66
+ ownerAddress: `0x${string}`;
67
+ curatorAddress: `0x${string}`;
68
+ guardianAddress: `0x${string}`;
69
+ metadata: {
70
+ description: string | null;
71
+ image: string | null;
72
+ forumLink: string | null;
73
+ curator: {
74
+ name: string;
75
+ image: string;
76
+ url: string;
77
+ } | null;
78
+ curators: {
79
+ name: string;
80
+ image: string;
81
+ url: string;
82
+ }[];
83
+ } | null;
84
+ marketAllocations: {
85
+ market: {
86
+ marketId: `0x${string}`;
87
+ name: string;
88
+ loanAsset: {
89
+ symbol: string;
90
+ icon: string | null;
91
+ };
92
+ collateralAsset: {
93
+ symbol: string;
94
+ icon: string | null;
95
+ } | null;
96
+ isIdle: boolean;
97
+ };
98
+ enabled: boolean;
99
+ supplyCap: {
100
+ formatted: string;
101
+ usd: number | null;
102
+ };
103
+ vaultSupplyShare: number;
104
+ marketSupplyShare: number;
105
+ position: {
106
+ supplyAmount: {
107
+ formatted: string;
108
+ usd: number | null;
109
+ };
110
+ };
111
+ }[];
112
+ riskAssessment: {
113
+ steakhouse: {
114
+ score: number;
115
+ rating: string;
116
+ } | null;
117
+ };
118
+ } | {
119
+ __typename?: "MorphoVaultV2";
120
+ chain: {
121
+ id: number;
122
+ name: string;
123
+ icon: string;
124
+ };
125
+ vaultAddress: `0x${string}`;
126
+ name: string;
127
+ symbol: string;
128
+ decimals: number;
129
+ asset: {
130
+ address: `0x${string}`;
131
+ symbol: string;
132
+ name: string;
133
+ icon: string | null;
134
+ priceUsd: number | null;
135
+ decimals: number;
136
+ };
137
+ totalAssets: {
138
+ raw: bigint;
139
+ formatted: string;
140
+ usd: number | null;
141
+ };
142
+ apy: {
143
+ base: number;
144
+ total: number;
145
+ rewards: {
146
+ asset: {
147
+ symbol: string;
148
+ icon: string | null;
149
+ };
150
+ apr: number;
151
+ }[];
152
+ fee: number;
153
+ };
154
+ curatorAddress: `0x${string}`;
155
+ ownerAddress: `0x${string}`;
156
+ metadata: {
157
+ description: string | null;
158
+ image: string | null;
159
+ forumLink: string | null;
160
+ curator: {
161
+ name: string;
162
+ image: string;
163
+ url: string;
164
+ } | null;
165
+ curators: {
166
+ name: string;
167
+ image: string;
168
+ url: string;
169
+ }[];
170
+ } | null;
171
+ liquidityAssets: {
172
+ formatted: string;
173
+ usd: number | null;
174
+ };
175
+ idleAssets: {
176
+ formatted: string;
177
+ usd: number | null;
178
+ };
179
+ v2PerformanceFee: {
180
+ formatted: string;
181
+ };
182
+ managementFee: {
183
+ formatted: string;
184
+ };
185
+ adapters: ({
186
+ __typename?: "MarketV1Adapter";
187
+ adapterAddress: `0x${string}`;
188
+ name: string | null;
189
+ } | {
190
+ __typename?: "BoxVaultAdapter";
191
+ } | {
192
+ __typename?: "UnknownAdapter";
193
+ } | {
194
+ __typename?: "VaultV1Adapter";
195
+ })[];
196
+ riskAssessment: {
197
+ steakhouse: {
198
+ score: number;
199
+ rating: string;
200
+ } | null;
201
+ };
202
+ } | {
203
+ __typename?: "BoxVault";
204
+ chain: {
205
+ id: number;
206
+ name: string;
207
+ icon: string;
208
+ };
209
+ vaultAddress: `0x${string}`;
210
+ name: string;
211
+ symbol: string;
212
+ decimals: number;
213
+ asset: {
214
+ address: `0x${string}`;
215
+ symbol: string;
216
+ name: string;
217
+ icon: string | null;
218
+ priceUsd: number | null;
219
+ decimals: number;
220
+ };
221
+ totalAssets: {
222
+ raw: bigint;
223
+ formatted: string;
224
+ usd: number | null;
225
+ };
226
+ apy: {
227
+ base: number;
228
+ total: number;
229
+ rewards: {
230
+ asset: {
231
+ symbol: string;
232
+ icon: string | null;
233
+ };
234
+ apr: number;
235
+ }[];
236
+ fee: number;
237
+ };
238
+ } | {
239
+ __typename?: "GenericErc4626Vault";
240
+ chain: {
241
+ id: number;
242
+ name: string;
243
+ icon: string;
244
+ };
245
+ vaultAddress: `0x${string}`;
246
+ name: string;
247
+ symbol: string;
248
+ decimals: number;
249
+ asset: {
250
+ address: `0x${string}`;
251
+ symbol: string;
252
+ name: string;
253
+ icon: string | null;
254
+ priceUsd: number | null;
255
+ decimals: number;
256
+ };
257
+ totalAssets: {
258
+ raw: bigint;
259
+ formatted: string;
260
+ usd: number | null;
261
+ };
262
+ apy: {
263
+ base: number;
264
+ total: number;
265
+ rewards: {
266
+ asset: {
267
+ symbol: string;
268
+ icon: string | null;
269
+ };
270
+ apr: number;
271
+ }[];
272
+ fee: number;
273
+ };
274
+ } | null)[];
275
+ };
276
+ }, {
277
+ where?: {
278
+ keys?: {
279
+ protocol: "morpho_v1" | "morpho_v2" | "generic" | "box";
280
+ vaultAddress: `0x${string}`;
281
+ chainId: number;
282
+ }[] | null;
283
+ } | null;
284
+ }, void>;
285
+ /** Query for fetching a single vault with historical data */
286
+ declare const vaultWithHistoricalQuery: gql_tada.TadaDocumentNode<{
287
+ erc4626Vaults: {
288
+ items: ({
289
+ __typename?: "MorphoVault";
290
+ chain: {
291
+ id: number;
292
+ name: string;
293
+ icon: string;
294
+ };
295
+ vaultAddress: `0x${string}`;
296
+ name: string;
297
+ symbol: string;
298
+ decimals: number;
299
+ asset: {
300
+ address: `0x${string}`;
301
+ symbol: string;
302
+ name: string;
303
+ icon: string | null;
304
+ priceUsd: number | null;
305
+ decimals: number;
306
+ };
307
+ totalAssets: {
308
+ raw: bigint;
309
+ formatted: string;
310
+ usd: number | null;
311
+ };
312
+ apy: {
313
+ base: number;
314
+ total: number;
315
+ rewards: {
316
+ asset: {
317
+ symbol: string;
318
+ icon: string | null;
319
+ };
320
+ apr: number;
321
+ }[];
322
+ fee: number;
323
+ };
324
+ totalLiquidity: {
325
+ formatted: string;
326
+ usd: number | null;
327
+ };
328
+ v1PerformanceFee: number;
329
+ feeRecipientAddress: `0x${string}` | null;
330
+ ownerAddress: `0x${string}`;
331
+ curatorAddress: `0x${string}`;
332
+ guardianAddress: `0x${string}`;
333
+ metadata: {
334
+ description: string | null;
335
+ image: string | null;
336
+ forumLink: string | null;
337
+ curator: {
338
+ name: string;
339
+ image: string;
340
+ url: string;
341
+ } | null;
342
+ curators: {
343
+ name: string;
344
+ image: string;
345
+ url: string;
346
+ }[];
347
+ } | null;
348
+ marketAllocations: {
349
+ market: {
350
+ marketId: `0x${string}`;
351
+ name: string;
352
+ loanAsset: {
353
+ symbol: string;
354
+ icon: string | null;
355
+ };
356
+ collateralAsset: {
357
+ symbol: string;
358
+ icon: string | null;
359
+ } | null;
360
+ isIdle: boolean;
361
+ };
362
+ enabled: boolean;
363
+ supplyCap: {
364
+ formatted: string;
365
+ usd: number | null;
366
+ };
367
+ vaultSupplyShare: number;
368
+ marketSupplyShare: number;
369
+ position: {
370
+ supplyAmount: {
371
+ formatted: string;
372
+ usd: number | null;
373
+ };
374
+ };
375
+ }[];
376
+ riskAssessment: {
377
+ steakhouse: {
378
+ score: number;
379
+ rating: string;
380
+ } | null;
381
+ };
382
+ historical: {
383
+ daily: {
384
+ bucketTimestamp: number;
385
+ totalSupplied: {
386
+ formatted: string;
387
+ usd: number | null;
388
+ };
389
+ supplyApy7d: {
390
+ total: number;
391
+ };
392
+ }[];
393
+ } | null;
394
+ } | {
395
+ __typename?: "MorphoVaultV2";
396
+ chain: {
397
+ id: number;
398
+ name: string;
399
+ icon: string;
400
+ };
401
+ vaultAddress: `0x${string}`;
402
+ name: string;
403
+ symbol: string;
404
+ decimals: number;
405
+ asset: {
406
+ address: `0x${string}`;
407
+ symbol: string;
408
+ name: string;
409
+ icon: string | null;
410
+ priceUsd: number | null;
411
+ decimals: number;
412
+ };
413
+ totalAssets: {
414
+ raw: bigint;
415
+ formatted: string;
416
+ usd: number | null;
417
+ };
418
+ apy: {
419
+ base: number;
420
+ total: number;
421
+ rewards: {
422
+ asset: {
423
+ symbol: string;
424
+ icon: string | null;
425
+ };
426
+ apr: number;
427
+ }[];
428
+ fee: number;
429
+ };
430
+ curatorAddress: `0x${string}`;
431
+ ownerAddress: `0x${string}`;
432
+ metadata: {
433
+ description: string | null;
434
+ image: string | null;
435
+ forumLink: string | null;
436
+ curator: {
437
+ name: string;
438
+ image: string;
439
+ url: string;
440
+ } | null;
441
+ curators: {
442
+ name: string;
443
+ image: string;
444
+ url: string;
445
+ }[];
446
+ } | null;
447
+ liquidityAssets: {
448
+ formatted: string;
449
+ usd: number | null;
450
+ };
451
+ idleAssets: {
452
+ formatted: string;
453
+ usd: number | null;
454
+ };
455
+ v2PerformanceFee: {
456
+ formatted: string;
457
+ };
458
+ managementFee: {
459
+ formatted: string;
460
+ };
461
+ adapters: ({
462
+ __typename?: "MarketV1Adapter";
463
+ adapterAddress: `0x${string}`;
464
+ name: string | null;
465
+ } | {
466
+ __typename?: "BoxVaultAdapter";
467
+ } | {
468
+ __typename?: "UnknownAdapter";
469
+ } | {
470
+ __typename?: "VaultV1Adapter";
471
+ })[];
472
+ riskAssessment: {
473
+ steakhouse: {
474
+ score: number;
475
+ rating: string;
476
+ } | null;
477
+ };
478
+ historical: {
479
+ daily: {
480
+ bucketTimestamp: number;
481
+ totalSupplied: {
482
+ formatted: string;
483
+ usd: number | null;
484
+ };
485
+ supplyApy7d: {
486
+ total: number;
487
+ };
488
+ }[];
489
+ } | null;
490
+ } | {
491
+ __typename?: "BoxVault";
492
+ chain: {
493
+ id: number;
494
+ name: string;
495
+ icon: string;
496
+ };
497
+ vaultAddress: `0x${string}`;
498
+ name: string;
499
+ symbol: string;
500
+ decimals: number;
501
+ asset: {
502
+ address: `0x${string}`;
503
+ symbol: string;
504
+ name: string;
505
+ icon: string | null;
506
+ priceUsd: number | null;
507
+ decimals: number;
508
+ };
509
+ totalAssets: {
510
+ raw: bigint;
511
+ formatted: string;
512
+ usd: number | null;
513
+ };
514
+ apy: {
515
+ base: number;
516
+ total: number;
517
+ rewards: {
518
+ asset: {
519
+ symbol: string;
520
+ icon: string | null;
521
+ };
522
+ apr: number;
523
+ }[];
524
+ fee: number;
525
+ };
526
+ } | {
527
+ __typename?: "GenericErc4626Vault";
528
+ chain: {
529
+ id: number;
530
+ name: string;
531
+ icon: string;
532
+ };
533
+ vaultAddress: `0x${string}`;
534
+ name: string;
535
+ symbol: string;
536
+ decimals: number;
537
+ asset: {
538
+ address: `0x${string}`;
539
+ symbol: string;
540
+ name: string;
541
+ icon: string | null;
542
+ priceUsd: number | null;
543
+ decimals: number;
544
+ };
545
+ totalAssets: {
546
+ raw: bigint;
547
+ formatted: string;
548
+ usd: number | null;
549
+ };
550
+ apy: {
551
+ base: number;
552
+ total: number;
553
+ rewards: {
554
+ asset: {
555
+ symbol: string;
556
+ icon: string | null;
557
+ };
558
+ apr: number;
559
+ }[];
560
+ fee: number;
561
+ };
562
+ } | null)[];
563
+ };
564
+ }, {
565
+ where?: {
566
+ keys?: {
567
+ protocol: "morpho_v1" | "morpho_v2" | "generic" | "box";
568
+ vaultAddress: `0x${string}`;
569
+ chainId: number;
570
+ }[] | null;
571
+ } | null;
572
+ }, void>;
573
+ type GetDetailedVaultVariables = {
574
+ chainId: number;
575
+ address: Address;
576
+ /** Include historical data for charts (default: true) */
577
+ historical?: boolean;
578
+ };
579
+ /** Vault detail with Steakhouse metadata and optional historical data */
580
+ type DetailedVault = VaultDetail & {
581
+ historical?: VaultHistoricalData | null;
582
+ steakhouseMetadata: SteakhouseMetadata;
583
+ };
584
+ type GetDetailedVaultResult = DetailedVault | null;
585
+ /**
586
+ * Get full details for a single Steakhouse vault with optional historical data.
587
+ * Returns null if the vault is not in the whitelist.
588
+ */
589
+ declare function getDetailedVault(client: WhiskClient, variables: GetDetailedVaultVariables): Promise<GetDetailedVaultResult>;
590
+
591
+ export { type DetailedVault, type GetDetailedVaultResult, type GetDetailedVaultVariables, getDetailedVault, vaultQuery, vaultWithHistoricalQuery };
@@ -0,0 +1,92 @@
1
+ import { graphql } from "@whisk/graphql";
2
+ import { ALL_VAULTS } from "../metadata/vaults.js";
3
+ import { vaultDetailFragment } from "./fragments/vaultDetail.js";
4
+ import { buildSteakhouseMetadata } from "./steakhouseMetadata.js";
5
+ const vaultHistoricalFragment = graphql(`
6
+ fragment VaultHistoricalFragment on Erc4626Vault {
7
+ ... on MorphoVault {
8
+ historical {
9
+ daily {
10
+ bucketTimestamp
11
+ totalSupplied {
12
+ formatted
13
+ usd
14
+ }
15
+ supplyApy7d {
16
+ total
17
+ }
18
+ }
19
+ }
20
+ }
21
+ ... on MorphoVaultV2 {
22
+ historical {
23
+ daily {
24
+ bucketTimestamp
25
+ totalSupplied {
26
+ formatted
27
+ usd
28
+ }
29
+ supplyApy7d {
30
+ total
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ `);
37
+ const vaultQuery = graphql(
38
+ `
39
+ query GetVault($where: Erc4626VaultFilter) {
40
+ erc4626Vaults(where: $where, limit: 1) {
41
+ items {
42
+ ...VaultDetailFragment
43
+ }
44
+ }
45
+ }
46
+ `,
47
+ [vaultDetailFragment]
48
+ );
49
+ const vaultWithHistoricalQuery = graphql(
50
+ `
51
+ query GetVaultWithHistorical($where: Erc4626VaultFilter) {
52
+ erc4626Vaults(where: $where, limit: 1) {
53
+ items {
54
+ ...VaultDetailFragment
55
+ ...VaultHistoricalFragment
56
+ }
57
+ }
58
+ }
59
+ `,
60
+ [vaultDetailFragment, vaultHistoricalFragment]
61
+ );
62
+ async function getDetailedVault(client, variables) {
63
+ const { chainId, address, historical = true } = variables;
64
+ const vaultConfig = ALL_VAULTS.find(
65
+ (v) => v.chainId === chainId && v.address.toLowerCase() === address.toLowerCase() && !v.isHidden
66
+ );
67
+ if (!vaultConfig) {
68
+ return null;
69
+ }
70
+ const where = {
71
+ keys: [
72
+ {
73
+ chainId,
74
+ vaultAddress: address,
75
+ protocol: vaultConfig.protocol
76
+ }
77
+ ]
78
+ };
79
+ const query = historical ? vaultWithHistoricalQuery : vaultQuery;
80
+ const result = await client.query(query, { where });
81
+ const vault = result.erc4626Vaults.items[0];
82
+ if (!vault) {
83
+ return null;
84
+ }
85
+ return { ...vault, steakhouseMetadata: buildSteakhouseMetadata(vaultConfig) };
86
+ }
87
+ export {
88
+ getDetailedVault,
89
+ vaultQuery,
90
+ vaultWithHistoricalQuery
91
+ };
92
+ //# sourceMappingURL=getDetailedVault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/getDetailedVault.ts"],"sourcesContent":["import { graphql } from \"@whisk/graphql\"\nimport type { SteakhouseClient } from \"../client.js\"\nimport type { Address } from \"../metadata/types.js\"\nimport { ALL_VAULTS } from \"../metadata/vaults.js\"\nimport { type VaultDetail, vaultDetailFragment } from \"./fragments/vaultDetail.js\"\nimport { buildSteakhouseMetadata, type SteakhouseMetadata } from \"./steakhouseMetadata.js\"\n\n/** Historical data fragment for vault charts (works for both v1 and v2) */\nconst vaultHistoricalFragment = graphql(`\n fragment VaultHistoricalFragment on Erc4626Vault {\n ... on MorphoVault {\n historical {\n daily {\n bucketTimestamp\n totalSupplied {\n formatted\n usd\n }\n supplyApy7d {\n total\n }\n }\n }\n }\n ... on MorphoVaultV2 {\n historical {\n daily {\n bucketTimestamp\n totalSupplied {\n formatted\n usd\n }\n supplyApy7d {\n total\n }\n }\n }\n }\n }\n`)\n\n/** Historical data type extracted from the fragment */\ntype VaultHistoricalData = {\n daily: Array<{\n bucketTimestamp: number\n totalSupplied: { formatted: string; usd: number | null }\n supplyApy7d: { total: number }\n }>\n}\n\n/** Query for fetching a single vault without historical data */\nexport const vaultQuery = graphql(\n `\n query GetVault($where: Erc4626VaultFilter) {\n erc4626Vaults(where: $where, limit: 1) {\n items {\n ...VaultDetailFragment\n }\n }\n }\n `,\n [vaultDetailFragment],\n)\n\n/** Query for fetching a single vault with historical data */\nexport const vaultWithHistoricalQuery = graphql(\n `\n query GetVaultWithHistorical($where: Erc4626VaultFilter) {\n erc4626Vaults(where: $where, limit: 1) {\n items {\n ...VaultDetailFragment\n ...VaultHistoricalFragment\n }\n }\n }\n `,\n [vaultDetailFragment, vaultHistoricalFragment],\n)\n\nexport type GetDetailedVaultVariables = {\n chainId: number\n address: Address\n /** Include historical data for charts (default: true) */\n historical?: boolean\n}\n\n/** Vault detail with Steakhouse metadata and optional historical data */\nexport type DetailedVault = VaultDetail & {\n historical?: VaultHistoricalData | null\n steakhouseMetadata: SteakhouseMetadata\n}\n\nexport type GetDetailedVaultResult = DetailedVault | null\n\n/**\n * Get full details for a single Steakhouse vault with optional historical data.\n * Returns null if the vault is not in the whitelist.\n */\nexport async function getDetailedVault(\n client: SteakhouseClient,\n variables: GetDetailedVaultVariables,\n): Promise<GetDetailedVaultResult> {\n const { chainId, address, historical = true } = variables\n\n const vaultConfig = ALL_VAULTS.find(\n (v) =>\n v.chainId === chainId && v.address.toLowerCase() === address.toLowerCase() && !v.isHidden,\n )\n\n if (!vaultConfig) {\n return null\n }\n\n const where = {\n keys: [\n {\n chainId,\n vaultAddress: address,\n protocol: vaultConfig.protocol,\n },\n ],\n }\n const query = historical ? vaultWithHistoricalQuery : vaultQuery\n const result = await client.query(query, { where })\n const vault = result.erc4626Vaults.items[0]\n\n if (!vault) {\n return null\n }\n\n return { ...vault, steakhouseMetadata: buildSteakhouseMetadata(vaultConfig) }\n}\n"],"mappings":"AAAA,SAAS,eAAe;AAGxB,SAAS,kBAAkB;AAC3B,SAA2B,2BAA2B;AACtD,SAAS,+BAAwD;AAGjE,MAAM,0BAA0B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CA+BvC;AAYM,MAAM,aAAa;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,mBAAmB;AACtB;AAGO,MAAM,2BAA2B;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,CAAC,qBAAqB,uBAAuB;AAC/C;AAqBA,eAAsB,iBACpB,QACA,WACiC;AACjC,QAAM,EAAE,SAAS,SAAS,aAAa,KAAK,IAAI;AAEhD,QAAM,cAAc,WAAW;AAAA,IAC7B,CAAC,MACC,EAAE,YAAY,WAAW,EAAE,QAAQ,YAAY,MAAM,QAAQ,YAAY,KAAK,CAAC,EAAE;AAAA,EACrF;AAEA,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,MACJ;AAAA,QACE;AAAA,QACA,cAAc;AAAA,QACd,UAAU,YAAY;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,aAAa,2BAA2B;AACtD,QAAM,SAAS,MAAM,OAAO,MAAM,OAAO,EAAE,MAAM,CAAC;AAClD,QAAM,QAAQ,OAAO,cAAc,MAAM,CAAC;AAE1C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,OAAO,oBAAoB,wBAAwB,WAAW,EAAE;AAC9E;","names":[]}