@basedone/core 0.1.8 → 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 (59) 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 +79 -4
  11. package/dist/index.d.ts +79 -4
  12. package/dist/index.js +3674 -331
  13. package/dist/index.mjs +107 -104
  14. package/dist/{meta-57AY44US.mjs → meta-JB5ITE27.mjs} +6 -14
  15. package/dist/{meta-RSZFFH63.mjs → meta-UOGUG3OW.mjs} +5 -11
  16. package/dist/{perpDexs-PBKWKKQU.mjs → perpDexs-3LRJ5ZHM.mjs} +100 -13
  17. package/dist/{perpDexs-XSB4Y2BP.mjs → perpDexs-4ISLD7NX.mjs} +798 -121
  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-WQ4PXRNY.mjs → spotMeta-GHXX7C5M.mjs} +85 -14
  23. package/dist/{spotMeta-Y7G2GI7B.mjs → spotMeta-IBBUP2SG.mjs} +249 -12
  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 +7 -0
  28. package/lib/cloid/cloid.ts +2 -0
  29. package/lib/ecommerce/QUICK_REFERENCE.md +211 -0
  30. package/lib/ecommerce/README.md +385 -0
  31. package/lib/ecommerce/USAGE_EXAMPLES.md +704 -0
  32. package/lib/ecommerce/client/base.ts +272 -0
  33. package/lib/ecommerce/client/customer.ts +522 -0
  34. package/lib/ecommerce/client/merchant.ts +1341 -0
  35. package/lib/ecommerce/index.ts +51 -0
  36. package/lib/ecommerce/types/entities.ts +722 -0
  37. package/lib/ecommerce/types/enums.ts +270 -0
  38. package/lib/ecommerce/types/index.ts +18 -0
  39. package/lib/ecommerce/types/requests.ts +525 -0
  40. package/lib/ecommerce/types/responses.ts +805 -0
  41. package/lib/ecommerce/utils/errors.ts +113 -0
  42. package/lib/ecommerce/utils/helpers.ts +131 -0
  43. package/lib/fee.ts +10 -10
  44. package/lib/hip3/market-info.ts +36 -8
  45. package/lib/hip3/utils.ts +15 -2
  46. package/lib/instrument/client.ts +351 -0
  47. package/lib/meta/data/mainnet/meta.json +2 -4
  48. package/lib/meta/data/mainnet/perpDexs.json +97 -9
  49. package/lib/meta/data/mainnet/spotMeta.json +82 -8
  50. package/lib/meta/data/testnet/meta.json +3 -7
  51. package/lib/meta/data/testnet/perpDexs.json +795 -117
  52. package/lib/meta/data/testnet/spotMeta.json +246 -6
  53. package/lib/meta/metadata.ts +8 -1
  54. package/lib/meta/types.ts +36 -0
  55. package/lib/react/InstrumentProvider.tsx +69 -0
  56. package/lib/utils/flooredDateTime.ts +55 -0
  57. package/lib/utils/time.ts +51 -0
  58. package/package.json +37 -11
  59. package/react.ts +1 -0
@@ -10547,6 +10547,123 @@
10547
10547
  "name": "@1366",
10548
10548
  "index": 1366,
10549
10549
  "isCanonical": false
