@0xmonaco/react 0.0.0-develop-20260120180031 → 0.0.0-develop-20260121171719

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.
@@ -1,5 +1,5 @@
1
1
  import { useCallback } from "react";
2
- import { useMonacoContext } from "../../provider/MonacoProvider";
2
+ import { useMonacoContext } from "../../provider";
3
3
  export const useMonacoSDK = () => {
4
4
  const { sdk, clientId, error, setError } = useMonacoContext();
5
5
  const clearError = useCallback(() => setError(null), [setError]);
@@ -1 +1 @@
1
- {"version":3,"file":"useMonaco.js","sourceRoot":"","sources":["../../../src/hooks/useMonaco/useMonaco.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAoB,EAAE;IAChD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE9D,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,GAAG;QACH,QAAQ;QACR,KAAK;QACL,UAAU;QACV,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"useMonaco.js","sourceRoot":"","sources":["../../../src/hooks/useMonaco/useMonaco.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAoB,EAAE;IAChD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE9D,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,GAAG;QACH,QAAQ;QACR,KAAK;QACL,UAAU;QACV,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOrderbook.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOrderbook/useOrderbook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,sBAAsB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,sBAAsB,EACrC,KAAK,SAAK,GACT,kBAAkB,CAoCpB"}
1
+ {"version":3,"file":"useOrderbook.d.ts","sourceRoot":"","sources":["../../../src/hooks/useOrderbook/useOrderbook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,sBAAsB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,sBAAsB,EACrC,KAAK,SAAK,GACT,kBAAkB,CAoCpB"}
@@ -1,5 +1,5 @@
1
- import { useMonacoSDK } from "@0xmonaco/react";
2
1
  import { useCallback, useEffect, useState } from "react";
2
+ import { useMonacoSDK } from "../useMonaco";
3
3
  export function useOrderbook(tradingPairId, tradingMode, magnitude, quotationMode, depth = 10) {
4
4
  const { sdk } = useMonacoSDK();
5
5
  const [orderbook, setOrderbook] = useState(null);
@@ -1 +1 @@
1
- {"version":3,"file":"useOrderbook.js","sourceRoot":"","sources":["../../../src/hooks/useOrderbook/useOrderbook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGzD,MAAM,UAAU,YAAY,CAC1B,aAAqB,EACrB,WAAwB,EACxB,SAAiB,EACjB,aAAqC,EACrC,KAAK,GAAG,EAAE;IAEV,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAE/B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YAClD,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,mCAAmC;QACnC,GAAG,CAAC,SAAS;aACV,YAAY,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;aAC3F,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;aACxC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,2EAA2E;QAC3E,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACzG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"useOrderbook.js","sourceRoot":"","sources":["../../../src/hooks/useOrderbook/useOrderbook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,UAAU,YAAY,CAC1B,aAAqB,EACrB,WAAwB,EACxB,SAAiB,EACjB,aAAqC,EACrC,KAAK,GAAG,EAAE;IAEV,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAE/B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YAClD,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,mCAAmC;QACnC,GAAG,CAAC,SAAS;aACV,YAAY,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;aAC3F,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;aACxC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,2EAA2E;QAC3E,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACzG,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACtD,CAAC"}
@@ -5,11 +5,11 @@ import type { TradeEvent } from "@0xmonaco/types";
5
5
  export interface UseTradeFeedReturn {
6
6
  /** Array of trade events from WebSocket and REST API */
7
7
  trades: TradeEvent[];
8
- /** Whether currently subscribed to a market */
8
+ /** Whether currently subscribed to a market. Will be false if the SDK is not yet initialized. */
9
9
  subscribed: boolean;
10
+ /** Whether the initial trades are being fetched */
11
+ fetchingInitialState: boolean;
10
12
  /** Any error that occurred during connection or subscription */
11
13
  error: Error | null;
12
- /** Clear the current error state */
13
- clearError: () => void;
14
14
  }
15
15
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTradeFeed/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,MAAM,EAAE,UAAU,EAAE,CAAC;IAErB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IAEpB,gEAAgE;IAChE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB,oCAAoC;IACpC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTradeFeed/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wDAAwD;IACxD,MAAM,EAAE,UAAU,EAAE,CAAC;IAErB,iGAAiG;IACjG,UAAU,EAAE,OAAO,CAAC;IAEpB,mDAAmD;IACnD,oBAAoB,EAAE,OAAO,CAAC;IAE9B,gEAAgE;IAChE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB"}
@@ -2,8 +2,12 @@ import type { UseTradeFeedReturn } from "./types";
2
2
  /**
3
3
  * Hook for subscribing to real-time trade events via WebSocket (public)
4
4
  *
5
+ * Subscriptions are shared at the provider level - multiple components using the same
6
+ * tradingPairId will share both the WebSocket connection and the trade state.
7
+ * Initial trades are fetched only once when the first component subscribes.
8
+ * The last 50 trades are kept in state (this limit is fixed and not configurable).
9
+ *
5
10
  * @param tradingPairId - The trading pair UUID to subscribe to
6
- * @param maxTrades - Maximum number of trades to keep in state (default: 50)
7
11
  */
8
- export declare function useTradeFeed(tradingPairId: string, maxTrades?: number): UseTradeFeedReturn;
12
+ export declare function useTradeFeed(tradingPairId: string): UseTradeFeedReturn;
9
13
  //# sourceMappingURL=useTradeFeed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTradeFeed.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTradeFeed/useTradeFeed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,kBAAkB,CA6CtF"}
1
+ {"version":3,"file":"useTradeFeed.d.ts","sourceRoot":"","sources":["../../../src/hooks/useTradeFeed/useTradeFeed.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAuBtE"}
@@ -1,47 +1,33 @@
1
- import { useCallback, useEffect, useState } from "react";
1
+ import { useEffect } from "react";
2
+ import { MAX_TRADES, useTradeFeedContext } from "../../provider";
2
3
  import { useMonacoSDK } from "../useMonaco";
3
4
  /**
4
5
  * Hook for subscribing to real-time trade events via WebSocket (public)
5
6
  *
7
+ * Subscriptions are shared at the provider level - multiple components using the same
8
+ * tradingPairId will share both the WebSocket connection and the trade state.
9
+ * Initial trades are fetched only once when the first component subscribes.
10
+ * The last 50 trades are kept in state (this limit is fixed and not configurable).
11
+ *
6
12
  * @param tradingPairId - The trading pair UUID to subscribe to
7
- * @param maxTrades - Maximum number of trades to keep in state (default: 50)
8
13
  */
9
- export function useTradeFeed(tradingPairId, maxTrades = 50) {
14
+ export function useTradeFeed(tradingPairId) {
10
15
  const { sdk } = useMonacoSDK();
11
- const [trades, setTrades] = useState([]);
12
- const [error, setError] = useState(null);
13
- const [subscribed, setSubscribed] = useState(false);
14
- const clearError = useCallback(() => setError(null), []);
15
- // Fetch initial trades and subscribe to WebSocket updates
16
+ const { subscribe, subscriptions } = useTradeFeedContext();
17
+ const subscription = subscriptions.get(tradingPairId);
16
18
  useEffect(() => {
17
19
  if (!sdk?.ws || !sdk?.trades || !tradingPairId) {
18
- setSubscribed(false);
19
20
  return;
20
21
  }
21
- setTrades([]);
22
- setError(null);
23
- // Fetch initial trades via REST API
24
- const limit = Number.isFinite(maxTrades) ? maxTrades : 50;
25
- sdk.trades
26
- .getTrades(tradingPairId, { limit })
27
- .then((initialTrades) => setTrades(initialTrades))
28
- .catch((err) => setError(err instanceof Error ? err : new Error(String(err))));
29
- // Subscribe to WebSocket trade updates
30
- const unsubscribe = sdk.ws.trades(tradingPairId, (event) => {
31
- setTrades((prev) => {
32
- // Deduplicate by tradeId and keep newest first
33
- const exists = prev.some((t) => t.data.tradeId === event.data.tradeId);
34
- if (exists)
35
- return prev;
36
- return [event, ...prev].slice(0, limit);
37
- });
38
- });
39
- setSubscribed(true);
40
- return () => {
41
- unsubscribe();
42
- setSubscribed(false);
43
- };
44
- }, [sdk?.ws, sdk?.trades, tradingPairId, maxTrades]);
45
- return { trades, subscribed, error, clearError };
22
+ const fetchInitialTrades = () => sdk.trades.getTrades(tradingPairId, { limit: MAX_TRADES });
23
+ const subscribeToWs = (handler) => sdk.ws.trades(tradingPairId, handler);
24
+ return subscribe(tradingPairId, fetchInitialTrades, subscribeToWs);
25
+ }, [sdk?.ws, sdk?.trades, tradingPairId, subscribe]);
26
+ return {
27
+ trades: subscription?.trades ?? [],
28
+ subscribed: subscription?.subscribed ?? false,
29
+ fetchingInitialState: subscription?.fetchingInitialState ?? false,
30
+ error: subscription?.error ?? null,
31
+ };
46
32
  }
47
33
  //# sourceMappingURL=useTradeFeed.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTradeFeed.js","sourceRoot":"","sources":["../../../src/hooks/useTradeFeed/useTradeFeed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,SAAS,GAAG,EAAE;IAChE,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAE/B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAe,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,oCAAoC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,MAAM;aACP,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC;aACnC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;aACjD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,uCAAuC;QACvC,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,KAAiB,EAAE,EAAE;YACrE,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;gBACjB,+CAA+C;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvE,IAAI,MAAM;oBAAE,OAAO,IAAI,CAAC;gBACxB,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;YACd,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IAErD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"useTradeFeed.js","sourceRoot":"","sources":["../../../src/hooks/useTradeFeed/useTradeFeed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB;IAChD,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE3D,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5F,MAAM,aAAa,GAAG,CAAC,OAAoC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEtG,OAAO,SAAS,CAAC,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IACrE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IAErD,OAAO;QACL,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,EAAE;QAClC,UAAU,EAAE,YAAY,EAAE,UAAU,IAAI,KAAK;QAC7C,oBAAoB,EAAE,YAAY,EAAE,oBAAoB,IAAI,KAAK;QACjE,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,IAAI;KACnC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MonacoProvider.d.ts","sourceRoot":"","sources":["../../src/provider/MonacoProvider.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAIlG,eAAO,MAAM,cAAc,GAAI,yFAAyF,mBAAmB,4CAsG1I,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,kBAQnC,CAAC"}
1
+ {"version":3,"file":"MonacoProvider.d.ts","sourceRoot":"","sources":["../../src/provider/MonacoProvider.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAIlG,eAAO,MAAM,cAAc,GAAI,yFAAyF,mBAAmB,4CA0G1I,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,kBAQnC,CAAC"}
@@ -4,6 +4,7 @@ import { createContext, useContext, useEffect, useMemo, useState } from "react";
4
4
  import { useWalletClient } from "wagmi";
5
5
  import { useTokenLifecycle } from "../hooks";
6
6
  import { loadAuthState } from "../utils";
7
+ import { TradeFeedProvider } from "./TradeFeedProvider";
7
8
  import { AuthenticationStatus } from "./types";
8
9
  const MonacoContext = createContext(null);
9
10
  export const MonacoProvider = ({ children, clientId, network, seiRpcUrl, wsUrl, tokenLifecycle: tokenLifecycleConfig }) => {
@@ -91,7 +92,7 @@ export const MonacoProvider = ({ children, clientId, network, seiRpcUrl, wsUrl,
91
92
  setAuthenticationStatus,
92
93
  setError,
93
94
  }), [sdk, clientId, error, authenticationStatus, tokenLifecycle]);
94
- return _jsx(MonacoContext.Provider, { value: contextValue, children: children });
95
+ return (_jsx(MonacoContext.Provider, { value: contextValue, children: _jsx(TradeFeedProvider, { children: children }) }));
95
96
  };
96
97
  export const useMonacoContext = () => {
97
98
  const context = useContext(MonacoContext);
@@ -1 +1 @@
1
- {"version":3,"file":"MonacoProvider.js","sourceRoot":"","sources":["../../src/provider/MonacoProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MonacoProvider.js","sourceRoot":"","sources":["../../src/provider/MonacoProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { MonacoSDK } from "@0xmonaco/types";
2
+ import { type ReactNode } from "react";
3
+ import type { TradeFeedContextValue } from "./types";
4
+ export declare const TradeFeedContext: import("react").Context<TradeFeedContextValue | null>;
5
+ interface TradeFeedProviderProps {
6
+ children: ReactNode;
7
+ sdk: MonacoSDK | null;
8
+ }
9
+ export declare const TradeFeedProvider: ({ children, sdk }: TradeFeedProviderProps) => import("react/jsx-runtime").JSX.Element;
10
+ export declare const useTradeFeedContext: () => TradeFeedContextValue;
11
+ export {};
12
+ //# sourceMappingURL=TradeFeedContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TradeFeedContext.d.ts","sourceRoot":"","sources":["../../src/provider/TradeFeedContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrH,OAAO,KAAK,EAAE,qBAAqB,EAAyB,MAAM,SAAS,CAAC;AAI5E,eAAO,MAAM,gBAAgB,uDAAoD,CAAC;AAElF,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB,GAAI,mBAAmB,sBAAsB,4CAgJ1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,qBAQtC,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
3
+ const MAX_TRADES = 50;
4
+ export const TradeFeedContext = createContext(null);
5
+ export const TradeFeedProvider = ({ children, sdk }) => {
6
+ const [subscriptions, setSubscriptions] = useState(new Map());
7
+ const subscriptionsRef = useRef(subscriptions);
8
+ const unsubscribersRef = useRef(new Map());
9
+ const activeSubscriptionsRef = useRef(new Set());
10
+ // Keep ref in sync with state
11
+ subscriptionsRef.current = subscriptions;
12
+ // Cleanup all subscriptions when SDK changes or unmounts
13
+ useEffect(() => {
14
+ return () => {
15
+ for (const unsub of unsubscribersRef.current.values()) {
16
+ unsub();
17
+ }
18
+ unsubscribersRef.current.clear();
19
+ activeSubscriptionsRef.current.clear();
20
+ setSubscriptions(new Map());
21
+ };
22
+ }, [sdk]);
23
+ const subscribe = useCallback((tradingPairId) => {
24
+ if (!sdk?.ws || !sdk?.trades)
25
+ return;
26
+ // Check if already subscribed (outside setState to avoid side effects in callback)
27
+ if (activeSubscriptionsRef.current.has(tradingPairId)) {
28
+ // Already subscribed, just increment subscriber count
29
+ setSubscriptions((prev) => {
30
+ const existing = prev.get(tradingPairId);
31
+ if (!existing)
32
+ return prev;
33
+ const updated = new Map(prev);
34
+ updated.set(tradingPairId, { ...existing, subscriberCount: existing.subscriberCount + 1 });
35
+ return updated;
36
+ });
37
+ return;
38
+ }
39
+ // Mark as active before any async work
40
+ activeSubscriptionsRef.current.add(tradingPairId);
41
+ // Create initial subscription state
42
+ setSubscriptions((prev) => {
43
+ const updated = new Map(prev);
44
+ updated.set(tradingPairId, {
45
+ trades: [],
46
+ subscribed: true,
47
+ error: null,
48
+ subscriberCount: 1,
49
+ });
50
+ return updated;
51
+ });
52
+ // Fetch initial trades (side effect outside setState)
53
+ sdk.trades
54
+ .getTrades(tradingPairId, { limit: MAX_TRADES })
55
+ .then((initialTrades) => {
56
+ // Check if subscription was cancelled during fetch
57
+ if (!activeSubscriptionsRef.current.has(tradingPairId))
58
+ return;
59
+ setSubscriptions((curr) => {
60
+ const sub = curr.get(tradingPairId);
61
+ if (!sub)
62
+ return curr;
63
+ const next = new Map(curr);
64
+ next.set(tradingPairId, { ...sub, trades: initialTrades, error: null });
65
+ return next;
66
+ });
67
+ })
68
+ .catch((err) => {
69
+ // Check if subscription was cancelled during fetch
70
+ if (!activeSubscriptionsRef.current.has(tradingPairId))
71
+ return;
72
+ setSubscriptions((curr) => {
73
+ const sub = curr.get(tradingPairId);
74
+ if (!sub)
75
+ return curr;
76
+ const next = new Map(curr);
77
+ next.set(tradingPairId, {
78
+ ...sub,
79
+ error: err instanceof Error ? err : new Error(String(err)),
80
+ });
81
+ return next;
82
+ });
83
+ });
84
+ // Subscribe to WebSocket (side effect outside setState)
85
+ const wsUnsubscribe = sdk.ws.trades(tradingPairId, (event) => {
86
+ // Check if subscription is still active
87
+ if (!activeSubscriptionsRef.current.has(tradingPairId))
88
+ return;
89
+ setSubscriptions((curr) => {
90
+ const sub = curr.get(tradingPairId);
91
+ if (!sub)
92
+ return curr;
93
+ const exists = sub.trades.some((t) => t.data.tradeId === event.data.tradeId);
94
+ if (exists)
95
+ return curr;
96
+ const next = new Map(curr);
97
+ next.set(tradingPairId, {
98
+ ...sub,
99
+ trades: [event, ...sub.trades].slice(0, MAX_TRADES),
100
+ });
101
+ return next;
102
+ });
103
+ });
104
+ unsubscribersRef.current.set(tradingPairId, wsUnsubscribe);
105
+ }, [sdk]);
106
+ const unsubscribe = useCallback((tradingPairId) => {
107
+ // Read from ref to avoid dependency on subscriptions state
108
+ const current = subscriptionsRef.current.get(tradingPairId);
109
+ if (!current)
110
+ return;
111
+ if (current.subscriberCount > 1) {
112
+ // Other subscribers still exist, just decrement
113
+ setSubscriptions((prev) => {
114
+ const existing = prev.get(tradingPairId);
115
+ if (!existing || existing.subscriberCount <= 1)
116
+ return prev;
117
+ const updated = new Map(prev);
118
+ updated.set(tradingPairId, { ...existing, subscriberCount: existing.subscriberCount - 1 });
119
+ return updated;
120
+ });
121
+ return;
122
+ }
123
+ // Last subscriber - perform cleanup (side effects outside setState)
124
+ activeSubscriptionsRef.current.delete(tradingPairId);
125
+ const unsub = unsubscribersRef.current.get(tradingPairId);
126
+ if (unsub) {
127
+ unsub();
128
+ unsubscribersRef.current.delete(tradingPairId);
129
+ }
130
+ // Then update state
131
+ setSubscriptions((prev) => {
132
+ const updated = new Map(prev);
133
+ updated.delete(tradingPairId);
134
+ return updated;
135
+ });
136
+ }, []);
137
+ const contextValue = useMemo(() => ({ subscribe, unsubscribe, subscriptions }), [subscribe, unsubscribe, subscriptions]);
138
+ return _jsx(TradeFeedContext.Provider, { value: contextValue, children: children });
139
+ };
140
+ export const useTradeFeedContext = () => {
141
+ const context = useContext(TradeFeedContext);
142
+ if (!context) {
143
+ throw new Error("useTradeFeedContext must be used within a MonacoProvider.");
144
+ }
145
+ return context;
146
+ };
147
+ //# sourceMappingURL=TradeFeedContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TradeFeedContext.js","sourceRoot":"","sources":["../../src/provider/TradeFeedContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { TradeEvent } from "@0xmonaco/types";
2
+ import type { ReactNode } from "react";
3
+ export declare const MAX_TRADES = 50;
4
+ export interface TradeFeedSubscription {
5
+ trades: TradeEvent[];
6
+ error: Error | null;
7
+ subscribed: boolean;
8
+ subscriberCount: number;
9
+ fetchingInitialState: boolean;
10
+ }
11
+ interface TradeFeedContextValue {
12
+ /** Subscribe to a trading pair - returns unsubscribe function */
13
+ subscribe: (tradingPairId: string, fetchInitialTrades: () => Promise<TradeEvent[]>, subscribeToWs: (handler: (event: TradeEvent) => void) => () => void) => () => void;
14
+ /** Get subscription state with reactivity */
15
+ subscriptions: Map<string, TradeFeedSubscription>;
16
+ }
17
+ interface TradeFeedProviderProps {
18
+ children: ReactNode;
19
+ }
20
+ export declare const TradeFeedProvider: ({ children }: TradeFeedProviderProps) => import("react/jsx-runtime").JSX.Element;
21
+ export declare const useTradeFeedContext: () => TradeFeedContextValue;
22
+ export {};
23
+ //# sourceMappingURL=TradeFeedProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TradeFeedProvider.d.ts","sourceRoot":"","sources":["../../src/provider/TradeFeedProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,qBAAqB;IAC7B,iEAAiE;IACjE,SAAS,EAAE,CACT,aAAa,EAAE,MAAM,EACrB,kBAAkB,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,EAC/C,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,KAAK,MAAM,IAAI,KAChE,MAAM,IAAI,CAAC;IAChB,6CAA6C;IAC7C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACnD;AAID,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,iBAAiB,GAAI,cAAc,sBAAsB,4CA4JrE,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,qBAWtC,CAAC"}
@@ -0,0 +1,144 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
3
+ export const MAX_TRADES = 50;
4
+ const TradeFeedContext = createContext(null);
5
+ export const TradeFeedProvider = ({ children }) => {
6
+ const [subscriptions, setSubscriptions] = useState(new Map());
7
+ // Track active WebSocket unsubscribe functions
8
+ const wsUnsubscribes = useRef(new Map());
9
+ // Cleanup all WebSocket subscriptions when provider unmounts
10
+ useEffect(() => {
11
+ return () => {
12
+ for (const unsubscribe of wsUnsubscribes.current.values()) {
13
+ unsubscribe();
14
+ }
15
+ wsUnsubscribes.current.clear();
16
+ };
17
+ }, []);
18
+ const handleTrade = useCallback((tradingPairId, event) => {
19
+ setSubscriptions((prev) => {
20
+ const current = prev.get(tradingPairId);
21
+ if (!current)
22
+ return prev;
23
+ const exists = current.trades.some((t) => t.data.tradeId === event.data.tradeId);
24
+ if (exists)
25
+ return prev;
26
+ const newSubscriptions = new Map(prev);
27
+ newSubscriptions.set(tradingPairId, {
28
+ ...current,
29
+ trades: [event, ...current.trades].slice(0, MAX_TRADES),
30
+ error: null, // Clear error on successful WebSocket event
31
+ });
32
+ return newSubscriptions;
33
+ });
34
+ }, []);
35
+ // Use ref to maintain stable reference to handleTrade for the subscribe callback
36
+ const handleTradeRef = useRef(handleTrade);
37
+ useEffect(() => {
38
+ handleTradeRef.current = handleTrade;
39
+ });
40
+ const subscribe = useCallback((tradingPairId, fetchInitialTrades, subscribeToWs) => {
41
+ setSubscriptions((prev) => {
42
+ const current = prev.get(tradingPairId);
43
+ if (current) {
44
+ // Already subscribed, just increment count
45
+ const newSubscriptions = new Map(prev);
46
+ newSubscriptions.set(tradingPairId, {
47
+ ...current,
48
+ subscriberCount: current.subscriberCount + 1,
49
+ });
50
+ return newSubscriptions;
51
+ }
52
+ // First subscriber - create new subscription
53
+ const newSubscriptions = new Map(prev);
54
+ newSubscriptions.set(tradingPairId, {
55
+ trades: [],
56
+ error: null,
57
+ subscribed: true,
58
+ subscriberCount: 1,
59
+ fetchingInitialState: true,
60
+ });
61
+ return newSubscriptions;
62
+ });
63
+ // Check if this is the first subscriber (no existing WS subscription)
64
+ if (!wsUnsubscribes.current.has(tradingPairId)) {
65
+ // Set placeholder immediately to prevent race condition with concurrent subscribers
66
+ wsUnsubscribes.current.set(tradingPairId, () => { });
67
+ // Fetch initial trades
68
+ fetchInitialTrades()
69
+ .then((initialTrades) => {
70
+ setSubscriptions((prev) => {
71
+ const current = prev.get(tradingPairId);
72
+ if (!current)
73
+ return prev;
74
+ const newSubscriptions = new Map(prev);
75
+ newSubscriptions.set(tradingPairId, {
76
+ ...current,
77
+ trades: initialTrades.slice(0, MAX_TRADES),
78
+ error: null,
79
+ fetchingInitialState: false,
80
+ });
81
+ return newSubscriptions;
82
+ });
83
+ })
84
+ .catch((err) => {
85
+ setSubscriptions((prev) => {
86
+ const current = prev.get(tradingPairId);
87
+ if (!current)
88
+ return prev;
89
+ const newSubscriptions = new Map(prev);
90
+ newSubscriptions.set(tradingPairId, {
91
+ ...current,
92
+ error: err instanceof Error ? err : new Error(String(err)),
93
+ fetchingInitialState: false,
94
+ });
95
+ return newSubscriptions;
96
+ });
97
+ });
98
+ // Subscribe to WebSocket
99
+ const unsubscribe = subscribeToWs((event) => handleTradeRef.current(tradingPairId, event));
100
+ wsUnsubscribes.current.set(tradingPairId, unsubscribe);
101
+ }
102
+ // Return unsubscribe function
103
+ return () => {
104
+ setSubscriptions((prev) => {
105
+ const current = prev.get(tradingPairId);
106
+ if (!current)
107
+ return prev;
108
+ const newCount = current.subscriberCount - 1;
109
+ if (newCount <= 0) {
110
+ // Last subscriber - clean up
111
+ const wsUnsubscribe = wsUnsubscribes.current.get(tradingPairId);
112
+ if (wsUnsubscribe) {
113
+ wsUnsubscribe();
114
+ wsUnsubscribes.current.delete(tradingPairId);
115
+ }
116
+ const newSubscriptions = new Map(prev);
117
+ newSubscriptions.delete(tradingPairId);
118
+ return newSubscriptions;
119
+ }
120
+ // Still have subscribers, just decrement count
121
+ const newSubscriptions = new Map(prev);
122
+ newSubscriptions.set(tradingPairId, {
123
+ ...current,
124
+ subscriberCount: newCount,
125
+ });
126
+ return newSubscriptions;
127
+ });
128
+ };
129
+ }, []);
130
+ const contextValue = useMemo(() => ({
131
+ subscribe,
132
+ subscriptions,
133
+ }), [subscribe, subscriptions]);
134
+ return _jsx(TradeFeedContext.Provider, { value: contextValue, children: children });
135
+ };
136
+ export const useTradeFeedContext = () => {
137
+ const context = useContext(TradeFeedContext);
138
+ if (!context) {
139
+ throw new Error("useTradeFeedContext must be used within a TradeFeedProvider. " +
140
+ "Make sure to wrap your app with <MonacoProvider>.");
141
+ }
142
+ return context;
143
+ };
144
+ //# sourceMappingURL=TradeFeedProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TradeFeedProvider.js","sourceRoot":"","sources":["../../src/provider/TradeFeedProvider.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  export * from "./MonacoProvider";
2
+ export { MAX_TRADES, type TradeFeedSubscription, useTradeFeedContext } from "./TradeFeedProvider";
2
3
  export * from "./types";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,KAAK,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClG,cAAc,SAAS,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./MonacoProvider";
2
+ export { MAX_TRADES, useTradeFeedContext } from "./TradeFeedProvider";
2
3
  export * from "./types";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAA8B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAClG,cAAc,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xmonaco/react",
3
- "version": "0.0.0-develop-20260120180031",
3
+ "version": "0.0.0-develop-20260121171719",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -9,8 +9,8 @@
9
9
  "dist"
10
10
  ],
11
11
  "dependencies": {
12
- "@0xmonaco/core": "0.0.0-develop-20260120180031",
13
- "@0xmonaco/types": "0.0.0-develop-20260120180031"
12
+ "@0xmonaco/core": "0.0.0-develop-20260121171719",
13
+ "@0xmonaco/types": "0.0.0-develop-20260121171719"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@types/react": "^19.1.12",