@basedone/core 0.1.10 → 0.2.0

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 (53) hide show
  1. package/dist/chunk-4GAKANLT.mjs +1987 -0
  2. package/dist/chunk-4UEJOM6W.mjs +1 -3
  3. package/dist/chunk-VBC6EQ7Q.mjs +235 -0
  4. package/dist/client-CgmiTuEX.d.mts +179 -0
  5. package/dist/client-CgmiTuEX.d.ts +179 -0
  6. package/dist/ecommerce.d.mts +3732 -0
  7. package/dist/ecommerce.d.ts +3732 -0
  8. package/dist/ecommerce.js +2031 -0
  9. package/dist/ecommerce.mjs +2 -0
  10. package/dist/index.d.mts +51 -43
  11. package/dist/index.d.ts +51 -43
  12. package/dist/index.js +2691 -205
  13. package/dist/index.mjs +68 -90
  14. package/dist/{meta-FVJIMALT.mjs → meta-JB5ITE27.mjs} +4 -10
  15. package/dist/meta-UOGUG3OW.mjs +3 -7
  16. package/dist/{perpDexs-GGL32HT4.mjs → perpDexs-3LRJ5ZHM.mjs} +37 -8
  17. package/dist/{perpDexs-G7V2QIM6.mjs → perpDexs-4ISLD7NX.mjs} +177 -32
  18. package/dist/react.d.mts +39 -0
  19. package/dist/react.d.ts +39 -0
  20. package/dist/react.js +268 -0
  21. package/dist/react.mjs +31 -0
  22. package/dist/{spotMeta-OD7S6HGW.mjs → spotMeta-GHXX7C5M.mjs} +24 -9
  23. package/dist/{spotMeta-PCN4Z4R3.mjs → spotMeta-IBBUP2SG.mjs} +54 -6
  24. package/dist/staticMeta-GM7T3OYL.mjs +3 -6
  25. package/dist/staticMeta-QV2KMX57.mjs +3 -6
  26. package/ecommerce.ts +15 -0
  27. package/index.ts +6 -0
  28. package/lib/ecommerce/QUICK_REFERENCE.md +211 -0
  29. package/lib/ecommerce/README.md +385 -0
  30. package/lib/ecommerce/USAGE_EXAMPLES.md +704 -0
  31. package/lib/ecommerce/client/base.ts +272 -0
  32. package/lib/ecommerce/client/customer.ts +522 -0
  33. package/lib/ecommerce/client/merchant.ts +1341 -0
  34. package/lib/ecommerce/index.ts +51 -0
  35. package/lib/ecommerce/types/entities.ts +722 -0
  36. package/lib/ecommerce/types/enums.ts +270 -0
  37. package/lib/ecommerce/types/index.ts +18 -0
  38. package/lib/ecommerce/types/requests.ts +525 -0
  39. package/lib/ecommerce/types/responses.ts +805 -0
  40. package/lib/ecommerce/utils/errors.ts +113 -0
  41. package/lib/ecommerce/utils/helpers.ts +131 -0
  42. package/lib/hip3/market-info.ts +1 -1
  43. package/lib/instrument/client.ts +351 -0
  44. package/lib/meta/data/mainnet/perpDexs.json +34 -4
  45. package/lib/meta/data/mainnet/spotMeta.json +21 -3
  46. package/lib/meta/data/testnet/meta.json +1 -3
  47. package/lib/meta/data/testnet/perpDexs.json +174 -28
  48. package/lib/meta/data/testnet/spotMeta.json +51 -0
  49. package/lib/react/InstrumentProvider.tsx +69 -0
  50. package/lib/utils/flooredDateTime.ts +55 -0
  51. package/lib/utils/time.ts +51 -0
  52. package/package.json +37 -11
  53. package/react.ts +1 -0
@@ -1,4 +1,4 @@
1
- import "./chunk-4UEJOM6W.mjs";
1
+ import './chunk-4UEJOM6W.mjs';
2
2
 