10550
+ },
10551
+ {
10552
+ "tokens": [
10553
+ 1487,
10554
+ 0
10555
+ ],
10556
+ "name": "@1368",
10557
+ "index": 1368,
10558
+ "isCanonical": false
10559
+ },
10560
+ {
10561
+ "tokens": [
10562
+ 1485,
10563
+ 0
10564
+ ],
10565
+ "name": "@1369",
10566
+ "index": 1369,
10567
+ "isCanonical": false
10568
+ },
10569
+ {
10570
+ "tokens": [
10571
+ 1490,
10572
+ 0
10573
+ ],
10574
+ "name": "@1370",
10575
+ "index": 1370,
10576
+ "isCanonical": false
10577
+ },
10578
+ {
10579
+ "tokens": [
10580
+ 1481,
10581
+ 0
10582
+ ],
10583
+ "name": "@1371",
10584
+ "index": 1371,
10585
+ "isCanonical": false
10586
+ },
10587
+ {
10588
+ "tokens": [
10589
+ 1484,
10590
+ 0
10591
+ ],
10592
+ "name": "@1372",
10593
+ "index": 1372,
10594
+ "isCanonical": false
10595
+ },
10596
+ {
10597
+ "tokens": [
10598
+ 1477,
10599
+ 1452
10600
+ ],
10601
+ "name": "@1373",
10602
+ "index": 1373,
10603
+ "isCanonical": false
10604
+ },
10605
+ {
10606
+ "tokens": [
10607
+ 1492,
10608
+ 0
10609
+ ],
10610
+ "name": "@1374",
10611
+ "index": 1374,
10612
+ "isCanonical": false
10613
+ },
10614
+ {
10615
+ "tokens": [
10616
+ 1469,
10617
+ 0
10618
+ ],
10619
+ "name": "@1375",
10620
+ "index": 1375,
10621
+ "isCanonical": false
10622
+ },
10623
+ {
10624
+ "tokens": [
10625
+ 1,
10626
+ 1295
10627
+ ],
10628
+ "name": "@1376",
10629
+ "index": 1376,
10630
+ "isCanonical": true
10631
+ },
10632
+ {
10633
+ "tokens": [
10634
+ 1493,
10635
+ 0
10636
+ ],
10637
+ "name": "@1377",
10638
+ "index": 1377,
10639
+ "isCanonical": false
10640
+ },
10641
+ {
10642
+ "tokens": [
10643
+ 1105,
10644
+ 1493
10645
+ ],
10646
+ "name": "@1378",
10647
+ "index": 1378,
10648
+ "isCanonical": false
10649
+ },
10650
+ {
10651
+ "tokens": [
10652
+ 1498,
10653
+ 0
10654
+ ],
10655
+ "name": "@1379",
10656
+ "index": 1379,
10657
+ "isCanonical": false
10658
+ },
10659
+ {
10660
+ "tokens": [
10661
+ 1498,
10662
+ 1452
10663
+ ],
10664
+ "name": "@1380",
10665
+ "index": 1380,
10666
+ "isCanonical": false
10550
10667
  }
10551
10668
  ],
10552
10669
  "tokens": [
@@ -27088,7 +27205,10 @@
27088
27205
  "index": 1469,
27089
27206
  "tokenId": "0x8e670650571a3ce604ece184eaaf01c0",
27090
27207
  "isCanonical": false,
27091
- "evmContract": null,
27208
+ "evmContract": {
27209
+ "address": "0x03d7cd2d64de683e07f24fd857367d7492c85b22",
27210
+ "evm_extra_wei_decimals": 10
27211
+ },
27092
27212
  "fullName": null,
27093
27213
  "deployerTradingFeeShare": "1.0"
27094
27214
  },
@@ -27244,7 +27364,10 @@
27244
27364
  "index": 1481,
27245
27365
  "tokenId": "0x21a4632b44112fe0593fccbe5400a701",
27246
27366
  "isCanonical": false,
27247
- "evmContract": null,
27367
+ "evmContract": {
27368
+ "address": "0xed40d1ab429ff92ad66935766fb0f7025125b520",
27369
+ "evm_extra_wei_decimals": 4
27370
+ },
27248
27371
  "fullName": null,
27249
27372
  "deployerTradingFeeShare": "1.0"
27250
27373
  },
@@ -27280,7 +27403,10 @@
27280
27403
  "index": 1484,
27281
27404
  "tokenId": "0x57df584e21097424d758b228e842d2ef",
27282
27405
  "isCanonical": false,
27283
- "evmContract": null,
27406
+ "evmContract": {
27407
+ "address": "0xe04532bd84a7ee59599a90512a8fcc8484b546b5",
27408
+ "evm_extra_wei_decimals": 10
27409
+ },
27284
27410
  "fullName": null,
27285
27411
  "deployerTradingFeeShare": "1.0"
27286
27412
  },
@@ -27291,7 +27417,10 @@
27291
27417
  "index": 1485,
27292
27418
  "tokenId": "0x797f444bb03c7be19234b94ca29f3410",
27293
27419
  "isCanonical": false,
27294
- "evmContract": null,
27420
+ "evmContract": {
27421
+ "address": "0x2af50e43e313cfab0e7f46ac95106991cd9baea8",
27422
+ "evm_extra_wei_decimals": 10
27423
+ },
27295
27424
  "fullName": "STABLE",
