@basedone/core 0.0.6 → 0.0.8

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/dist/index.mjs CHANGED
@@ -542,6 +542,12 @@ function isHip3Symbol(symbol) {
542
542
  return symbol.includes(":");
543
543
  }
544
544
 
545
+ // import("./data/**/*/staticMeta.json") in lib/meta/metadata.ts
546
+ var globImport_data_staticMeta_json = __glob({
547
+ "./data/mainnet/staticMeta.json": () => import("./staticMeta-QV2KMX57.mjs"),
548
+ "./data/testnet/staticMeta.json": () => import("./staticMeta-GM7T3OYL.mjs")
549
+ });
550
+
545
551
  // import("./data/**/*/spotMeta.json") in lib/meta/metadata.ts
546
552
  var globImport_data_spotMeta_json = __glob({
547
553
  "./data/mainnet/spotMeta.json": () => import("./spotMeta-7IJT3W6H.mjs"),
@@ -561,12 +567,14 @@ var globImport_data_perpDexs_json = __glob({
561
567
  });
562
568
 
563
569
  // lib/meta/metadata.ts
570
+ var ROOT_DEX = "hyperliquid";
564
571
  var MetadataClient = class {
565
572
  constructor(config = {}) {
566
573
  // Core metadata
567
574
  this.spotMeta = null;
568
575
  this.perpsMeta = null;
569
576
  this.perpDexs = [];
577
+ this.staticMeta = null;
570
578
  // HIP-3 metadata cache
571
579
  this.hip3DexsMeta = /* @__PURE__ */ new Map();
572
580
  // Pre-computed lookup maps (populated on initialize)
@@ -585,12 +593,14 @@ var MetadataClient = class {
585
593
  this.dexNameToIndex = /* @__PURE__ */ new Map();
586
594
  // Lazy init flag
587
595
  this.initialized = false;
596
+ this.initializing = null;
588
597
  const transport = new HttpTransport({
589
598
  isTestnet: config.isTestnet ?? false
590
599
  });
591
600
  this.infoClient = new InfoClient({ transport });
592
601
  this.config = {
593
602
  ...config,
603
+ hip3Dexs: config.hip3Dexs?.filter((dex) => dex !== ROOT_DEX),
594
604
  useStaticFallback: config.useStaticFallback ?? true
595
605
  };
596
606
  this.isTestnet = config.isTestnet ?? false;
@@ -601,42 +611,67 @@ var MetadataClient = class {
601
611
  */
602
612
  async initialize() {
603
613
  if (this.initialized) return;
604
- if (this.config.onlyUseStaticFallback) {
605
- await this.loadStaticMetadata();
606
- this.buildLookupMaps();
607
- if (this.config.hip3Dexs && this.config.hip3Dexs.length > 0) {
608
- await Promise.all(
609
- this.config.hip3Dexs.map((dex) => this.loadHip3Metadata(dex))
610
- );
611
- }
612
- this.initialized = true;
613
- return;
614
- }
615
- try {
616
- [this.spotMeta, this.perpsMeta, this.perpDexs] = await Promise.all([
617
- this.infoClient.spotMeta(),
618
- this.infoClient.meta(),
619
- this.infoClient.perpDexs()
620
- ]);
621
- this.buildLookupMaps();
622
- if (this.config.hip3Dexs && this.config.hip3Dexs.length > 0) {
623
- await Promise.all(
624
- this.config.hip3Dexs.map((dex) => this.loadHip3Metadata(dex))
625
- );
626
- }
627
- this.initialized = true;
628
- } catch (error) {
629
- if (this.config.useStaticFallback) {
630
- console.warn(
631
- "Failed to fetch metadata from API, using static fallback data",
632
- error
633
- );
614
+ if (this.initializing) return this.initializing;
615
+ this.initializing = new Promise(async (resolve, reject) => {
616
+ await this.loadStaticMetaOverrides();
617
+ if (this.config.onlyUseStaticFallback) {
634
618
  await this.loadStaticMetadata();
635
619
  this.buildLookupMaps();
620
+ if (this.config.hip3Dexs && this.config.hip3Dexs.length > 0) {
621
+ await Promise.all(
622
+ this.config.hip3Dexs.map((dex) => this.loadHip3Metadata(dex))
623
+ );
624
+ }
625
+ resolve();
626
+ this.initialized = true;
627
+ return;
628
+ }
629
+ try {
630
+ [this.spotMeta, this.perpsMeta, this.perpDexs] = await Promise.all([
631
+ this.infoClient.spotMeta(),
632
+ this.infoClient.meta(),
633
+ this.infoClient.perpDexs()
634
+ ]);
635
+ this.buildLookupMaps();
636
+ if (this.config.hip3Dexs && this.config.hip3Dexs.length > 0) {
637
+ await Promise.all(
638
+ this.config.hip3Dexs.map((dex) => this.loadHip3Metadata(dex))
639
+ );
640
+ }
641
+ this.initialized = true;
642
+ resolve();
643
+ } catch (error) {
644
+ if (this.config.useStaticFallback) {
645
+ console.warn(
646
+ "Failed to fetch metadata from API, using static fallback data",
647
+ error
648
+ );
649
+ await this.loadStaticMetadata();
650
+ this.buildLookupMaps();
651
+ this.initialized = true;
652
+ resolve();
653
+ } else {
654
+ reject(error);
655
+ }
656
+ } finally {
636
657
  this.initialized = true;
637
- } else {
638
- throw error;
658
+ resolve();
639
659
  }
660
+ });
661
+ return this.initializing;
662
+ }
663
+ /**
664
+ * Load staticMeta.json for display overrides
665
+ * This is always loaded regardless of config.useStaticFallback
666
+ */
667
+ async loadStaticMetaOverrides() {
668
+ const network = this.isTestnet ? "testnet" : "mainnet";
669
+ try {
670
+ const staticMetaModule = await globImport_data_staticMeta_json(`./data/${network}/staticMeta.json`);
671
+ this.staticMeta = staticMetaModule.default;
672
+ } catch (error) {
673
+ console.warn(`Failed to load staticMeta.json for ${network}:`, error);
674
+ this.staticMeta = null;
640
675
  }
641
676
  }
642
677
  /**
@@ -645,14 +680,21 @@ var MetadataClient = class {
645
680
  async loadStaticMetadata() {
646
681
  const network = this.isTestnet ? "testnet" : "mainnet";
647
682
  try {
648
- const [spotMetaModule, perpsMetaModule, perpDexsModule] = await Promise.all([
683
+ const [
684
+ spotMetaModule,
685
+ perpsMetaModule,
686
+ perpDexsModule,
687
+ staticMetaModule
688
+ ] = await Promise.all([
649
689
  globImport_data_spotMeta_json(`./data/${network}/spotMeta.json`),
650
690
  globImport_data_meta_json(`./data/${network}/meta.json`),
651
- globImport_data_perpDexs_json(`./data/${network}/perpDexs.json`)
691
+ globImport_data_perpDexs_json(`./data/${network}/perpDexs.json`),
692
+ globImport_data_staticMeta_json(`./data/${network}/staticMeta.json`)
652
693
  ]);
653
694
  this.spotMeta = spotMetaModule.default;
654
695
  this.perpsMeta = perpsMetaModule.default;
655
696
  this.perpDexs = perpDexsModule.default;
697
+ this.staticMeta = staticMetaModule.default;
656
698
  console.warn(`Using static ${network} metadata`);
657
699
  } catch (error) {
658
700
  console.error(`Failed to load static ${network} metadata:`, error);
@@ -669,9 +711,14 @@ var MetadataClient = class {
669
711
  this.spotPairToMarket.clear();
670
712
  this.baseTokenToMarkets.clear();
671
713
  this.coinToMarket.clear();
672
- this.hip3SymbolToMarket.clear();
673
714
  this.dexNameToIndex.clear();
674
715
  this.quoteAssets = [];
716
+ console.info(
717
+ "[MetadataClient] Building lookup maps",
718
+ this.perpDexs,
719
+ this.perpsMeta,
720
+ this.spotMeta
721
+ );
675
722
  if (this.perpDexs) {
676
723
  this.perpDexs.forEach((dex, index) => {
677
724
  if (dex && dex.name) {
@@ -689,6 +736,15 @@ var MetadataClient = class {
689
736
  type: "perps",
690
737
  maxLeverage: market.maxLeverage
691
738
  };
739
+ const staticOverrides = this.staticMeta?.coins?.[market.name];
740
+ if (staticOverrides) {
741
+ if (staticOverrides.displayName) {
742
+ marketInfo.displayName = staticOverrides.displayName;
743
+ }
744
+ if (staticOverrides.imageUrl) {
745
+ marketInfo.imageUrl = staticOverrides.imageUrl;
746
+ }
747
+ }
692
748
  this.perpsSymbolToIndex.set(market.name.toUpperCase(), index);
693
749
  this.coinToMarket.set(market.name, marketInfo);
694
750
  });
@@ -713,6 +769,15 @@ var MetadataClient = class {
713
769
  baseToken,
714
770
  quoteToken
715
771
  };
772
+ const staticOverrides = this.staticMeta?.coins?.[coin];
773
+ if (staticOverrides) {
774
+ if (staticOverrides.displayName) {
775
+ marketInfo.displayName = staticOverrides.displayName;
776
+ }
777
+ if (staticOverrides.imageUrl) {
778
+ marketInfo.imageUrl = staticOverrides.imageUrl;
779
+ }
780
+ }
716
781
  const pairKey = `${baseToken.name}/${quoteToken.name}`.toUpperCase();
717
782
  this.spotPairToMarket.set(pairKey, marketInfo);
718
783
  this.coinToMarket.set(pairKey, marketInfo);
@@ -752,10 +817,22 @@ var MetadataClient = class {
752
817
  meta,
753
818
  assetContext: contexts,
754
819
  collateralTokenSymbol,
755
- dexFullName: dex?.full_name ?? dexName,
820
+ dexFullName: dex?.fullName ?? dexName,
756
821
  dexName: dex?.name ?? dexName,
757
822
  dexIndex
758
823
  };
824
+ const staticDexOverrides = this.staticMeta?.dexs?.[dexName];
825
+ if (staticDexOverrides) {
826
+ if (staticDexOverrides.displayName) {
827
+ dexInfo.displayName = staticDexOverrides.displayName;
828
+ }
829
+ if (staticDexOverrides.imageUrl) {
830
+ dexInfo.imageUrl = staticDexOverrides.imageUrl;
831
+ }
832
+ if (staticDexOverrides.accountName) {
833
+ dexInfo.accountName = staticDexOverrides.accountName;
834
+ }
835
+ }
759
836
  this.hip3DexsMeta.set(dexName, dexInfo);
760
837
  this.buildHip3MarketsForDex(dexName, dexInfo);
761
838
  return dexInfo;
@@ -778,8 +855,20 @@ var MetadataClient = class {
778
855
  type: "hip3",
779
856
  maxLeverage: market.maxLeverage,
780
857
  dexName,
781
- dexIndex: dexInfo.dexIndex
858
+ dexIndex: dexInfo.dexIndex,
859
+ dexDisplayName: dexInfo.displayName,
860
+ dexImageUrl: dexInfo.imageUrl
782
861
  };
862
+ const staticOverrides = this.staticMeta?.coins?.[symbol];
863
+ if (staticOverrides) {
864
+ if (staticOverrides.displayName) {
865
+ marketInfo.displayName = staticOverrides.displayName;
866
+ }
867
+ if (staticOverrides.imageUrl) {
868
+ marketInfo.imageUrl = staticOverrides.imageUrl;
869
+ }
870
+ }
871
+ console.info("[MetadataClient] caching market", symbol, marketInfo);
783
872
  this.coinToMarket.set(symbol, marketInfo);
784
873
  this.hip3SymbolToMarket.set(symbol, marketInfo);
785
874
  });
@@ -808,7 +897,7 @@ var MetadataClient = class {
808
897
  }
809
898
  let lookupKey = symbol.toUpperCase();
810
899
  if (!symbol.includes("/") && !symbol.includes("@")) {
811
- const perpsMarket = this.coinToMarket.get(lookupKey);
900
+ const perpsMarket = this.coinToMarket.get(symbol);
812
901
  if (perpsMarket?.type === "perps") {
813
902
  return perpsMarket;
814
903
  }
@@ -868,6 +957,7 @@ var MetadataClient = class {
868
957
  if (!dexName || !coinName) return null;
869
958
  let cachedMarket = this.hip3SymbolToMarket.get(symbol);
870
959
  if (cachedMarket) return cachedMarket;
960
+ console.warn("Missing market", symbol, this.hip3SymbolToMarket);
871
961
  const dexMeta = this.hip3DexsMeta.get(dexName);
872
962
  if (!dexMeta && this.config.lazyInit) {
873
963
  await this.loadHip3Metadata(dexName);
@@ -926,7 +1016,9 @@ var MetadataClient = class {
926
1016
  spotMeta: this.spotMeta,
927
1017
  perpsMeta: this.perpsMeta,
928
1018
  perpDexs: this.perpDexs,
929
- hip3DexsMeta: Object.fromEntries(this.hip3DexsMeta)
1019
+ hip3DexsMeta: Object.fromEntries(this.hip3DexsMeta),
1020
+ coinToMarket: Object.fromEntries(this.coinToMarket),
1021
+ hip3SymbolToMarket: Object.fromEntries(this.hip3SymbolToMarket)
930
1022
  };
931
1023
  }
932
1024
  /**
@@ -992,6 +1084,7 @@ export {
992
1084
  MetadataClient,
993
1085
  PUP_TOKEN_ADDRESS,
994
1086
  PUP_TOKEN_THRESHOLDS,
1087
+ ROOT_DEX,
995
1088
  TARGET_APPROVED_MAX_BUILDER_FEE,
996
1089
  TARGET_APPROVED_MAX_BUILDER_FEE_PERCENT,
997
1090
  TESTNET_USDC_SPOT_TOKEN,
@@ -0,0 +1,23 @@
1
+ import "./chunk-4UEJOM6W.mjs";
2
+
3
+ // lib/meta/data/testnet/staticMeta.json
4
+ var coins = {
5
+ "rrrrr:BTC": {
6
+ displayName: "BTCe"
7
+ }
8
+ };
9
+ var dexs = {
10
+ rrrrr: {
11
+ displayName: "Hyena",
12
+ accountName: "USDe Perps"
13
+ }
14
+ };
15
+ var staticMeta_default = {
16
+ coins,
17
+ dexs
18
+ };
19
+ export {
20
+ coins,
21
+ staticMeta_default as default,
22
+ dexs
23
+ };
@@ -0,0 +1,23 @@
1
+ import "./chunk-4UEJOM6W.mjs";
2
+
3
+ // lib/meta/data/testnet/staticMeta.json
4
+ var coins = {
5
+ "rrrrr:BTC": {
6
+ displayName: "BTCe"
7
+ }
8
+ };
9
+ var dexs = {
10
+ rrrrr: {
11
+ displayName: "Hyena",
12
+ accountName: "USDe"
13
+ }
14
+ };
15
+ var staticMeta_default = {
16
+ coins,
17
+ dexs
18
+ };
19
+ export {
20
+ coins,
21
+ staticMeta_default as default,
22
+ dexs
23
+ };
@@ -0,0 +1,24 @@
1
+ import "./chunk-4UEJOM6W.mjs";
2
+
3
+ // lib/meta/data/mainnet/staticMeta.json
4
+ var coins = {
5
+ "xyz:XYZ100": {
6
+ imageUrl: "https://app.based.one/hip3/xyz/xyz100.webp",
7
+ displayName: "Nasdaq-100"
8
+ }
9
+ };
10
+ var dexs = {
11
+ xyz: {
12
+ imageUrl: "",
13
+ displayName: "Stocks"
14
+ }
15
+ };
16
+ var staticMeta_default = {
17
+ coins,
18
+ dexs
19
+ };
20
+ export {
21
+ coins,
22
+ staticMeta_default as default,
23
+ dexs
24
+ };
@@ -0,0 +1,25 @@
1
+ import "./chunk-4UEJOM6W.mjs";
2
+
3
+ // lib/meta/data/mainnet/staticMeta.json
4
+ var coins = {
5
+ "xyz:XYZ100": {
6
+ imageUrl: "https://app.based.one/hip3/xyz/xyz100.webp",
7
+ displayName: "Nasdaq-100"
8
+ }
9
+ };
10
+ var dexs = {
11
+ xyz: {
12
+ imageUrl: "",
13
+ displayName: "Trade.xyz",
14
+ tags: ["Equities"]
15
+ }
16
+ };
17
+ var staticMeta_default = {
18
+ coins,
19
+ dexs
20
+ };
21
+ export {
22
+ coins,
23
+ staticMeta_default as default,
24
+ dexs
25
+ };
@@ -0,0 +1,25 @@
1
+ import "./chunk-4UEJOM6W.mjs";
2
+
3
+ // lib/meta/data/mainnet/staticMeta.json
4
+ var coins = {
5
+ "xyz:XYZ100": {
6
+ imageUrl: "https://app.based.one/hip3/xyz/xyz100.webp",
7
+ displayName: "Nasdaq-100"
8
+ }
9
+ };
10
+ var dexs = {
11
+ xyz: {
12
+ imageUrl: "",
13
+ displayName: "Trade.xyz",
14
+ accountName: "Equities"
15
+ }
16
+ };
17
+ var staticMeta_default = {
18
+ coins,
19
+ dexs
20
+ };
21
+ export {
22
+ coins,
23
+ staticMeta_default as default,
24
+ dexs
25
+ };
@@ -0,0 +1,22 @@
1
+ import "./chunk-4UEJOM6W.mjs";
2
+
3
+ // lib/meta/data/testnet/staticMeta.json
4
+ var coins = {
5
+ "rrrrr:BTC": {
6
+ displayName: "BTCe"
7
+ }
8
+ };
9
+ var dexs = {
10
+ rrrrr: {
11
+ displayName: "Hyena"
12
+ }
13
+ };
14
+ var staticMeta_default = {
15
+ coins,
16
+ dexs
17
+ };
18
+ export {
19
+ coins,
20
+ staticMeta_default as default,
21
+ dexs
22
+ };
@@ -0,0 +1,26 @@
1
+ {
2
+ "universe": [
3
+ {
4
+ "szDecimals": 4,
5
+ "name": "xyz:XYZ100",
6
+ "maxLeverage": 20,
7
+ "marginTableId": 20,
8
+ "onlyIsolated": true
9
+ }
10
+ ],
11
+ "marginTables": [
12
+ [
13
+ 50,
14
+ {
15
+ "description": "",
16
+ "marginTiers": [
17
+ {
18
+ "lowerBound": "0.0",
19
+ "maxLeverage": 50
20
+ }
21
+ ]
22
+ }
23
+ ]
24
+ ],
25
+ "collateralToken": 0
26
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "coins": {
3
+ "xyz:XYZ100": {
4
+ "imageUrl": "https://app.based.one/hip3/xyz/xyz100.webp",
5
+ "displayName": "Nasdaq-100"
6
+ }
7
+ },
8
+ "dexs": {
9
+ "xyz": {
10
+ "imageUrl": "",
11
+ "displayName": "Trade.xyz",
12
+ "accountName": "Equities"
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "coins": {
3
+ "rrrrr:BTC": {
4
+ "displayName": "BTCe"
5
+ }
6
+ },
7
+ "dexs": {
8
+ "rrrrr": {
9
+ "displayName": "Hyena",
10
+ "accountName": "USDe"
11
+ }
12
+ }
13
+ }