3
3
  // lib/meta/data/testnet/perpDexs.json
4
4
  var perpDexs_default = [
@@ -294,6 +294,12 @@ var perpDexs_default = [
294
294
  feeRecipient: "0x40008f23a17a1ba9a6f25723a4d06bcd81c33426",
295
295
  assetToStreamingOiCap: [],
296
296
  subDeployers: [
297
+ [
298
+ "registerAsset",
299
+ [
300
+ "0xb26126e39214f9594802b59515f409479e202f3a"
301
+ ]
302
+ ],
297
303
  [
298
304
  "setOracle",
299
305
  [
@@ -449,79 +455,79 @@ var perpDexs_default = [
449
455
  assetToFundingMultiplier: [
450
456
  [
451
457
  "vntls:vANDRL",
452
- "0.0020000002"
458
+ "0.005000002"
453
459
  ],
454
460
  [
455
461
  "vntls:vANTHRPC",
456
- "0.0025507473"
462
+ "0.0171374751"
457
463
  ],
458
464
  [
459
465
  "vntls:vBYTED",
460
- "0.0024785789"
466
+ "0.0148191144"
461
467
  ],
462
468
  [
463
469
  "vntls:vCHAIN",
464
- "0.002"
470
+ "0.005"
465
471
  ],
466
472
  [
467
473
  "vntls:vCLUELY",
468
- "0.01"
474
+ "2.0"
469
475
  ],
470
476
  [
471
477
  "vntls:vCOLOSSAL",
472
- "0.01"
478
+ "2.0"
473
479
  ],
474
480
  [
475
481
  "vntls:vCURSOR",
476
- "0.01"
482
+ "2.0"
477
483
  ],
478
484
  [
479
485
  "vntls:vDBRICKS",
480
- "0.002004205"
486
+ "0.0050534663"
481
487
  ],
482
488
  [
483
489
  "vntls:vFIG",
484
- "0.01"
490
+ "2.0"
485
491
  ],
486
492
  [
487
493
  "vntls:vFIGAI",
488
- "0.0020037172"
494
+ "0.0050472398"
489
495
  ],
490
496
  [
491
497
  "vntls:vKRAKEN",
492
- "0.01"
498
+ "0.005"
493
499
  ],
494
500
  [
495
501
  "vntls:vNLINK",
496
- "0.01"
502
+ "2.0"
497
503
  ],
498
504
  [
499
505
  "vntls:vOAI",
500
- "0.01"
506
+ "2.0"
501
507
  ],
502
508
  [
503
509
  "vntls:vPERPLXT",
504
- "0.002539593"
510
+ "0.0167613111"
505
511
  ],
506
512
  [
507
513
  "vntls:vPOLY",
508
- "0.01"
514
+ "2.0"
509
515
  ],
510
516
  [
511
517
  "vntls:vRAMP",
512
- "0.0020037948"
518
+ "0.0050482304"
513
519
  ],
514
520
  [
515
521
  "vntls:vSPACEX",
516
- "0.0020003078"
522
+ "0.0050030981"
517
523
  ],
518
524
  [
519
525
  "vntls:vSTRIPE",
520
- "0.01"
526
+ "2.0"
521
527
  ],
522
528
  [
523
529
  "vntls:vXAI",
524
- "0.01"
530
+ "2.0"
525
531
  ]
526
532
  ]
527
533
  },
@@ -1544,6 +1550,7 @@ var perpDexs_default = [
1544
1550
  [
1545
1551
  "setOracle",
1546
1552
  [
1553
+ "0x897ee1987787a2cd302ea9d729e5c46ccd302afe",
1547
1554
  "0xa67b36947149a7f2312bffc9d1c859bf12029986"
1548
1555
  ]
1549
1556
  ]
@@ -2128,7 +2135,24 @@ var perpDexs_default = [
2128
2135
  deployer: "0x2e3ee3705913258c9a0ecb643571045343d77e1b",
2129
2136
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2130
2137
  feeRecipient: null,
2131
- assetToStreamingOiCap: [],
2138
+ assetToStreamingOiCap: [
2139
+ [
2140
+ "trve:CRZD",
2141
+ "3000000.0"
2142
+ ],
2143
+ [
2144
+ "trve:CS2",
2145
+ "3000000.0"
2146
+ ],
2147
+ [
2148
+ "trve:F1LN",
2149
+ "3000000.0"
2150
+ ],
2151
+ [
2152
+ "trve:PMRT",
2153
+ "3000000.0"
2154
+ ]
2155
+ ],
2132
2156
  subDeployers: [
2133
2157
  [
2134
2158
  "setOracle",
@@ -2171,7 +2195,16 @@ var perpDexs_default = [
2171
2195
  deployer: "0xb38a498cc3f358899a5a7ad67608271b679a4167",
2172
2196
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2173
2197
  feeRecipient: null,
2174
- assetToStreamingOiCap: [],
2198
+ assetToStreamingOiCap: [
2199
+ [
2200
+ "trv:POKE",
2201
+ "3000000.0"
2202
+ ],
2203
+ [
2204
+ "trv:ZARD",
2205
+ "3000000.0"
2206
+ ]
2207
+ ],
2175
2208
  subDeployers: [
2176
2209
  [
2177
2210
  "setOracle",
@@ -2482,7 +2515,16 @@ var perpDexs_default = [
2482
2515
  deployer: "0x9b4989cb2735a1ac906cd99648fe3d84ef4b4d2d",
2483
2516
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2484
2517
  feeRecipient: null,
2485
- assetToStreamingOiCap: [],
2518
+ assetToStreamingOiCap: [
2519
+ [
2520
+ "trov:NDTO",
2521
+ "3000000.0"
2522
+ ],
2523
+ [
2524
+ "trov:NTDO",
2525
+ "3000000.0"
2526
+ ]
2527
+ ],
2486
2528
  subDeployers: [
2487
2529
  [
2488
2530
  "setOracle",
@@ -2604,7 +2646,16 @@ var perpDexs_default = [
2604
2646
  deployer: "0xfe770a17e47717b2e43504cf8f00ced96cf00979",
2605
2647
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2606
2648
  feeRecipient: null,
2607
- assetToStreamingOiCap: [],
2649
+ assetToStreamingOiCap: [
2650
+ [
2651
+ "trvv:BIRKN",
2652
+ "3000000.0"
2653
+ ],
2654
+ [
2655
+ "trvv:WATCH",
2656
+ "3000000.0"
2657
+ ]
2658
+ ],
2608
2659
  subDeployers: [
2609
2660
  [
2610
2661
  "setOracle",
@@ -2623,7 +2674,16 @@ var perpDexs_default = [
2623
2674
  deployer: "0xaaf21c1d7e7da1604c85d3ea93268e91902ba41e",
2624
2675
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2625
2676
  feeRecipient: null,
2626
- assetToStreamingOiCap: [],
2677
+ assetToStreamingOiCap: [
2678
+ [
2679
+ "trvo:BIRKN",
2680
+ "3000000.0"
2681
+ ],
2682
+ [
2683
+ "trvo:WATCH",
2684
+ "3000000.0"
2685
+ ]
2686
+ ],
2627
2687
  subDeployers: [
2628
2688
  [
2629
2689
  "setOracle",
@@ -2642,7 +2702,20 @@ var perpDexs_default = [
2642
2702
  deployer: "0x27f9d24b907b86bce4d2cf1299248421391aa444",
2643
2703
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2644
2704
  feeRecipient: null,
2645
- assetToStreamingOiCap: [],
2705
+ assetToStreamingOiCap: [
2706
+ [
2707
+ "tvr:HRMES",
2708
+ "3000000.0"
2709
+ ],
2710
+ [
2711
+ "tvr:LVMH",
2712
+ "3000000.0"
2713
+ ],
2714
+ [
2715
+ "tvr:RCHMT",
2716
+ "3000000.0"
2717
+ ]
2718
+ ],
2646
2719
  subDeployers: [
2647
2720
  [
2648
2721
  "setOracle",
@@ -2661,7 +2734,20 @@ var perpDexs_default = [
2661
2734
  deployer: "0x2be16138a3ea12e09b38dae749f49accc735fded",
2662
2735
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2663
2736
  feeRecipient: null,
2664
- assetToStreamingOiCap: [],
2737
+ assetToStreamingOiCap: [
2738
+ [
2739
+ "torv:BRBY",
2740
+ "3000000.0"
2741
+ ],
2742
+ [
2743
+ "torv:KRING",
2744
+ "3000000.0"
2745
+ ],
2746
+ [
2747
+ "torv:PRADA",
2748
+ "3000000.0"
2749
+ ]
2750
+ ],
2665
2751
  subDeployers: [
2666
2752
  [
2667
2753
  "setOracle",
@@ -2680,7 +2766,20 @@ var perpDexs_default = [
2680
2766
  deployer: "0x5f120e2aed50caf06e89ece2de71c9f5d30bb866",
2681
2767
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2682
2768
  feeRecipient: null,
2683
- assetToStreamingOiCap: [],
2769
+ assetToStreamingOiCap: [
2770
+ [
2771
+ "tvro:CRPI",
2772
+ "3000000.0"
2773
+ ],
2774
+ [
2775
+ "tvro:GOOS",
2776
+ "3000000.0"
2777
+ ],
2778
+ [
2779
+ "tvro:MONC",
2780
+ "3000000.0"
2781
+ ]
2782
+ ],
2684
2783
  subDeployers: [
2685
2784
  [
2686
2785
  "setOracle",
@@ -2699,7 +2798,16 @@ var perpDexs_default = [
2699
2798
  deployer: "0xab8b0324d63cb39728f8c7502ff3b1a905ae8b0d",
2700
2799
  oracleUpdater: "0xec6c68168d9fd51bb078acc74722aeff14db220b",
2701
2800
  feeRecipient: null,
2702
- assetToStreamingOiCap: [],
2801
+ assetToStreamingOiCap: [
2802
+ [
2803
+ "tvor:CPRI",
2804
+ "3000000.0"
2805
+ ],
2806
+ [
2807
+ "tvor:TPR",
2808
+ "3000000.0"
2809
+ ]
2810
+ ],
2703
2811
  subDeployers: [
2704
2812
  [
2705
2813
  "setOracle",
@@ -2823,8 +2931,45 @@ var perpDexs_default = [
2823
2931
  deployerFeeScale: "1.0",
2824
2932
  lastDeployerFeeScaleChangeTime: "2025-12-02T11:35:58.687904841",
2825
2933
  assetToFundingMultiplier: []
2934
+ },
2935
+ {
2936
+ name: "wa",
2937
+ fullName: "wa:GDR Test DEX",
2938
+ deployer: "0x47515db2eab01758c740ab220352a34b8d5a3826",
2939
+ oracleUpdater: "0x47515db2eab01758c740ab220352a34b8d5a3826",
2940
+ feeRecipient: null,
2941
+ assetToStreamingOiCap: [],
2942
+ subDeployers: [
2943
+ [
2944
+ "setOracle",
2945
+ [
2946
+ "0x47515db2eab01758c740ab220352a34b8d5a3826"
2947
+ ]
2948
+ ]
2949
+ ],
2950
+ deployerFeeScale: "1.0",
2951
+ lastDeployerFeeScaleChangeTime: "2025-12-03T11:35:21.991486494",
2952
+ assetToFundingMultiplier: []
2953
+ },
2954
+ {
2955
+ name: "org",
2956
+ fullName: "org dex",
2957
+ deployer: "0xf5e2c3905c402ea494e71248c6c75338b9098cf6",
2958
+ oracleUpdater: "0xf5e2c3905c402ea494e71248c6c75338b9098cf6",
2959
+ feeRecipient: null,
2960
+ assetToStreamingOiCap: [],
2961
+ subDeployers: [
2962
+ [
2963
+ "setOracle",
2964
+ [
2965
+ "0xf5e2c3905c402ea494e71248c6c75338b9098cf6"
2966
+ ]
2967
+ ]
2968
+ ],
2969
+ deployerFeeScale: "1.0",
2970
+ lastDeployerFeeScaleChangeTime: "2025-12-05T11:15:20.928371793",
2971
+ assetToFundingMultiplier: []
2826
2972
  }
2827
2973
  ];
2828
- export {
2829
- perpDexs_default as default
2830
- };
2974
+
2975
+ export { perpDexs_default as default };
@@ -0,0 +1,39 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { SpotMeta } from '@nktkas/hyperliquid';
4
+ import { A as AllPerpsMeta, I as InstrumentClient } from './client-CgmiTuEX.mjs';
5
+
6
+ interface InstrumentsProviderProps {
7
+ spotMeta: SpotMeta;
8
+ allPerpsMeta: AllPerpsMeta;
9
+ children: ReactNode;
10
+ }
11
+ /**
12
+ * Provides InstrumentClient to the React tree.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <InstrumentsProvider spotMeta={spotMeta} allPerpsMeta={allPerpsMeta}>
17
+ * <App />
18
+ * </InstrumentsProvider>
19
+ * ```
20
+ */
21
+ declare function InstrumentsProvider({ spotMeta, allPerpsMeta, children, }: InstrumentsProviderProps): react_jsx_runtime.JSX.Element;
22
+ /**
23
+ * Access the InstrumentClient from context.
24
+ * Must be used within an InstrumentsProvider.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * const client = useInstruments();
29
+ * const btc = client.getInstrument("BTC");
30
+ * ```
31
+ */
32
+ declare function useInstruments(): InstrumentClient;
33
+ /**
34
+ * Access the InstrumentClient from context, returns null if not in provider.
35
+ * Useful for optional instrument access.
36
+ */
37
+ declare function useInstrumentsOptional(): InstrumentClient | null;
38
+
39
+ export { InstrumentsProvider, type InstrumentsProviderProps, useInstruments, useInstrumentsOptional };
@@ -0,0 +1,39 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { SpotMeta } from '@nktkas/hyperliquid';
4
+ import { A as AllPerpsMeta, I as InstrumentClient } from './client-CgmiTuEX.js';
5
+
6
+ interface InstrumentsProviderProps {
7
+ spotMeta: SpotMeta;
8
+ allPerpsMeta: AllPerpsMeta;
9
+ children: ReactNode;
10
+ }
11
+ /**
12
+ * Provides InstrumentClient to the React tree.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <InstrumentsProvider spotMeta={spotMeta} allPerpsMeta={allPerpsMeta}>
17
+ * <App />
18
+ * </InstrumentsProvider>
19
+ * ```
20
+ */
21
+ declare function InstrumentsProvider({ spotMeta, allPerpsMeta, children, }: InstrumentsProviderProps): react_jsx_runtime.JSX.Element;
22
+ /**
23
+ * Access the InstrumentClient from context.
24
+ * Must be used within an InstrumentsProvider.
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * const client = useInstruments();
29
+ * const btc = client.getInstrument("BTC");
30
+ * ```
31
+ */
32
+ declare function useInstruments(): InstrumentClient;
33
+ /**
34
+ * Access the InstrumentClient from context, returns null if not in provider.
35
+ * Useful for optional instrument access.
36
+ */
37
+ declare function useInstrumentsOptional(): InstrumentClient | null;
38
+
39
+ export { InstrumentsProvider, type InstrumentsProviderProps, useInstruments, useInstrumentsOptional };
package/dist/react.js ADDED
@@ -0,0 +1,268 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // lib/react/InstrumentProvider.tsx
7
+
8
+ // lib/instrument/client.ts
9
+ var AssetIdUtils = {
10
+ /**
11
+ * Calculate perp asset ID
12
+ * - Root dex: assetIndex (0, 1, 2, ...)
13
+ * - HIP3 dex: 100000 + dexIndex * 10000 + assetIndex
14
+ */
15
+ calcPerpAssetId(dexIndex, assetIndex) {
16
+ if (dexIndex === 0) return assetIndex;
17
+ return 1e5 + dexIndex * 1e4 + assetIndex;
18
+ },
19
+ /**
20
+ * Calculate spot asset ID: 10000 + pairIndex
21
+ */
22
+ calcSpotAssetId(pairIndex) {
23
+ return 1e4 + pairIndex;
24
+ },
25
+ /**
26
+ * Check if symbol is HIP3 format (contains ":")
27
+ */
28
+ isHip3Symbol(symbol) {
29
+ return symbol?.includes(":") ?? false;
30
+ },
31
+ /**
32
+ * Extract dex name from HIP3 symbol (e.g., "xyz:MSTR" -> "xyz")
33
+ */
34
+ extractDexName(symbol) {
35
+ if (!this.isHip3Symbol(symbol)) return void 0;
36
+ return symbol.split(":")[0];
37
+ }
38
+ };
39
+ var InstrumentClient = class {
40
+ constructor(spotMeta, allPerpsMeta) {
41
+ this.spotMeta = spotMeta;
42
+ this.allPerpsMeta = allPerpsMeta;
43
+ this.instruments = [];
44
+ // O(1) lookup maps for efficient retrieval
45
+ this.instrumentsBySymbol = /* @__PURE__ */ new Map();
46
+ this.instrumentsByCoin = /* @__PURE__ */ new Map();
47
+ this.instrumentsByAssetId = /* @__PURE__ */ new Map();
48
+ // Additional spot lookups (base token -> instrument)
49
+ this.spotByBaseToken = /* @__PURE__ */ new Map();
50
+ // Dex metadata map (dex name -> PerpsMeta)
51
+ // Key: "" for root dex, dex name for HIP3 (e.g., "xyz")
52
+ this.dexMetaMap = /* @__PURE__ */ new Map();
53
+ // Token index lookup for spot
54
+ this.spotTokensByIndex = /* @__PURE__ */ new Map();
55
+ }
56
+ /**
57
+ * Initialize the client by processing meta into instruments.
58
+ * Call this after construction to populate the instrument registry.
59
+ * @returns this for chaining
60
+ */
61
+ init() {
62
+ if (!this.spotMeta || !this.allPerpsMeta) {
63
+ throw new Error("SpotMeta and allPerpsMeta are required");
64
+ }
65
+ this.indexSpotTokens();
66
+ this.processPerpsInstruments();
67
+ this.processSpotInstruments();
68
+ return this;
69
+ }
70
+ // ===== Perps Meta Accessors =====
71
+ getAllPerpsMeta() {
72
+ return this.allPerpsMeta;
73
+ }
74
+ /**
75
+ * Get PerpsMeta for a specific dex
76
+ * @param dex - Dex name ("" for root dex, or HIP3 dex name)
77
+ */
78
+ getPerpDex(dex) {
79
+ return this.dexMetaMap.get(dex);
80
+ }
81
+ /**
82
+ * Get PerpsMeta by dex index in allPerpsMeta array
83
+ */
84
+ getPerpDexByIndex(index) {
85
+ return this.allPerpsMeta[index];
86
+ }
87
+ // ===== Instrument Accessors =====
88
+ /**
89
+ * Get all instruments
90
+ */
91
+ getAllInstruments() {
92
+ return this.instruments;
93
+ }
94
+ /**
95
+ * Get all perps instruments
96
+ */
97
+ getPerpsInstruments() {
98
+ return this.instruments.filter(
99
+ (i) => i.type === "futures"
100
+ );
101
+ }
102
+ getHip3Instruments() {
103
+ return this.instruments.filter(
104
+ (i) => i.type === "futures" && !!i.dex
105
+ );
106
+ }
107
+ /**
108
+ * Get all spot instruments
109
+ */
110
+ getSpotInstruments() {
111
+ return this.instruments.filter(
112
+ (i) => i.type === "spot"
113
+ );
114
+ }
115
+ /**
116
+ * Get instrument by symbol or coin (tries both)
117
+ * @param coinOrSymbol - Symbol (e.g., "BTC", "BTC/USDC") or coin (e.g., "@107")
118
+ */
119
+ getInstrument(coinOrSymbol) {
120
+ return this.instrumentsByCoin.get(coinOrSymbol) ?? this.instrumentsBySymbol.get(coinOrSymbol);
121
+ }
122
+ /**
123
+ * Get instrument by display symbol
124
+ * @param symbol - Display symbol (e.g., "BTC", "BTC/USDC", "xyz:MSTR")
125
+ */
126
+ getInstrumentBySymbol(symbol) {
127
+ return this.instrumentsBySymbol.get(symbol);
128
+ }
129
+ /**
130
+ * Get instrument by Hyperliquid API coin format
131
+ * @param coin - API coin name (e.g., "BTC", "@107", "xyz:MSTR")
132
+ */
133
+ getInstrumentByCoin(coin) {
134
+ return this.instrumentsByCoin.get(coin);
135
+ }
136
+ /**
137
+ * Get instrument by asset ID
138
+ * @param assetId - Numeric asset ID (e.g., 1 for perps, 10001 for spot)
139
+ */
140
+ getInstrumentByAssetId(assetId) {
141
+ return this.instrumentsByAssetId.get(assetId);
142
+ }
143
+ /**
144
+ * Get spot instrument by base token symbol
145
+ * @param baseSymbol - Base token symbol (e.g., "HYPE" to find "HYPE/USDC")
146
+ */
147
+ getSpotInstrumentByBaseToken(baseSymbol) {
148
+ return this.spotByBaseToken.get(baseSymbol);
149
+ }
150
+ /** Search instruments by symbol, coin, or assetId */
151
+ searchInstruments(query, type) {
152
+ return this.instruments.filter((i) => {
153
+ if (type && i.type !== type) return false;
154
+ return i.symbol.toLowerCase().includes(query.toLowerCase()) || i.coin.toLowerCase().includes(query.toLowerCase());
155
+ });
156
+ }
157
+ /**
158
+ * Get spot token by index
159
+ */
160
+ getSpotToken(index) {
161
+ return this.spotTokensByIndex.get(index);
162
+ }
163
+ // ===== Internal Processing =====
164
+ indexSpotTokens() {
165
+ for (const token of this.spotMeta.tokens) {
166
+ this.spotTokensByIndex.set(token.index, token);
167
+ }
168
+ }
169
+ processPerpsInstruments() {
170
+ for (let dexIndex = 0; dexIndex < this.allPerpsMeta.length; dexIndex++) {
171
+ const perpMeta = this.allPerpsMeta[dexIndex];
172
+ const dexName = this.extractDexNameFromMeta(perpMeta, dexIndex);
173
+ this.dexMetaMap.set(dexName, perpMeta);
174
+ const collateralToken = this.spotTokensByIndex.get(
175
+ perpMeta.collateralToken
176
+ );
177
+ const collateralTokenSymbol = collateralToken?.name ?? "USDC";
178
+ for (let assetIndex = 0; assetIndex < perpMeta.universe.length; assetIndex++) {
179
+ const info = perpMeta.universe[assetIndex];
180
+ const assetId = AssetIdUtils.calcPerpAssetId(dexIndex, assetIndex);
181
+ const instrument = {
182
+ assetId,
183
+ symbol: info.name,
184
+ coin: info.name,
185
+ szDecimals: info.szDecimals,
186
+ leverage: info.maxLeverage,
187
+ collateralTokenSymbol,
188
+ type: "futures",
189
+ isDelisted: info.isDelisted,
190
+ dex: AssetIdUtils.extractDexName(info.name),
191
+ collateralTokenIndex: perpMeta.collateralToken
192
+ };
193
+ this.addInstrument(instrument);
194
+ }
195
+ }
196
+ }
197
+ processSpotInstruments() {
198
+ const seenSymbols = /* @__PURE__ */ new Set();
199
+ for (const pair of this.spotMeta.universe) {
200
+ const [baseTokenIndex, quoteTokenIndex] = pair.tokens;
201
+ const baseToken = this.spotTokensByIndex.get(baseTokenIndex);
202
+ const quoteToken = this.spotTokensByIndex.get(quoteTokenIndex);
203
+ if (!baseToken || !quoteToken) continue;
204
+ const symbol = `${baseToken.name}/${quoteToken.name}`;
205
+ if (seenSymbols.has(symbol)) continue;
206
+ seenSymbols.add(symbol);
207
+ const assetId = AssetIdUtils.calcSpotAssetId(pair.index);
208
+ const instrument = {
209
+ assetId,
210
+ symbol,
211
+ coin: pair.name,
212
+ // e.g., "@107"
213
+ szDecimals: baseToken.szDecimals,
214
+ type: "spot",
215
+ baseToken,
216
+ quoteToken
217
+ };
218
+ this.addInstrument(instrument);
219
+ if (!this.spotByBaseToken.has(baseToken.name)) {
220
+ this.spotByBaseToken.set(baseToken.name, instrument);
221
+ }
222
+ }
223
+ }
224
+ addInstrument(instrument) {
225
+ this.instruments.push(instrument);
226
+ this.instrumentsBySymbol.set(instrument.symbol, instrument);
227
+ this.instrumentsByCoin.set(instrument.coin, instrument);
228
+ this.instrumentsByAssetId.set(instrument.assetId, instrument);
229
+ }
230
+ /**
231
+ * Extract dex name from PerpsMeta
232
+ * Root dex (index 0) returns "", HIP3 dexes return the dex name (e.g., "xyz")
233
+ */
234
+ extractDexNameFromMeta(perpMeta, dexIndex) {
235
+ if (dexIndex === 0) return "";
236
+ const firstAsset = perpMeta.universe[0];
237
+ if (!firstAsset) return "";
238
+ return AssetIdUtils.extractDexName(firstAsset.name) ?? "";
239
+ }
240
+ };
241
+ var InstrumentContext = react.createContext(null);
242
+ function InstrumentsProvider({
243
+ spotMeta,
244
+ allPerpsMeta,
245
+ children
246
+ }) {
247
+ const client = react.useMemo(
248
+ () => new InstrumentClient(spotMeta, allPerpsMeta).init(),
249
+ [spotMeta, allPerpsMeta]
250
+ );
251
+ return /* @__PURE__ */ jsxRuntime.jsx(InstrumentContext.Provider, { value: client, children });
252
+ }
253
+ function useInstruments() {
254
+ const client = react.useContext(InstrumentContext);
255
+ if (!client) {
256
+ throw new Error(
257
+ "useInstruments must be used within an InstrumentsProvider"
258
+ );
259
+ }
260
+ return client;
261
+ }
262
+ function useInstrumentsOptional() {
263
+ return react.useContext(InstrumentContext);
264
+ }
265
+
266
+ exports.InstrumentsProvider = InstrumentsProvider;
267
+ exports.useInstruments = useInstruments;
268
+ exports.useInstrumentsOptional = useInstrumentsOptional;