27296
27425
  "deployerTradingFeeShare": "1.0"
27297
27426
  },
@@ -27313,7 +27442,10 @@
27313
27442
  "index": 1487,
27314
27443
  "tokenId": "0xd55b27dcaed90223bfc3c378b98526bb",
27315
27444
  "isCanonical": false,
27316
- "evmContract": null,
27445
+ "evmContract": {
27446
+ "address": "0xed3eb348853a670e3bb692dd5e654ad51c2f5128",
27447
+ "evm_extra_wei_decimals": 10
27448
+ },
27317
27449
  "fullName": "MONARCH TEST 1",
27318
27450
  "deployerTradingFeeShare": "1.0"
27319
27451
  },
@@ -27335,9 +27467,117 @@
27335
27467
  "index": 1489,
27336
27468
  "tokenId": "0x398e2bab402c7f3c9e214d3862d02ada",
27337
27469
  "isCanonical": false,
27338
- "evmContract": null,
27470
+ "evmContract": {
27471
+ "address": "0x000000000000780555bd0bca3791f89f9542c2d6",
27472
+ "evm_extra_wei_decimals": 10
27473
+ },
27339
27474
  "fullName": "They HYPE beta",
27340
27475
  "deployerTradingFeeShare": "1.0"
27476
+ },
27477
+ {
27478
+ "name": "PP",
27479
+ "szDecimals": 2,
27480
+ "weiDecimals": 8,
27481
+ "index": 1490,
27482
+ "tokenId": "0xc7a956f1c1174545c713707d2ca67b76",
27483
+ "isCanonical": false,
27484
+ "evmContract": {
27485
+ "address": "0x1fc9929be618ede69b1f71a69440165c885acadc",
27486
+ "evm_extra_wei_decimals": 10
27487
+ },
27488
+ "fullName": "smol pp",
27489
+ "deployerTradingFeeShare": "1.0"
27490
+ },
27491
+ {
27492
+ "name": "SLIM",
27493
+ "szDecimals": 2,
27494
+ "weiDecimals": 8,
27495
+ "index": 1491,
27496
+ "tokenId": "0x45754dd4d3bb5517fa92dbbe8ccb6392",
27497
+ "isCanonical": false,
27498
+ "evmContract": {
27499
+ "address": "0x719d4dee0fbefebbfbc837b2347840684b891916",
27500
+ "evm_extra_wei_decimals": 10
27501
+ },
27502
+ "fullName": "The Real Slim Shady",
27503
+ "deployerTradingFeeShare": "1.0"
27504
+ },
27505
+ {
27506
+ "name": "USDZ",
27507
+ "szDecimals": 2,
27508
+ "weiDecimals": 8,
27509
+ "index": 1492,
27510
+ "tokenId": "0x7f8d334fed99e32ccc7d1ef50af5f246",
27511
+ "isCanonical": false,
27512
+ "evmContract": null,
27513
+ "fullName": "Z Test Token",
27514
+ "deployerTradingFeeShare": "1.0"
27515
+ },
27516
+ {
27517
+ "name": "TUSDC",
27518
+ "szDecimals": 2,
27519
+ "weiDecimals": 8,
27520
+ "index": 1493,
27521
+ "tokenId": "0xa8469cf6df9c92f729a4bfa0f3643479",
27522
+ "isCanonical": false,
27523
+ "evmContract": null,
27524
+ "fullName": "USDC Coin",
27525
+ "deployerTradingFeeShare": "0.0"
27526
+ },
27527
+ {
27528
+ "name": "MQVMJW",
27529
+ "szDecimals": 1,
27530
+ "weiDecimals": 9,
27531
+ "index": 1494,
27532
+ "tokenId": "0x202ec473e3100aac31d517c0a673ceaf",
27533
+ "isCanonical": false,
27534
+ "evmContract": null,
27535
+ "fullName": "$WASH launchpad 2025-12-01T19:17:15.851Z",
27536
+ "deployerTradingFeeShare": "1.0"
27537
+ },
27538
+ {
27539
+ "name": "TSQEBL",
27540
+ "szDecimals": 1,
27541
+ "weiDecimals": 10,
27542
+ "index": 1495,
27543
+ "tokenId": "0x5d05f06a9590464cf3555a30d2d8ffd4",
27544
+ "isCanonical": false,
27545
+ "evmContract": null,
27546
+ "fullName": "$WASH launchpad 2025-12-02T20:17:18.214Z",
27547
+ "deployerTradingFeeShare": "1.0"
27548
+ },
27549
+ {
27550
+ "name": "RNSZPK",
27551
+ "szDecimals": 0,
27552
+ "weiDecimals": 10,
27553
+ "index": 1496,
27554
+ "tokenId": "0x699de51e4fc0e6d7a6e450d2c3d92a1a",
27555
+ "isCanonical": false,
27556
+ "evmContract": null,
27557
+ "fullName": "$WASH launchpad 2025-12-04T03:17:21.132Z",
27558
+ "deployerTradingFeeShare": "1.0"
27559
+ },
27560
+ {
27561
+ "name": "VENAHX",
27562
+ "szDecimals": 1,
27563
+ "weiDecimals": 9,
27564
+ "index": 1497,
27565
+ "tokenId": "0x43513901b952fcb6d8d5697ce17fa58f",
27566
+ "isCanonical": false,
27567
+ "evmContract": null,
27568
+ "fullName": "$WASH launchpad 2025-12-05T10:17:24.096Z",
27569
+ "deployerTradingFeeShare": "1.0"
27570
+ },
27571
+ {
27572
+ "name": "LMB",
27573
+ "szDecimals": 2,
27574
+ "weiDecimals": 8,
27575
+ "index": 1498,
27576
+ "tokenId": "0x9f416264220c915ec41b6c4c0b11fab1",
27577
+ "isCanonical": false,
27578
+ "evmContract": null,
27579
+ "fullName": "LMB",
27580
+ "deployerTradingFeeShare": "1.0"
27341
27581
  }
