@agg-build/hooks 4.18.0 → 4.19.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.
package/dist/index.js CHANGED
@@ -79,14 +79,15 @@ __export(src_exports, {
79
79
  CONFIRMED_MATCH_STATUSES: () => CONFIRMED_MATCH_STATUSES,
80
80
  DEFAULT_AGG_ROOT_CLASS_NAME: () => DEFAULT_AGG_ROOT_CLASS_NAME,
81
81
  EventListStateProvider: () => EventListStateProvider,
82
+ LEADERBOARD_PERIODS: () => LEADERBOARD_PERIODS,
82
83
  MAX_ORDER_VENUE_MARKET_IDS_PER_REQUEST: () => MAX_ORDER_VENUE_MARKET_IDS_PER_REQUEST,
83
84
  MAX_PRICE_GAP_PCT: () => MAX_PRICE_GAP_PCT,
84
85
  MIN_PRICE_GAP_PCT: () => MIN_PRICE_GAP_PCT,
85
86
  MarketStatus: () => MarketStatus,
86
87
  MatchStatus: () => MatchStatus,
87
88
  MatchType: () => MatchType,
88
- QueryClient: () => import_react_query51.QueryClient,
89
- QueryClientProvider: () => import_react_query51.QueryClientProvider,
89
+ QueryClient: () => import_react_query52.QueryClient,
90
+ QueryClientProvider: () => import_react_query52.QueryClientProvider,
90
91
  RedeemRejectedError: () => RedeemRejectedError,
91
92
  SPORTS_LIVE_POLL_INTERVAL_MS: () => SPORTS_LIVE_POLL_INTERVAL_MS,
92
93
  SPORTS_SCHEDULED_POLL_INTERVAL_MS: () => SPORTS_SCHEDULED_POLL_INTERVAL_MS,
@@ -117,6 +118,8 @@ __export(src_exports, {
117
118
  invalidateUserClaimState: () => invalidateUserClaimState,
118
119
  invalidateUserMoneyState: () => invalidateUserMoneyState,
119
120
  isVenueDisabledByConfig: () => isVenueDisabledByConfig,
121
+ leaderboardQueryKeys: () => leaderboardQueryKeys,
122
+ leaderboardRange: () => leaderboardRange,
120
123
  mergeBestPricesPreferringLive: () => mergeBestPricesPreferringLive,
121
124
  mergeRecurringCryptoWindows: () => mergeRecurringCryptoWindows,
122
125
  normalizeVenueId: () => normalizeVenueId,
@@ -177,6 +180,7 @@ __export(src_exports, {
177
180
  useHostedVenueActivity: () => useHostedVenueActivity,
178
181
  useHostedVenueTransfers: () => useHostedVenueTransfers,
179
182
  useLabels: () => useLabels,
183
+ useLeaderboard: () => useLeaderboard,
180
184
  useLimitOrderVenueQuotes: () => useLimitOrderVenueQuotes,
181
185
  useLinkAccount: () => useLinkAccount,
182
186
  useLiveBestPriceCandidates: () => useLiveBestPriceCandidates,
@@ -206,7 +210,7 @@ __export(src_exports, {
206
210
  usePaperOnboarding: () => usePaperOnboarding,
207
211
  usePlaceLimitOrder: () => usePlaceLimitOrder,
208
212
  usePositions: () => usePositions,
209
- useQueryClient: () => import_react_query51.useQueryClient,
213
+ useQueryClient: () => import_react_query52.useQueryClient,
210
214
  useRampQuotes: () => useRampQuotes,
211
215
  useRampSession: () => useRampSession,
212
216
  useRecurringCryptoMarkets: () => useRecurringCryptoMarkets,
@@ -405,7 +409,7 @@ var getVenueOrder = (venue) => {
405
409
  var sortVenues = (venues) => [...venues].sort((a, b) => getVenueOrder(a) - getVenueOrder(b));
406
410
 
407
411
  // src/index.ts
408
- var import_react_query51 = require("@tanstack/react-query");
412
+ var import_react_query52 = require("@tanstack/react-query");
409
413
 
410
414
  // src/candle-store.ts
411
415
  var import_sdk = require("@agg-build/sdk");
@@ -1221,6 +1225,31 @@ var enUsLabels = {
1221
1225
  readFullDetails: "Read full details",
1222
1226
  showLess: "Show less"
1223
1227
  },
1228
+ leaderboard: {
1229
+ title: "Leaderboard",
1230
+ subtitle: (appName, periodLabel) => `Top traders${appName ? ` on ${appName}` : ""} \xB7 ${periodLabel} \xB7 updates every 5 minutes`,
1231
+ periodLabel: "Period",
1232
+ rankByLabel: "Rank by",
1233
+ periods: { "1d": "24h", "7d": "7d", "30d": "30d", all: "All time" },
1234
+ metrics: { realizedPnl: "Profit & loss", volume: "Volume" },
1235
+ columns: {
1236
+ rank: "#",
1237
+ trader: "Trader",
1238
+ orders: "Trades",
1239
+ volume: "Volume",
1240
+ realizedPnl: "P&L"
1241
+ },
1242
+ tradesCount: (count) => `${count} ${count === 1 ? "trade" : "trades"}`,
1243
+ anonymousTrader: "Anonymous trader",
1244
+ you: "You",
1245
+ showMore: "Show more traders",
1246
+ loadingAria: "Loading leaderboard",
1247
+ emptyTitle: "No trades in this period yet",
1248
+ emptyDescription: "Rankings appear once traders place orders. Try a longer period or check back later.",
1249
+ errorTitle: "Couldn't load the leaderboard",
1250
+ errorDescription: "Something went wrong on our side. Try again in a moment.",
1251
+ pnlFootnote: "P&L is realized only: sells and settled markets, before fees. Volume counts both buys and sells. Trades are filled orders. Figures refresh every 5 minutes."
1252
+ },
1224
1253
  marketDetails: {
1225
1254
  loading: "Loading market details",
1226
1255
  unavailableAria: "Market details unavailable",
@@ -6757,6 +6786,56 @@ function useUserActivity(options = {}) {
6757
6786
  });
6758
6787
  }
6759
6788
 
6789
+ // src/use-leaderboard.ts
6790
+ var import_react_query30 = require("@tanstack/react-query");
6791
+ var LEADERBOARD_PERIODS = ["1d", "7d", "30d", "all"];
6792
+ var utcDayKey = (d) => d.toISOString().slice(0, 10);
6793
+ function leaderboardRange(period, now = /* @__PURE__ */ new Date()) {
6794
+ if (period === "all") return {};
6795
+ const spanDays = period === "1d" ? 0 : period === "7d" ? 6 : 29;
6796
+ const from = new Date(
6797
+ Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - spanDays)
6798
+ );
6799
+ return { from: utcDayKey(from), to: utcDayKey(now) };
6800
+ }
6801
+ var leaderboardQueryKeys = {
6802
+ all: () => ["leaderboard"],
6803
+ list: (period, metric, limit) => ["leaderboard", period, metric, limit]
6804
+ };
6805
+ var LEADERBOARD_STALE_TIME_MS = 6e4;
6806
+ function useLeaderboard(options = {}) {
6807
+ var _a, _b;
6808
+ const client = useAggClient();
6809
+ const { period = "30d", metric = "realizedPnl", limit = 50, enabled = true } = options;
6810
+ const query = (0, import_react_query30.useInfiniteQuery)({
6811
+ queryKey: leaderboardQueryKeys.list(period, metric, limit),
6812
+ queryFn: ({ pageParam }) => client.getLeaderboard(__spreadProps(__spreadValues({}, leaderboardRange(period)), {
6813
+ metric,
6814
+ limit,
6815
+ cursor: pageParam
6816
+ })),
6817
+ initialPageParam: void 0,
6818
+ getNextPageParam: (lastPage) => {
6819
+ var _a2;
6820
+ return lastPage.hasMore ? (_a2 = lastPage.nextCursor) != null ? _a2 : void 0 : void 0;
6821
+ },
6822
+ enabled,
6823
+ // Keep the previous list on screen while a period/metric switch loads.
6824
+ placeholderData: import_react_query30.keepPreviousData,
6825
+ staleTime: LEADERBOARD_STALE_TIME_MS
6826
+ });
6827
+ const seen = /* @__PURE__ */ new Set();
6828
+ const rows = ((_b = (_a = query.data) == null ? void 0 : _a.pages.flatMap((page) => page.data)) != null ? _b : []).filter((row) => {
6829
+ if (seen.has(row.userId)) return false;
6830
+ seen.add(row.userId);
6831
+ return true;
6832
+ });
6833
+ return __spreadProps(__spreadValues({}, query), {
6834
+ rows,
6835
+ hasNextPage: !!query.hasNextPage
6836
+ });
6837
+ }
6838
+
6760
6839
  // src/use-external-id.ts
6761
6840
  var import_react27 = require("react");
6762
6841
  function useExternalId(options = {}) {
@@ -6787,12 +6866,12 @@ function useExternalId(options = {}) {
6787
6866
  }
6788
6867
 
6789
6868
  // src/use-execution-positions.ts
6790
- var import_react_query30 = require("@tanstack/react-query");
6869
+ var import_react_query31 = require("@tanstack/react-query");
6791
6870
  function useExecutionPositions(options = {}) {
6792
6871
  var _a, _b;
6793
6872
  const client = useAggClient();
6794
6873
  const { limit = 50, status, mode, enabled = true } = options;
6795
- const query = (0, import_react_query30.useInfiniteQuery)({
6874
+ const query = (0, import_react_query31.useInfiniteQuery)({
6796
6875
  queryKey: executionKeys.positions(null, limit, status != null ? status : null, mode != null ? mode : null),
6797
6876
  queryFn: ({ pageParam }) => client.getExecutionPositions(__spreadProps(__spreadValues({
6798
6877
  limit,
@@ -6823,11 +6902,11 @@ var import_react30 = require("react");
6823
6902
  var import_sdk6 = require("@agg-build/sdk");
6824
6903
 
6825
6904
  // src/use-market-chart.ts
6826
- var import_react_query32 = require("@tanstack/react-query");
6905
+ var import_react_query33 = require("@tanstack/react-query");
6827
6906
 
6828
6907
  // src/read-retry.ts
6829
6908
  var import_sdk3 = require("@agg-build/sdk");
6830
- var import_react_query31 = require("@tanstack/react-query");
6909
+ var import_react_query32 = require("@tanstack/react-query");
6831
6910
  var MAX_TIMER_DELAY_MS = 2147483647;
6832
6911
  var hint = (error) => {
6833
6912
  if (!(0, import_sdk3.isAggApiError)(error)) return void 0;
@@ -6839,7 +6918,7 @@ function withReadRetry(options) {
6839
6918
  retry: (failureCount, error) => {
6840
6919
  var _a, _b;
6841
6920
  if (((_a = hint(error)) != null ? _a : 0) > MAX_TIMER_DELAY_MS) return false;
6842
- const retry = (_b = options.retry) != null ? _b : import_react_query31.isServer ? 0 : 3;
6921
+ const retry = (_b = options.retry) != null ? _b : import_react_query32.isServer ? 0 : 3;
6843
6922
  return typeof retry === "function" ? retry(failureCount, error) : retry === true || typeof retry === "number" && failureCount < retry;
6844
6923
  },
6845
6924
  retryDelay: (attempt, error) => {
@@ -7227,7 +7306,7 @@ function useMarketDataSubscription({
7227
7306
  function useMarketChartQueries(options) {
7228
7307
  var _a, _b;
7229
7308
  const client = useAggClient();
7230
- const queryClient = (0, import_react_query32.useQueryClient)();
7309
+ const queryClient = (0, import_react_query33.useQueryClient)();
7231
7310
  const socket = useAggWebSocket();
7232
7311
  const isConnected = useAggWebSocketConnectionState();
7233
7312
  const {
@@ -7270,7 +7349,7 @@ function useMarketChartQueries(options) {
7270
7349
  orderbook: true,
7271
7350
  trades: true
7272
7351
  });
7273
- const queries = (0, import_react_query32.useQueries)({
7352
+ const queries = (0, import_react_query33.useQueries)({
7274
7353
  queries: outcomeIds.map((outcomeId) => __spreadProps(__spreadValues({
7275
7354
  // Cache key is intentionally time-free. The rolling window's
7276
7355
  // startTs/endTs advance on every bucket but the user expects the same
@@ -7344,7 +7423,7 @@ function useMarketChartQueries(options) {
7344
7423
  },
7345
7424
  retryDelay: (_attempt, error) => error instanceof ChartDeliveryError && error.retryAfterMs != null ? Math.min(error.state === "warming" ? 1e3 : 5e3, Math.max(0, error.retryAfterMs)) : 1e3
7346
7425
  })), {
7347
- placeholderData: import_react_query32.keepPreviousData,
7426
+ placeholderData: import_react_query33.keepPreviousData,
7348
7427
  refetchInterval: (query) => chartRefetchInterval(
7349
7428
  query,
7350
7429
  refetchIntervalMs != null && refetchIntervalMs > 0 ? refetchIntervalMs : false
@@ -7671,7 +7750,7 @@ function useEventOrderbookData(venueMarkets, selectedMarketId) {
7671
7750
  }
7672
7751
 
7673
7752
  // src/use-market-orderbook.ts
7674
- var import_react_query33 = require("@tanstack/react-query");
7753
+ var import_react_query34 = require("@tanstack/react-query");
7675
7754
 
7676
7755
  // src/market-data/orderbook-snapshot.ts
7677
7756
  var orderbookTimestampSeconds = (timestamp) => timestamp >= 1e12 ? timestamp / 1e3 : timestamp;
@@ -7936,7 +8015,7 @@ function selectOrderbookSnapshots(client, store, ids, socketHealthy, signal) {
7936
8015
  // src/use-market-orderbook.ts
7937
8016
  function useMarketOrderbook(options) {
7938
8017
  var _a, _b, _c, _d, _e, _f, _g;
7939
- const queryClient = (0, import_react_query33.useQueryClient)();
8018
+ const queryClient = (0, import_react_query34.useQueryClient)();
7940
8019
  const client = useAggClient();
7941
8020
  const ws = useAggWebSocket();
7942
8021
  const isConnected = useAggWebSocketConnectionState();
@@ -7962,7 +8041,7 @@ function useMarketOrderbook(options) {
7962
8041
  var _a2;
7963
8042
  return ((_a2 = store.get(id).connectionGeneration) != null ? _a2 : 0) === 0;
7964
8043
  }));
7965
- const seedQuery = (0, import_react_query33.useQuery)({
8044
+ const seedQuery = (0, import_react_query34.useQuery)({
7966
8045
  queryKey: ["market-orderbook-seed", sortedIds],
7967
8046
  queryFn: createOrderbookSnapshotQuery(client, store, sortedIds, preferSocket),
7968
8047
  enabled: enabled && subscriptionIds.length > 0,
@@ -8402,7 +8481,7 @@ function useLiveTrades(canonicalMarketId) {
8402
8481
  }
8403
8482
 
8404
8483
  // src/use-midpoints.ts
8405
- var import_react_query34 = require("@tanstack/react-query");
8484
+ var import_react_query35 = require("@tanstack/react-query");
8406
8485
  var import_react35 = require("react");
8407
8486
  var normalizeVenueMarketIds = (venueMarkets) => {
8408
8487
  var _a;
@@ -8415,6 +8494,21 @@ var normalizeVenueMarketIds = (venueMarkets) => {
8415
8494
  }
8416
8495
  return [...ids].sort((left, right) => left.localeCompare(right));
8417
8496
  };
8497
+ var EMPTY_MIDPOINTS_POLL_MS = 5e3;
8498
+ var EMPTY_MIDPOINTS_MAX_FETCHES = 12;
8499
+ var hasUsableMidpoint = (item) => {
8500
+ var _a;
8501
+ if (!item) return false;
8502
+ if (item.midpoint != null) return true;
8503
+ return ((_a = item.outcomes) != null ? _a : []).some(
8504
+ (outcome) => outcome.midpoint != null || outcome.bestBid != null || outcome.bestAsk != null
8505
+ );
8506
+ };
8507
+ var isMidpointResponseComplete = (data, primaryVenueMarketIds) => {
8508
+ if (!(data == null ? void 0 : data.data)) return false;
8509
+ const itemByMarketId = new Map(data.data.map((item) => [item.venueMarketId, item]));
8510
+ return primaryVenueMarketIds.every((id) => hasUsableMidpoint(itemByMarketId.get(id)));
8511
+ };
8418
8512
  var normalizeOutcomeLabel = (label) => {
8419
8513
  return typeof label === "string" ? label.trim().toLowerCase() : "";
8420
8514
  };
@@ -8581,13 +8675,21 @@ function useMidpoints(venueMarkets, options) {
8581
8675
  () => resolveBestMidpointCandidateOutcomeIds(venueMarkets),
8582
8676
  [venueMarkets]
8583
8677
  );
8584
- const { data, isLoading } = (0, import_react_query34.useQuery)({
8678
+ const primaryVenueMarketIds = (0, import_react35.useMemo)(
8679
+ () => (venueMarkets != null ? venueMarkets : []).map((market) => market.id).filter(Boolean),
8680
+ [venueMarkets]
8681
+ );
8682
+ const { data, isLoading } = (0, import_react_query35.useQuery)({
8585
8683
  queryKey: ["midpoints", ids, maxMidpointIdsPerRequest],
8586
8684
  queryFn: () => client.getMidpoints(ids, { bestPrice: true, maxMidpointIdsPerRequest }),
8587
8685
  enabled: ids.length > 0,
8588
- staleTime: Infinity,
8686
+ // Complete responses stay cached for the session (unchanged behavior).
8687
+ // Incomplete ones are stale, so a remount refetches them and a short,
8688
+ // bounded poll picks up prices once a cold venue book warms.
8689
+ staleTime: (query) => isMidpointResponseComplete(query.state.data, primaryVenueMarketIds) ? Infinity : 0,
8690
+ refetchInterval: (query) => !isMidpointResponseComplete(query.state.data, primaryVenueMarketIds) && query.state.dataUpdateCount < EMPTY_MIDPOINTS_MAX_FETCHES ? EMPTY_MIDPOINTS_POLL_MS : false,
8589
8691
  gcTime: 30 * 6e4,
8590
- refetchOnMount: false,
8692
+ refetchOnMount: true,
8591
8693
  refetchOnWindowFocus: false,
8592
8694
  refetchOnReconnect: false
8593
8695
  });
@@ -8788,7 +8890,7 @@ function useArbFeed() {
8788
8890
  }
8789
8891
 
8790
8892
  // src/use-order-book.ts
8791
- var import_react_query35 = require("@tanstack/react-query");
8893
+ var import_react_query36 = require("@tanstack/react-query");
8792
8894
  var fetchBatchBookQuery = (client, venueMarketIds, { signal }) => client.getOrderbooks({ venueMarketIds }, { signal });
8793
8895
  var createBatchBookQuery = (client, venueMarketIds) => fetchBatchBookQuery.bind(null, client, venueMarketIds);
8794
8896
  function useOrderBook(options) {
@@ -8803,7 +8905,7 @@ function useOrderBook(options) {
8803
8905
  venueMarketOutcomeId: outcome.id
8804
8906
  })) : void 0
8805
8907
  });
8806
- const batchedResult = (0, import_react_query35.useQuery)({
8908
+ const batchedResult = (0, import_react_query36.useQuery)({
8807
8909
  queryKey: requestedVenueMarketIds.length ? ["orderbooks", requestedVenueMarketIds, null] : ["orderbooks", "__disabled__", null],
8808
8910
  queryFn: createBatchBookQuery(client, requestedVenueMarketIds),
8809
8911
  enabled: enabled && !canonicalMarketId && requestedVenueMarketIds.length > 0,
@@ -8811,7 +8913,7 @@ function useOrderBook(options) {
8811
8913
  gcTime: 5 * 6e4,
8812
8914
  refetchOnWindowFocus: false,
8813
8915
  retry: 1,
8814
- placeholderData: import_react_query35.keepPreviousData
8916
+ placeholderData: import_react_query36.keepPreviousData
8815
8917
  });
8816
8918
  const data = (() => {
8817
8919
  var _a, _b;
@@ -8866,7 +8968,7 @@ function useOrderBook(options) {
8866
8968
  }
8867
8969
 
8868
8970
  // src/use-orderbook-quote.ts
8869
- var import_react_query36 = require("@tanstack/react-query");
8971
+ var import_react_query37 = require("@tanstack/react-query");
8870
8972
  var QUOTE_DEBOUNCE_MS = 300;
8871
8973
  var createUnavailableOrderbookError = (message, code, retryable) => {
8872
8974
  const error = new Error(message);
@@ -8928,7 +9030,7 @@ function useOrderbookQuote(options) {
8928
9030
  const { marketId, side, size, enabled = true } = options;
8929
9031
  const debouncedSize = useDebouncedValue(size, QUOTE_DEBOUNCE_MS);
8930
9032
  const shouldFetch = enabled && !!marketId && debouncedSize > 0;
8931
- const query = (0, import_react_query36.useQuery)({
9033
+ const query = (0, import_react_query37.useQuery)({
8932
9034
  queryKey: marketId ? marketDataKeys.orderbookQuote(marketId, side, debouncedSize) : ["market-data", "orderbook-quote", "__disabled__"],
8933
9035
  queryFn: () => __async(null, null, function* () {
8934
9036
  var _a2, _b, _c, _d;
@@ -8959,7 +9061,7 @@ function useOrderbookQuote(options) {
8959
9061
  staleTime: 1e4,
8960
9062
  gcTime: 5 * 6e4,
8961
9063
  retry: 1,
8962
- placeholderData: import_react_query36.keepPreviousData
9064
+ placeholderData: import_react_query37.keepPreviousData
8963
9065
  });
8964
9066
  return {
8965
9067
  data: (_a = query.data) != null ? _a : null,
@@ -8970,12 +9072,12 @@ function useOrderbookQuote(options) {
8970
9072
  }
8971
9073
 
8972
9074
  // src/use-orders.ts
8973
- var import_react_query37 = require("@tanstack/react-query");
9075
+ var import_react_query38 = require("@tanstack/react-query");
8974
9076
  function useOrders(options = {}) {
8975
9077
  var _a, _b, _c, _d;
8976
9078
  const client = useAggClient();
8977
9079
  const { userId, status, limit = 50, offset = 0, enabled = true } = options;
8978
- const query = (0, import_react_query37.useQuery)({
9080
+ const query = (0, import_react_query38.useQuery)({
8979
9081
  queryKey: ["orders", userId != null ? userId : "me", status != null ? status : "all", limit, offset],
8980
9082
  queryFn: () => client.getOrders({
8981
9083
  userId,
@@ -8992,13 +9094,13 @@ function useOrders(options = {}) {
8992
9094
  }
8993
9095
 
8994
9096
  // src/use-search.ts
8995
- var import_react_query38 = require("@tanstack/react-query");
9097
+ var import_react_query39 = require("@tanstack/react-query");
8996
9098
  var import_react38 = require("react");
8997
9099
  function useSearch(options) {
8998
9100
  var _a, _b, _c, _d;
8999
9101
  const client = (0, import_react38.useContext)(AggClientContext);
9000
- const queryClient = (0, import_react38.useContext)(import_react_query38.QueryClientContext);
9001
- const [fallbackQueryClient] = (0, import_react38.useState)(() => new import_react_query38.QueryClient());
9102
+ const queryClient = (0, import_react38.useContext)(import_react_query39.QueryClientContext);
9103
+ const [fallbackQueryClient] = (0, import_react38.useState)(() => new import_react_query39.QueryClient());
9002
9104
  const {
9003
9105
  q,
9004
9106
  type,
@@ -9032,7 +9134,7 @@ function useSearch(options) {
9032
9134
  ];
9033
9135
  const effectiveQueryClient = queryClient != null ? queryClient : fallbackQueryClient;
9034
9136
  const retryOptions = withReadRetry(effectiveQueryClient.defaultQueryOptions({ queryKey }));
9035
- const query = (0, import_react_query38.useInfiniteQuery)(
9137
+ const query = (0, import_react_query39.useInfiniteQuery)(
9036
9138
  __spreadProps(__spreadValues({
9037
9139
  // deep is part of the key — TanStack treats deep vs light as
9038
9140
  // independent queries so users can have both modes cached side-by-side.
@@ -9062,7 +9164,7 @@ function useSearch(options) {
9062
9164
  if (!lastPage.hasMore) return void 0;
9063
9165
  return (_a2 = lastPage.nextCursor) != null ? _a2 : void 0;
9064
9166
  },
9065
- placeholderData: import_react_query38.keepPreviousData
9167
+ placeholderData: import_react_query39.keepPreviousData
9066
9168
  }, retryOptions), {
9067
9169
  enabled: isEnabled && !!client
9068
9170
  }),
@@ -9172,7 +9274,7 @@ function useMarketSearch(options) {
9172
9274
  }
9173
9275
 
9174
9276
  // src/use-smart-route.ts
9175
- var import_react_query39 = require("@tanstack/react-query");
9277
+ var import_react_query40 = require("@tanstack/react-query");
9176
9278
 
9177
9279
  // src/smart-route-refresh-policy.ts
9178
9280
  var THIN_SMART_ROUTE_REFETCH_INTERVAL_MS = 5e3;
@@ -9336,7 +9438,7 @@ function useSmartRoute(options) {
9336
9438
  const resolvedVenueMarketOutcomeId = (_a = venueMarketOutcomeId != null ? venueMarketOutcomeId : venueMarketId) != null ? _a : outcomeId;
9337
9439
  const hasValidInput = (maxSpend != null ? maxSpend : 0) > 0 || (sellShares != null ? sellShares : 0) > 0;
9338
9440
  const queryEnabled = enabled && !!resolvedVenueMarketOutcomeId && hasValidInput;
9339
- const query = (0, import_react_query39.useQuery)({
9441
+ const query = (0, import_react_query40.useQuery)({
9340
9442
  queryKey: [
9341
9443
  "smart-route",
9342
9444
  resolvedVenueMarketOutcomeId,
@@ -9399,7 +9501,7 @@ function useSmartRoute(options) {
9399
9501
  // a different amount or position snapshot. Never expose it under a new
9400
9502
  // sell key while the replacement request is in flight. BUY retains the
9401
9503
  // existing no-flicker behavior.
9402
- placeholderData: tradeSide === "sell" ? void 0 : import_react_query39.keepPreviousData
9504
+ placeholderData: tradeSide === "sell" ? void 0 : import_react_query40.keepPreviousData
9403
9505
  });
9404
9506
  const error = query.error;
9405
9507
  let loadingReason = null;
@@ -9421,7 +9523,7 @@ function useSmartRoute(options) {
9421
9523
  }
9422
9524
 
9423
9525
  // src/use-limit-order-venue-quotes.ts
9424
- var import_react_query40 = require("@tanstack/react-query");
9526
+ var import_react_query41 = require("@tanstack/react-query");
9425
9527
  var getIsDocumentVisible2 = () => {
9426
9528
  if (typeof document === "undefined") return true;
9427
9529
  return document.visibilityState !== "hidden";
@@ -9476,7 +9578,7 @@ var useLimitOrderVenueQuotes = (options) => {
9476
9578
  const hasRequiredAccount = tradeSide === "buy" || Boolean(accountId);
9477
9579
  const queryEnabled = enabled && hasValidInput && hasRequiredAccount;
9478
9580
  const serializedChainBalances = chainBalances ? JSON.stringify(chainBalances) : null;
9479
- const tickMetadataQuery = (0, import_react_query40.useQuery)({
9581
+ const tickMetadataQuery = (0, import_react_query41.useQuery)({
9480
9582
  queryKey: ["orderbooks", marketId != null ? marketId : "__disabled__", "limit-order-ticks"],
9481
9583
  queryFn: ({ signal }) => client.getOrderbooks({ venueMarketIds: [marketId] }, { signal }),
9482
9584
  enabled: enabled && Boolean(marketId),
@@ -9485,7 +9587,7 @@ var useLimitOrderVenueQuotes = (options) => {
9485
9587
  refetchOnWindowFocus: false,
9486
9588
  retry: 1
9487
9589
  });
9488
- const queries = (0, import_react_query40.useQueries)({
9590
+ const queries = (0, import_react_query41.useQueries)({
9489
9591
  queries: uniqueRequests.map((request) => ({
9490
9592
  queryKey: [
9491
9593
  "smart-route",
@@ -9517,7 +9619,7 @@ var useLimitOrderVenueQuotes = (options) => {
9517
9619
  );
9518
9620
  }),
9519
9621
  enabled: queryEnabled,
9520
- placeholderData: import_react_query40.keepPreviousData,
9622
+ placeholderData: import_react_query41.keepPreviousData,
9521
9623
  staleTime: staleTimeMs,
9522
9624
  refetchInterval: (queryState) => {
9523
9625
  var _a2, _b2, _c, _d;
@@ -9567,7 +9669,7 @@ var useLimitOrderVenueQuotes = (options) => {
9567
9669
  };
9568
9670
 
9569
9671
  // src/use-venue-sell-quotes.ts
9570
- var import_react_query41 = require("@tanstack/react-query");
9672
+ var import_react_query42 = require("@tanstack/react-query");
9571
9673
  var getIsDocumentVisible3 = () => {
9572
9674
  if (typeof document === "undefined") return true;
9573
9675
  return document.visibilityState !== "hidden";
@@ -9598,7 +9700,7 @@ var useVenueSellQuotes = (options) => {
9598
9700
  refreshContext
9599
9701
  } = options;
9600
9702
  const uniqueRequests = getUniqueVenueRequests2(requests);
9601
- const queries = (0, import_react_query41.useQueries)({
9703
+ const queries = (0, import_react_query42.useQueries)({
9602
9704
  queries: uniqueRequests.map((request) => {
9603
9705
  const hasValidInput = request.requestedSellShares > 0 && request.sellShares > 0 && request.availableShares > 0;
9604
9706
  const queryEnabled = enabled && !!venueMarketOutcomeId && !!accountId && hasValidInput;
@@ -9682,12 +9784,12 @@ var useVenueSellQuotes = (options) => {
9682
9784
  };
9683
9785
 
9684
9786
  // src/use-user-holdings.ts
9685
- var import_react_query42 = require("@tanstack/react-query");
9787
+ var import_react_query43 = require("@tanstack/react-query");
9686
9788
  function useUserHoldings(options) {
9687
9789
  var _a, _b;
9688
9790
  const client = useAggClient();
9689
9791
  const { venue, venueMarketId, venueEventId, enabled = true } = options;
9690
- const query = (0, import_react_query42.useInfiniteQuery)({
9792
+ const query = (0, import_react_query43.useInfiniteQuery)({
9691
9793
  queryKey: ["user-holdings", venue, venueMarketId, venueEventId],
9692
9794
  queryFn: (_0) => __async(null, [_0], function* ({ pageParam }) {
9693
9795
  return client.getUserHoldings({
@@ -9716,10 +9818,10 @@ function useUserHoldings(options) {
9716
9818
  var import_react41 = require("react");
9717
9819
 
9718
9820
  // src/use-venue-event.ts
9719
- var import_react_query44 = require("@tanstack/react-query");
9821
+ var import_react_query45 = require("@tanstack/react-query");
9720
9822
 
9721
9823
  // src/use-recurring-crypto-markets.ts
9722
- var import_react_query43 = require("@tanstack/react-query");
9824
+ var import_react_query44 = require("@tanstack/react-query");
9723
9825
  var RESOLVING_POLL_INTERVAL_MS = 15e3;
9724
9826
  var FALLBACK_VENUE_EVENT_PAGE_LIMIT = 100;
9725
9827
  var FALLBACK_VENUE_EVENT_MAX_PAGES = 5;
@@ -10219,7 +10321,7 @@ var useRecurringCryptoMarkets = ({
10219
10321
  const client = useAggClient();
10220
10322
  const identity = event ? resolveRecurringCryptoIdentity(event) : null;
10221
10323
  const isEnabled = enabled && event != null && identity != null;
10222
- const query = (0, import_react_query43.useQuery)({
10324
+ const query = (0, import_react_query44.useQuery)({
10223
10325
  queryKey: [
10224
10326
  "recurring-crypto-markets",
10225
10327
  event == null ? void 0 : event.id,
@@ -10281,7 +10383,7 @@ function useVenueEvent(options) {
10281
10383
  var _a;
10282
10384
  const client = useAggClient();
10283
10385
  const { eventId, enabled = true, cluster } = options;
10284
- const query = (0, import_react_query44.useQuery)({
10386
+ const query = (0, import_react_query45.useQuery)({
10285
10387
  queryKey: ["venue-event", eventId, cluster === false ? "no-cluster" : ""],
10286
10388
  queryFn: (_0) => __async(null, [_0], function* ({ signal }) {
10287
10389
  return client.getVenueEventById(eventId, { signal, cluster });
@@ -10301,13 +10403,13 @@ function useVenueEvent(options) {
10301
10403
  }
10302
10404
 
10303
10405
  // src/use-venue-markets.ts
10304
- var import_react_query45 = require("@tanstack/react-query");
10406
+ var import_react_query46 = require("@tanstack/react-query");
10305
10407
  var import_react40 = require("react");
10306
10408
  function useVenueMarkets(options) {
10307
10409
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
10308
10410
  const client = (0, import_react40.useContext)(AggClientContext);
10309
- const queryClient = (0, import_react40.useContext)(import_react_query45.QueryClientContext);
10310
- const [fallbackQueryClient] = (0, import_react40.useState)(() => new import_react_query45.QueryClient());
10411
+ const queryClient = (0, import_react40.useContext)(import_react_query46.QueryClientContext);
10412
+ const [fallbackQueryClient] = (0, import_react40.useState)(() => new import_react_query46.QueryClient());
10311
10413
  const venue = options == null ? void 0 : options.venue;
10312
10414
  const venueEventId = options == null ? void 0 : options.venueEventId;
10313
10415
  const cluster = options == null ? void 0 : options.cluster;
@@ -10334,7 +10436,7 @@ function useVenueMarkets(options) {
10334
10436
  if (enabled && !client) {
10335
10437
  throw new Error("useVenueMarkets must be used within an <AggProvider>");
10336
10438
  }
10337
- const query = (0, import_react_query45.useInfiniteQuery)(
10439
+ const query = (0, import_react_query46.useInfiniteQuery)(
10338
10440
  {
10339
10441
  queryKey: [
10340
10442
  "venue-markets",
@@ -10466,13 +10568,13 @@ function useEnrichedVenueEvent(options) {
10466
10568
  }
10467
10569
 
10468
10570
  // src/use-venue-events.ts
10469
- var import_react_query46 = require("@tanstack/react-query");
10571
+ var import_react_query47 = require("@tanstack/react-query");
10470
10572
  var import_react42 = require("react");
10471
10573
  function useVenueEvents(options) {
10472
10574
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
10473
10575
  const client = (0, import_react42.useContext)(AggClientContext);
10474
- const queryClient = (0, import_react42.useContext)(import_react_query46.QueryClientContext);
10475
- const [fallbackQueryClient] = (0, import_react42.useState)(() => new import_react_query46.QueryClient());
10576
+ const queryClient = (0, import_react42.useContext)(import_react_query47.QueryClientContext);
10577
+ const [fallbackQueryClient] = (0, import_react42.useState)(() => new import_react_query47.QueryClient());
10476
10578
  const venues = options == null ? void 0 : options.venues;
10477
10579
  const search = options == null ? void 0 : options.search;
10478
10580
  const categoryIds = options == null ? void 0 : options.categoryIds;
@@ -10499,7 +10601,7 @@ function useVenueEvents(options) {
10499
10601
  if (enabled && !client) {
10500
10602
  throw new Error("useVenueEvents must be used within an <AggProvider>");
10501
10603
  }
10502
- const query = (0, import_react_query46.useInfiniteQuery)(
10604
+ const query = (0, import_react_query47.useInfiniteQuery)(
10503
10605
  {
10504
10606
  queryKey: [
10505
10607
  queryKeyScope,
@@ -10547,7 +10649,7 @@ function useVenueEvents(options) {
10547
10649
  return (_a2 = lastPage.nextCursor) != null ? _a2 : void 0;
10548
10650
  },
10549
10651
  // TODO: RMIK - Comment out to show skeletons on category switch
10550
- placeholderData: import_react_query46.keepPreviousData,
10652
+ placeholderData: import_react_query47.keepPreviousData,
10551
10653
  enabled: enabled && !!client
10552
10654
  },
10553
10655
  queryClient != null ? queryClient : fallbackQueryClient
@@ -10595,7 +10697,7 @@ function useVenueEvents(options) {
10595
10697
  }
10596
10698
 
10597
10699
  // src/use-sports-live.ts
10598
- var import_react_query47 = require("@tanstack/react-query");
10700
+ var import_react_query48 = require("@tanstack/react-query");
10599
10701
  var SPORTS_LIVE_POLL_INTERVAL_MS = 5e3;
10600
10702
  var SPORTS_SCHEDULED_POLL_INTERVAL_MS = 3e4;
10601
10703
  var sportsLiveQueryKey = (sortedEventIds) => ["sports-live", ...sortedEventIds];
@@ -10615,7 +10717,7 @@ var useSportsLive = (eventIds, enabled = true) => {
10615
10717
  const sortedEventIds = [
10616
10718
  ...new Set(eventIds.map((eventId) => eventId.trim()).filter(Boolean))
10617
10719
  ].sort();
10618
- const query = (0, import_react_query47.useQuery)({
10720
+ const query = (0, import_react_query48.useQuery)({
10619
10721
  queryKey: sportsLiveQueryKey(sortedEventIds),
10620
10722
  queryFn: ({ signal }) => client.getSportsLive(sortedEventIds, { signal }),
10621
10723
  enabled: enabled && sortedEventIds.length > 0,
@@ -10635,7 +10737,7 @@ var useSportsLive = (eventIds, enabled = true) => {
10635
10737
  };
10636
10738
 
10637
10739
  // src/use-venue-market-midpoints.ts
10638
- var import_react_query48 = require("@tanstack/react-query");
10740
+ var import_react_query49 = require("@tanstack/react-query");
10639
10741
  var normalizeVenueMarketIds2 = (venueMarketIds) => {
10640
10742
  return [
10641
10743
  ...new Set(venueMarketIds.map((venueMarketId) => venueMarketId.trim()).filter(Boolean))
@@ -10674,7 +10776,7 @@ function useVenueMarketMidpoints(options) {
10674
10776
  const enabled = (_a = options.enabled) != null ? _a : true;
10675
10777
  const requestedVenueMarketIds = normalizeVenueMarketIds2(options.venueMarketIds);
10676
10778
  const maxMidpointIdsPerRequest = (_b = options.maxMidpointIdsPerRequest) != null ? _b : configuredMaxMidpointIdsPerRequest;
10677
- const query = (0, import_react_query48.useQuery)({
10779
+ const query = (0, import_react_query49.useQuery)({
10678
10780
  queryKey: requestedVenueMarketIds.length ? ["venue-market-midpoints", requestedVenueMarketIds, maxMidpointIdsPerRequest] : ["venue-market-midpoints", "__disabled__"],
10679
10781
  queryFn: (_0) => __async(null, [_0], function* ({ signal }) {
10680
10782
  if (requestedVenueMarketIds.length === 0) {
@@ -10690,7 +10792,7 @@ function useVenueMarketMidpoints(options) {
10690
10792
  gcTime: 5 * 6e4,
10691
10793
  refetchOnWindowFocus: false,
10692
10794
  retry: 1,
10693
- placeholderData: import_react_query48.keepPreviousData
10795
+ placeholderData: import_react_query49.keepPreviousData
10694
10796
  });
10695
10797
  const midpointRows = (_d = (_c = query.data) == null ? void 0 : _c.data) != null ? _d : [];
10696
10798
  const midpointsByVenueMarketId = mapMidpointsByVenueMarketId(midpointRows);
@@ -10985,11 +11087,11 @@ function usePaperOnboarding() {
10985
11087
  }
10986
11088
 
10987
11089
  // src/use-settlement-details-data.ts
10988
- var import_react_query49 = require("@tanstack/react-query");
11090
+ var import_react_query50 = require("@tanstack/react-query");
10989
11091
  function useSettlementDetailsData(options) {
10990
11092
  const client = useAggClient();
10991
11093
  const { eventId, market, enabled, needsEvent, needsMarket } = options;
10992
- const eventQuery = (0, import_react_query49.useQuery)({
11094
+ const eventQuery = (0, import_react_query50.useQuery)({
10993
11095
  queryKey: ["settlement-details", "event", client.appId, eventId],
10994
11096
  queryFn: ({ signal }) => client.getVenueEventById(eventId, { signal }),
10995
11097
  enabled: enabled && needsEvent,
@@ -10997,7 +11099,7 @@ function useSettlementDetailsData(options) {
10997
11099
  gcTime: 10 * 6e4,
10998
11100
  retry: false
10999
11101
  });
11000
- const marketQuery = (0, import_react_query49.useQuery)({
11102
+ const marketQuery = (0, import_react_query50.useQuery)({
11001
11103
  queryKey: ["settlement-details", "market", client.appId, market.id],
11002
11104
  queryFn: (_0) => __async(null, [_0], function* ({ signal }) {
11003
11105
  const response = yield client.getVenueMarkets(
@@ -11018,7 +11120,7 @@ function useSettlementDetailsData(options) {
11018
11120
 
11019
11121
  // src/use-hosted-venue-transfers.ts
11020
11122
  var import_react46 = require("react");
11021
- var import_react_query50 = require("@tanstack/react-query");
11123
+ var import_react_query51 = require("@tanstack/react-query");
11022
11124
  var validRequest = (value) => {
11023
11125
  var _a;
11024
11126
  const row = value;
@@ -11031,7 +11133,7 @@ function useHostedVenueTransfers(accountId, environment) {
11031
11133
  const client = useAggClient();
11032
11134
  const { user, isAuthenticated } = useAggAuthContext();
11033
11135
  const { executionMode, isResolving } = useResolvedExecutionMode();
11034
- const queryClient = (0, import_react_query50.useQueryClient)();
11136
+ const queryClient = (0, import_react_query51.useQueryClient)();
11035
11137
  const userId = (_a = user == null ? void 0 : user.id) != null ? _a : null;
11036
11138
  const permitted = isAuthenticated && !!userId && !isResolving && executionMode === "live";
11037
11139
  const scope = JSON.stringify([userId, accountId, environment]);
@@ -11070,7 +11172,7 @@ function useHostedVenueTransfers(accountId, environment) {
11070
11172
  });
11071
11173
  invalidateBalanceQueries(queryClient);
11072
11174
  };
11073
- const deposit = (0, import_react_query50.useMutation)({
11175
+ const deposit = (0, import_react_query51.useMutation)({
11074
11176
  mutationFn: () => __async(null, null, function* () {
11075
11177
  assertSession();
11076
11178
  const result2 = yield client.getHostedVenueDepositAddress("betdex", { mode: "live" });
@@ -11080,7 +11182,7 @@ function useHostedVenueTransfers(accountId, environment) {
11080
11182
  }),
11081
11183
  retry: false
11082
11184
  });
11083
- const withdrawal = (0, import_react_query50.useMutation)({
11185
+ const withdrawal = (0, import_react_query51.useMutation)({
11084
11186
  mutationFn: (request) => __async(null, null, function* () {
11085
11187
  assertSession();
11086
11188
  if (dispatching.current) throw new Error("Withdrawal request is already pending");
@@ -11099,7 +11201,7 @@ function useHostedVenueTransfers(accountId, environment) {
11099
11201
  }),
11100
11202
  retry: false
11101
11203
  });
11102
- const status = (0, import_react_query50.useQuery)({
11204
+ const status = (0, import_react_query51.useQuery)({
11103
11205
  queryKey: ["agg", "hosted-venue-withdrawal", scope, journal == null ? void 0 : journal.withdrawalId],
11104
11206
  queryFn: () => __async(null, null, function* () {
11105
11207
  assertSession();
@@ -11194,6 +11296,7 @@ function useHostedVenueTransfers(accountId, environment) {
11194
11296
  CONFIRMED_MATCH_STATUSES,
11195
11297
  DEFAULT_AGG_ROOT_CLASS_NAME,
11196
11298
  EventListStateProvider,
11299
+ LEADERBOARD_PERIODS,
11197
11300
  MAX_ORDER_VENUE_MARKET_IDS_PER_REQUEST,
11198
11301
  MAX_PRICE_GAP_PCT,
11199
11302
  MIN_PRICE_GAP_PCT,
@@ -11232,6 +11335,8 @@ function useHostedVenueTransfers(accountId, environment) {
11232
11335
  invalidateUserClaimState,
11233
11336
  invalidateUserMoneyState,
11234
11337
  isVenueDisabledByConfig,
11338
+ leaderboardQueryKeys,
11339
+ leaderboardRange,
11235
11340
  mergeBestPricesPreferringLive,
11236
11341
  mergeRecurringCryptoWindows,
11237
11342
  normalizeVenueId,
@@ -11292,6 +11397,7 @@ function useHostedVenueTransfers(accountId, environment) {
11292
11397
  useHostedVenueActivity,
11293
11398
  useHostedVenueTransfers,
11294
11399
  useLabels,
11400
+ useLeaderboard,
11295
11401
  useLimitOrderVenueQuotes,
11296
11402
  useLinkAccount,
11297
11403
  useLiveBestPriceCandidates,