27342
27582
  ]
27343
27583
  }
@@ -2,12 +2,12 @@ import {
2
2
  HttpTransport,
3
3
  InfoClient,
4
4
  PerpsAssetCtx,
5
- PerpsMeta,
6
5
  SpotMeta,
7
6
  SpotToken,
8
7
  } from "@nktkas/hyperliquid";
9
8
  import { isHip3Symbol } from "../hip3/utils";
10
9
  import type { Hex } from "@nktkas/hyperliquid/types";
10
+ import type { PerpsMeta } from "./types";
11
11
 
12
12
  export interface PerpDex {
13
13
  /** Short name of the perpetual dex. */
@@ -48,6 +48,8 @@ export interface MarketInfo {
48
48
  dexDisplayName?: string; // Display name override for the DEX
49
49
  dexImageUrl?: string; // Image URL override for the DEX
50
50
  dexCollateralTokenSymbol?: string; // Collateral token symbol for HIP-3 markets
51
+
52
+ growthMode: boolean; // Whether the market is in growth mode
51
53
  }
52
54
 
53
55
  export interface DexInfo {
@@ -130,6 +132,7 @@ interface MetadataClientConfig {
130
132
  */
131
133
  export const ROOT_DEX = "hyperliquid";
132
134
 
135
+ /**@deprecated use react sdk instead */
133
136
  export class MetadataClient {
134
137
  private infoClient: InfoClient;
135
138
  private config: MetadataClientConfig;
@@ -359,6 +362,7 @@ export class MetadataClient {
359
362
  szDecimals: market.szDecimals,
360
363
  type: "perps",
361
364
  maxLeverage: market.maxLeverage,
365
+ growthMode: market.growthMode === "enabled",
362
366
  };
363
367
 
364
368
  // Apply static metadata overrides for perps
@@ -410,6 +414,7 @@ export class MetadataClient {
410
414
  type: "spot",
411
415
  baseToken: baseToken,
412
416
  quoteToken: quoteToken,
417
+ growthMode: false,
413
418
  };
414
419
 
415
420
  // Apply static metadata overrides for spot
@@ -545,6 +550,7 @@ export class MetadataClient {
545
550
  dexDisplayName: dexInfo.displayName,
546
551
  dexImageUrl: dexInfo.imageUrl,
547
552
  dexCollateralTokenSymbol: dexInfo.collateralTokenSymbol,
553
+ growthMode: market.growthMode === "enabled",
548
554
  };
549
555
 
550
556
  // Apply static metadata overrides for HIP-3
@@ -648,6 +654,7 @@ export class MetadataClient {
648
654
  szDecimals: market.szDecimals,
649
655
  type: "perps",
650
656
  maxLeverage: market.maxLeverage,
657
+ growthMode: market.growthMode === "enabled",
651
658
  };
652
659
  }
653
660
 
@@ -0,0 +1,36 @@
1
+ import { MarginTables, PerpsAssetCtx } from "@nktkas/hyperliquid";
2
+
3
+ export interface PerpsMeta {
4
+ /** Trading universes available for perpetual trading. */
5
+ universe: PerpsUniverse[];
6
+ /** Margin requirement tables for different leverage tiers. */
7
+ marginTables: MarginTables;
8
+ /** Collateral token index. */
9
+ collateralToken?: number;
10
+ }
11
+ /** Metadata and context for perpetual assets. */
12
+ export type PerpsMetaAndAssetCtxs = [
13
+ /** Metadata for assets. */
14
+ PerpsMeta,
15
+ /** Context for each perpetual asset. */
16
+ PerpsAssetCtx[],
17
+ ];
18
+ /** Trading universe parameters for perpetual assets. */
19
+ export interface PerpsUniverse {
20
+ /** Minimum decimal places for order sizes. */
21
+ szDecimals: number;
22
+ /** Name of the universe. */
23
+ name: string;
24
+ /** Maximum allowed leverage. */
25
+ maxLeverage: number;
26
+ /** Unique identifier for the margin requirements table. */
27
+ marginTableId: number;
28
+ /** Indicates if only isolated margin trading is allowed. */
29
+ onlyIsolated?: true;
30
+ /** Indicates if the universe is delisted. */
31
+ isDelisted?: true;
32
+ /** Indicates if the universe is in growth mode, eligible for discounted fees */
33
+ growthMode?: "enabled";
34
+ /** Margin mode for the universe. */
35
+ marginMode?: "strictIsolated" | "noCross";
36
+ }
@@ -0,0 +1,69 @@
1
+ "use client";
2
+
3
+ import { createContext, useContext, useMemo, type ReactNode } from "react";
4
+ import { SpotMeta } from "@nktkas/hyperliquid";
5
+ import { AllPerpsMeta } from "../hip3/market-info";
6
+ import { InstrumentClient } from "../instrument/client";
7
+
8
+ const InstrumentContext = createContext<InstrumentClient | null>(null);
9
+
10
+ export interface InstrumentsProviderProps {
11
+ spotMeta: SpotMeta;
12
+ allPerpsMeta: AllPerpsMeta;
13
+ children: ReactNode;
14
+ }
15
+
16
+ /**
17
+ * Provides InstrumentClient to the React tree.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * <InstrumentsProvider spotMeta={spotMeta} allPerpsMeta={allPerpsMeta}>
22
+ * <App />
23
+ * </InstrumentsProvider>
24
+ * ```
25
+ */
26
+ export function InstrumentsProvider({
27
+ spotMeta,
28
+ allPerpsMeta,
29
+ children,
30
+ }: InstrumentsProviderProps) {
31
+ const client = useMemo(
32
+ () => new InstrumentClient(spotMeta, allPerpsMeta).init(),
33
+ [spotMeta, allPerpsMeta],
34
+ );
35
+
36
+ return (
37
+ <InstrumentContext.Provider value={client}>
38
+ {children}
39
+ </InstrumentContext.Provider>
40
+ );
41
+ }
42
+
43
+ /**
44
+ * Access the InstrumentClient from context.
45
+ * Must be used within an InstrumentsProvider.
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const client = useInstruments();
50
+ * const btc = client.getInstrument("BTC");
51
+ * ```
52
+ */
53
+ export function useInstruments(): InstrumentClient {
54
+ const client = useContext(InstrumentContext);
55
+ if (!client) {
56
+ throw new Error(
57
+ "useInstruments must be used within an InstrumentsProvider",
58
+ );
59
+ }
60
+ return client;
61
+ }
62
+
63
+ /**
64
+ * Access the InstrumentClient from context, returns null if not in provider.
65
+ * Useful for optional instrument access.
66
+ */
67
+ export function useInstrumentsOptional(): InstrumentClient | null {
68
+ return useContext(InstrumentContext);
69
+ }
@@ -0,0 +1,55 @@
1
+ // ====== UTC-only rounding utilities ======
2
+
3
+ type RoundMode = 'floor' | 'round' | 'ceil';
4
+
5
+ const MIN = 60_000;
6
+ const HOUR = 60 * MIN;
7
+ const DAY = 24 * HOUR;
8
+ const WEEK = 7 * DAY;
9
+
10
+ const opOf = (m: RoundMode) => m === 'ceil' ? Math.ceil : m === 'round' ? Math.round : Math.floor;
11
+
12
+ interface UtcRoundOptions {
13
+ mode?: RoundMode; // default 'floor'
14
+ weekStartsOn?: 0|1|2|3|4|5|6; // only used if stepMs % WEEK === 0; 0=Sun..6=Sat
15
+ anchorUtc?: number; // custom UTC anchor (ms). Default 0 or computed for weekStartsOn
16
+ }
17
+
18
+ /**
19
+ * Higher-order UTC rounder.
20
+ * Snaps an instant t to the UTC grid defined by (anchorUtc + k*stepMs).
21
+ * Formula: anchor + step * op((t - anchor)/step)
22
+ */
23
+ export function makeUtcRounder(stepMs: number, opts: UtcRoundOptions = {}) {
24
+ const mode = opts.mode ?? 'floor';
25
+ const op = opOf(mode);
26
+
27
+ // Determine anchor in UTC millis
28
+ let anchorUtc = opts.anchorUtc ?? 0;
29
+
30
+ // If weekly and weekStartsOn provided, anchor to the desired weekday at 00:00 UTC
31
+ if (stepMs % WEEK === 0 && opts.weekStartsOn !== undefined) {
32
+ // 1970-01-04T00:00:00Z was a Sunday in UTC
33
+ const sundayUTC = Date.UTC(1970, 0, 4);
34
+ anchorUtc = sundayUTC + opts.weekStartsOn * DAY; // e.g., 1 => Monday, 2 => Tuesday, etc.
35
+ }
36
+
37
+ return (t: Date): Date => {
38
+ const ts = t.getTime(); // UTC ms
39
+ const snapped = op((ts - anchorUtc) / stepMs) * stepMs + anchorUtc;
40
+ return new Date(snapped);
41
+ };
42
+ }
43
+
44
+ // ---------- Convenience helpers (UTC) ----------
45
+
46
+ // Floor to arbitrary minute step (UTC)
47
+ export const floorUtcMinutes = (stepMinutes: number) =>
48
+ makeUtcRounder(stepMinutes * MIN, { mode: 'floor' });
49
+
50
+ // Floor to hour/day/week (UTC)
51
+ export const floorUtcHour = () => makeUtcRounder(HOUR, { mode: 'floor' });
52
+ export const floorUtcDay = () => makeUtcRounder(DAY, { mode: 'floor' });
53
+ export const floorUtcWeek = (weekStartsOn: 0|1|2|3|4|5|6 = 1) =>
54
+ makeUtcRounder(WEEK, { mode: 'floor', weekStartsOn }); // default Monday-start
55
+
@@ -0,0 +1,51 @@
1
+ import { floorUtcWeek } from './flooredDateTime';
2
+
3
+ export enum DayOfWeek {
4
+ Sunday = 0,
5
+ Monday = 1,
6
+ Tuesday = 2,
7
+ Wednesday = 3,
8
+ Thursday = 4,
9
+ Friday = 5,
10
+ Saturday = 6,
11
+ }
12
+
13
+ export interface WeekInfo {
14
+ weekNumber: number;
15
+ startDate: Date;
16
+ endDate: Date;
17
+ }
18
+
19
+ const WEEK_IN_MS = 7 * 24 * 60 * 60 * 1000;
20
+
21
+ /**
22
+ * Gets the latest completed week information.
23
+ *
24
+ * @param currentTimestamp - Optional timestamp in milliseconds. If not provided, uses current time.
25
+ * @param offset - Optional number of weeks to offset (0 = latest completed week, 1 = previous week, etc.)
26
+ * @param weekStartsOn - Day of week the week should start on. Defaults to Thursday.
27
+ * @returns WeekInfo with weekNumber, startDate, and endDate
28
+ */
29
+ export function getLatestCompletedWeek(
30
+ currentTimestamp?: number,
31
+ offset: number = 0,
32
+ weekStartsOn: DayOfWeek = DayOfWeek.Thursday
33
+ ): WeekInfo {
34
+ const now = new Date(currentTimestamp ?? Date.now());
35
+
36
+ // floorUtcWeek floors to the beginning of the week on the specified day.
37
+ // This gives us the start of the *current* week, which is the end of the *last completed* week.
38
+ const floorToWeekStart = floorUtcWeek(weekStartsOn as 0|1|2|3|4|5|6);
39
+ const endDate = new Date(floorToWeekStart(now).getTime() - offset * WEEK_IN_MS);
40
+
41
+ // The start date of the completed week is 7 days before the end date.
42
+ const startDate = new Date(endDate.getTime() - WEEK_IN_MS);
43
+
44
+ // Using a fixed point in time for week 1 calculation for consistency
45
+ const week1StartDate = new Date(process.env.WEEK1_START_DATE || "2025-12-04T00:00:00Z");
46
+ const msSinceWeek1 = startDate.getTime() - week1StartDate.getTime();
47
+ const weekNumber = Math.round(msSinceWeek1 / WEEK_IN_MS) + 1;
48
+
49
+ return { weekNumber, startDate, endDate };
50
+ }
51
+
package/package.json CHANGED
@@ -1,37 +1,63 @@
1
1
  {
2
2
  "name": "@basedone/core",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "description": "Core utilities for Based One",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
8
  "source": "./index.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ },
15
+ "./react": {
16
+ "types": "./dist/react.d.ts",
17
+ "import": "./dist/react.mjs",
18
+ "require": "./dist/react.js"
19
+ },
20
+ "./ecommerce": {
21
+ "types": "./dist/ecommerce.d.ts",
22
+ "import": "./dist/ecommerce.mjs",
23
+ "require": "./dist/ecommerce.js"
24
+ }
25
+ },
9
26
  "files": [
10
27
  "dist",
11
28
  "index.ts",
29
+ "react.ts",
30
+ "ecommerce.ts",
12
31
  "lib"
13
32
  ],
14
- "scripts": {
15
- "build": "rm -rf dist && tsup index.ts --format cjs,esm --dts",
16
- "dev": "tsup index.ts --format cjs,esm --dts --watch",
17
- "test": "vitest",
18
- "update-meta": "tsx scripts/update-static-meta.ts",
19
- "prepublishOnly": "pnpm build"
20
- },
21
33
  "keywords": [],
22
34
  "author": "",
23
35
  "license": "ISC",
24
- "packageManager": "pnpm@10.10.0",
25
36
  "devDependencies": {
37
+ "@types/node": "^20.0.0",
38
+ "@types/react": "^18.0.0",
26
39
  "tsup": "^8.5.0",
27
40
  "tsx": "^4.19.2",
28
41
  "typescript": "^5.0.0",
29
42
  "vitest": "^3.2.4"
30
43
  },
31
44
  "dependencies": {
45
+ "axios": "^1.6.0",
32
46
  "decimal.js": "^10.6.0"
33
47
  },
34
48
  "peerDependencies": {
35
- "@nktkas/hyperliquid": "^0.24.3"
49
+ "@nktkas/hyperliquid": "^0.24.3",
50
+ "react": "^18.0.0 || ^19.0.0"
51
+ },
52
+ "peerDependenciesMeta": {
53
+ "react": {
54
+ "optional": true
55
+ }
56
+ },
57
+ "scripts": {
58
+ "build": "rm -rf dist && tsup index.ts react.ts ecommerce.ts --format cjs,esm --dts",
59
+ "dev": "tsup index.ts react.ts ecommerce.ts --format cjs,esm --dts --watch",
60
+ "test": "vitest",
61
+ "update-meta": "tsx scripts/update-static-meta.ts"
36
62
  }
37
- }
63
+ }
package/react.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./lib/react/InstrumentProvider";