@agg-build/sdk 1.2.13 → 2.0.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
@@ -70,6 +70,9 @@ __export(index_exports, {
70
70
  MatchStatus: () => MatchStatus,
71
71
  MatchType: () => MatchType,
72
72
  OrderStatus: () => OrderStatus,
73
+ OrderType: () => OrderType,
74
+ RECURRENCE_CADENCES: () => RECURRENCE_CADENCES,
75
+ TimeInForce: () => TimeInForce,
73
76
  TradeSide: () => TradeSide,
74
77
  TurnstileChallengeError: () => TurnstileChallengeError,
75
78
  VENUES: () => VENUES,
@@ -193,8 +196,14 @@ var OrderStatus = /* @__PURE__ */ ((OrderStatus2) => {
193
196
  OrderStatus2["pending_bridge"] = "pending_bridge";
194
197
  OrderStatus2["submitting"] = "submitting";
195
198
  OrderStatus2["submitted"] = "submitted";
199
+ OrderStatus2["open"] = "open";
200
+ OrderStatus2["partially_filled_open"] = "partially_filled_open";
201
+ OrderStatus2["cancel_pending"] = "cancel_pending";
196
202
  OrderStatus2["filled"] = "filled";
197
203
  OrderStatus2["partial_fill"] = "partial_fill";
204
+ OrderStatus2["failed"] = "failed";
205
+ OrderStatus2["expired"] = "expired";
206
+ OrderStatus2["cancelled"] = "cancelled";
198
207
  return OrderStatus2;
199
208
  })(OrderStatus || {});
200
209
  var TradeSide = /* @__PURE__ */ ((TradeSide2) => {
@@ -202,6 +211,20 @@ var TradeSide = /* @__PURE__ */ ((TradeSide2) => {
202
211
  TradeSide2["Sell"] = "sell";
203
212
  return TradeSide2;
204
213
  })(TradeSide || {});
214
+ var OrderType = /* @__PURE__ */ ((OrderType2) => {
215
+ OrderType2["Market"] = "market";
216
+ OrderType2["Limit"] = "limit";
217
+ return OrderType2;
218
+ })(OrderType || {});
219
+ var TimeInForce = /* @__PURE__ */ ((TimeInForce2) => {
220
+ TimeInForce2["GTC"] = "GTC";
221
+ TimeInForce2["GTD"] = "GTD";
222
+ TimeInForce2["FOK"] = "FOK";
223
+ TimeInForce2["FAK"] = "FAK";
224
+ TimeInForce2["IOC"] = "IOC";
225
+ TimeInForce2["ALO"] = "ALO";
226
+ return TimeInForce2;
227
+ })(TimeInForce || {});
205
228
 
206
229
  // ../common/src/utils/format-market-display.ts
207
230
  function formatOutcomeLabel(venue, outcome, _market) {
@@ -826,7 +849,14 @@ var AggWebSocket = class {
826
849
  this.pendingFlushUnsubs = /* @__PURE__ */ new Set();
827
850
  this.pendingFlushTradeSubs = /* @__PURE__ */ new Set();
828
851
  this.pendingFlushTradeUnsubs = /* @__PURE__ */ new Set();
852
+ this.pendingFlushArbSubs = /* @__PURE__ */ new Set();
853
+ this.pendingFlushArbUnsubs = /* @__PURE__ */ new Set();
829
854
  this.flushScheduled = false;
855
+ // ── Arb subscriptions ──
856
+ this.arbSubs = /* @__PURE__ */ new Map();
857
+ this.arbFeedCbs = /* @__PURE__ */ new Set();
858
+ /** Latest arb market update per marketId (last-value-wins, loss-tolerant). */
859
+ this.latestArb = /* @__PURE__ */ new Map();
830
860
  // ── Orderbook state per market ──
831
861
  this.books = /* @__PURE__ */ new Map();
832
862
  /** Markets currently resyncing (awaiting snapshot after seq gap / checksum mismatch). */
@@ -858,6 +888,69 @@ var AggWebSocket = class {
858
888
  isResyncing(outcomeId) {
859
889
  return this.resyncing.has(outcomeId);
860
890
  }
891
+ /** Get the latest arb update for a market (or null if none received yet). */
892
+ getArb(marketId) {
893
+ var _a;
894
+ return (_a = this.latestArb.get(marketId)) != null ? _a : null;
895
+ }
896
+ /**
897
+ * Subscribe to per-market arb updates for a given marketId.
898
+ * Ref-counted: multiple callers for the same marketId share one server subscription.
899
+ * Returns an unsubscribe function.
900
+ */
901
+ subscribeArb(marketId, cb) {
902
+ let entry = this.arbSubs.get(marketId);
903
+ if (!entry) {
904
+ entry = { refCount: 0, cbs: /* @__PURE__ */ new Set() };
905
+ this.arbSubs.set(marketId, entry);
906
+ this.ensureConnected();
907
+ if (this._connected) {
908
+ this.pendingFlushArbUnsubs.delete(marketId);
909
+ this.pendingFlushArbSubs.add(marketId);
910
+ this.scheduleFlush();
911
+ }
912
+ }
913
+ entry.cbs.add(cb);
914
+ entry.refCount++;
915
+ return () => {
916
+ const e = this.arbSubs.get(marketId);
917
+ if (!e) return;
918
+ e.cbs.delete(cb);
919
+ e.refCount--;
920
+ if (e.refCount <= 0) {
921
+ this.arbSubs.delete(marketId);
922
+ if (this._connected) {
923
+ if (this.pendingFlushArbSubs.has(marketId)) {
924
+ this.pendingFlushArbSubs.delete(marketId);
925
+ } else {
926
+ this.pendingFlushArbUnsubs.add(marketId);
927
+ this.scheduleFlush();
928
+ }
929
+ }
930
+ }
931
+ };
932
+ }
933
+ /**
934
+ * Subscribe to the global arb-feed batches.
935
+ * Only one server subscription is maintained regardless of how many callers.
936
+ * Returns an unsubscribe function.
937
+ */
938
+ subscribeArbFeed(cb) {
939
+ const wasEmpty = this.arbFeedCbs.size === 0;
940
+ this.arbFeedCbs.add(cb);
941
+ if (wasEmpty) {
942
+ this.ensureConnected();
943
+ if (this._connected) {
944
+ this.send({ action: "subscribe", channel: "arb-feed" });
945
+ }
946
+ }
947
+ return () => {
948
+ this.arbFeedCbs.delete(cb);
949
+ if (this.arbFeedCbs.size === 0 && this._connected) {
950
+ this.send({ action: "unsubscribe", channel: "arb-feed" });
951
+ }
952
+ };
953
+ }
861
954
  /**
862
955
  * Subscribe to a feed by outcome ID.
863
956
  * @param outcomeId The venueMarketOutcomeId to subscribe to.
@@ -995,6 +1088,11 @@ var AggWebSocket = class {
995
1088
  this.pendingFlushUnsubs.clear();
996
1089
  this.pendingFlushTradeSubs.clear();
997
1090
  this.pendingFlushTradeUnsubs.clear();
1091
+ this.arbSubs.clear();
1092
+ this.arbFeedCbs.clear();
1093
+ this.latestArb.clear();
1094
+ this.pendingFlushArbSubs.clear();
1095
+ this.pendingFlushArbUnsubs.clear();
998
1096
  this.flushScheduled = false;
999
1097
  }
1000
1098
  /** Update callbacks (e.g., after React re-render). */
@@ -1040,7 +1138,7 @@ var AggWebSocket = class {
1040
1138
  if (wasConnected) {
1041
1139
  (_b = (_a = this.callbacks).onConnectionStateChange) == null ? void 0 : _b.call(_a, false);
1042
1140
  }
1043
- if (!this.destroyed && this.subs.size > 0) {
1141
+ if (!this.destroyed && (this.subs.size > 0 || this.arbSubs.size > 0 || this.arbFeedCbs.size > 0)) {
1044
1142
  this.scheduleReconnect();
1045
1143
  }
1046
1144
  };
@@ -1085,7 +1183,7 @@ var AggWebSocket = class {
1085
1183
  }
1086
1184
  // ── Message handling ──
1087
1185
  handleMessage(raw) {
1088
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
1186
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
1089
1187
  const type = raw.type;
1090
1188
  switch (type) {
1091
1189
  case "orderbook_snapshot":
@@ -1133,6 +1231,22 @@ var AggWebSocket = class {
1133
1231
  case "withdrawal_lifecycle":
1134
1232
  (_l = (_k = this.callbacks).onWithdrawalLifecycle) == null ? void 0 : _l.call(_k, raw);
1135
1233
  break;
1234
+ case "arb_market_update": {
1235
+ const arbMsg = raw;
1236
+ this.latestArb.set(arbMsg.marketId, arbMsg);
1237
+ const arbEntry = this.arbSubs.get(arbMsg.marketId);
1238
+ if (arbEntry) {
1239
+ for (const cb of arbEntry.cbs) cb(arbMsg);
1240
+ }
1241
+ (_n = (_m = this.callbacks).onArbMarket) == null ? void 0 : _n.call(_m, arbMsg);
1242
+ break;
1243
+ }
1244
+ case "arb_feed_batch": {
1245
+ const feedMsg = raw;
1246
+ for (const cb of this.arbFeedCbs) cb(feedMsg);
1247
+ (_p = (_o = this.callbacks).onArbFeed) == null ? void 0 : _p.call(_o, feedMsg);
1248
+ break;
1249
+ }
1136
1250
  }
1137
1251
  }
1138
1252
  /**
@@ -1169,6 +1283,17 @@ var AggWebSocket = class {
1169
1283
  this.send({ action: "resnapshot", channel: "orderbook", outcomeIds: resnapshotIds });
1170
1284
  }
1171
1285
  this.pendingResnapshots.clear();
1286
+ const arbSet = new Set(this.activeArbMarkets());
1287
+ this.pendingFlushArbSubs.forEach((id) => arbSet.add(id));
1288
+ const arbIds = Array.from(arbSet);
1289
+ if (arbIds.length > 0) {
1290
+ this.send({ action: "subscribe", channel: "arb", marketIds: arbIds });
1291
+ }
1292
+ this.pendingFlushArbSubs.clear();
1293
+ this.pendingFlushArbUnsubs.clear();
1294
+ if (this.arbFeedCbs.size > 0) {
1295
+ this.send({ action: "subscribe", channel: "arb-feed" });
1296
+ }
1172
1297
  }
1173
1298
  handleSnapshot(raw) {
1174
1299
  var _a, _b;
@@ -1340,6 +1465,8 @@ var AggWebSocket = class {
1340
1465
  this.pendingFlushUnsubs.clear();
1341
1466
  this.pendingFlushTradeSubs.clear();
1342
1467
  this.pendingFlushTradeUnsubs.clear();
1468
+ this.pendingFlushArbSubs.clear();
1469
+ this.pendingFlushArbUnsubs.clear();
1343
1470
  return;
1344
1471
  }
1345
1472
  this.flushPending();
@@ -1386,6 +1513,28 @@ var AggWebSocket = class {
1386
1513
  });
1387
1514
  this.pendingFlushTradeUnsubs.clear();
1388
1515
  }
1516
+ for (const id of [...this.pendingFlushArbSubs]) {
1517
+ if (this.pendingFlushArbUnsubs.has(id)) {
1518
+ this.pendingFlushArbSubs.delete(id);
1519
+ this.pendingFlushArbUnsubs.delete(id);
1520
+ }
1521
+ }
1522
+ if (this.pendingFlushArbSubs.size > 0) {
1523
+ this.send({
1524
+ action: "subscribe",
1525
+ channel: "arb",
1526
+ marketIds: Array.from(this.pendingFlushArbSubs)
1527
+ });
1528
+ this.pendingFlushArbSubs.clear();
1529
+ }
1530
+ if (this.pendingFlushArbUnsubs.size > 0) {
1531
+ this.send({
1532
+ action: "unsubscribe",
1533
+ channel: "arb",
1534
+ marketIds: Array.from(this.pendingFlushArbUnsubs)
1535
+ });
1536
+ this.pendingFlushArbUnsubs.clear();
1537
+ }
1389
1538
  }
1390
1539
  sendSubscribe(outcomeIds) {
1391
1540
  this.send({ action: "subscribe", channel: "orderbook", outcomeIds });
@@ -1410,6 +1559,9 @@ var AggWebSocket = class {
1410
1559
  });
1411
1560
  return markets;
1412
1561
  }
1562
+ activeArbMarkets() {
1563
+ return Array.from(this.arbSubs.keys());
1564
+ }
1413
1565
  emitDiagnostic(event) {
1414
1566
  var _a, _b;
1415
1567
  (_b = (_a = this.callbacks).onDiagnostics) == null ? void 0 : _b.call(_a, event);
@@ -2091,6 +2243,7 @@ Issued At: ${issuedAt}`;
2091
2243
  if (params.orderId) query.orderId = params.orderId;
2092
2244
  if (params.quoteId) query.quoteId = params.quoteId;
2093
2245
  if (params.status) query.status = params.status;
2246
+ if (params.mode) query.mode = params.mode;
2094
2247
  if (params.cursor) query.cursor = params.cursor;
2095
2248
  if (params.limit != null) query.limit = String(params.limit);
2096
2249
  return this.request("/execution/orders", {
@@ -2117,6 +2270,7 @@ Issued At: ${issuedAt}`;
2117
2270
  if (params.cursor) query.cursor = params.cursor;
2118
2271
  if (params.limit != null) query.limit = String(params.limit);
2119
2272
  if (params.status) query.status = params.status;
2273
+ if (params.mode) query.mode = params.mode;
2120
2274
  return this.request("/execution/positions", {
2121
2275
  query: Object.keys(query).length ? query : void 0
2122
2276
  });
@@ -2124,8 +2278,12 @@ Issued At: ${issuedAt}`;
2124
2278
  }
2125
2279
  /** Get managed wallet balances, including per-chain cash balances and per-venue position balances. */
2126
2280
  getManagedBalances() {
2127
- return __async(this, null, function* () {
2128
- return this.request("/execution/balances");
2281
+ return __async(this, arguments, function* (params = {}) {
2282
+ const query = {};
2283
+ if (params.mode) query.mode = params.mode;
2284
+ return this.request("/execution/balances", {
2285
+ query: Object.keys(query).length ? query : void 0
2286
+ });
2129
2287
  });
2130
2288
  }
2131
2289
  /** Cancel a pending managed execution by order id. */
@@ -2175,6 +2333,92 @@ Issued At: ${issuedAt}`;
2175
2333
  });
2176
2334
  });
2177
2335
  }
2336
+ /** List deterministic recurring crypto window markets across venues. Requires appId or admin auth. */
2337
+ listRecurringCryptoMarkets(options) {
2338
+ return __async(this, null, function* () {
2339
+ const query = {};
2340
+ if ((options == null ? void 0 : options.assets) && options.assets.length > 0) query.assets = options.assets;
2341
+ if ((options == null ? void 0 : options.durations) && options.durations.length > 0) query.durations = options.durations;
2342
+ if (options == null ? void 0 : options.interval) query.interval = options.interval;
2343
+ if (options == null ? void 0 : options.window) query.window = options.window;
2344
+ if ((options == null ? void 0 : options.venues) && options.venues.length > 0) query.venues = options.venues;
2345
+ if ((options == null ? void 0 : options.status) && options.status.length > 0) query.status = options.status;
2346
+ if (options == null ? void 0 : options.windowStartFrom) query.windowStartFrom = options.windowStartFrom;
2347
+ if (options == null ? void 0 : options.windowStartTo) query.windowStartTo = options.windowStartTo;
2348
+ if (options == null ? void 0 : options.cursor) query.cursor = options.cursor;
2349
+ if ((options == null ? void 0 : options.limit) != null) query.limit = String(options.limit);
2350
+ if ((options == null ? void 0 : options.includeOrderbookPrices) != null) {
2351
+ query.includeOrderbookPrices = String(options.includeOrderbookPrices);
2352
+ }
2353
+ if ((options == null ? void 0 : options.includeReferencePrices) != null) {
2354
+ query.includeReferencePrices = String(options.includeReferencePrices);
2355
+ }
2356
+ if ((options == null ? void 0 : options.includeDirectVenueMarkets) != null) {
2357
+ query.includeDirectVenueMarkets = String(options.includeDirectVenueMarkets);
2358
+ }
2359
+ return this.request("/crypto/recurring-markets", {
2360
+ query: Object.keys(query).length > 0 ? query : void 0,
2361
+ signal: options == null ? void 0 : options.signal
2362
+ });
2363
+ });
2364
+ }
2365
+ /** Poll fresh reference prices for recurring crypto markets. Requires appId or admin auth. */
2366
+ getCryptoReferencePrices(options) {
2367
+ return __async(this, null, function* () {
2368
+ var _a, _b, _c, _d, _e, _f;
2369
+ const targets = [
2370
+ ...(_a = options.targets) != null ? _a : [],
2371
+ ...((_b = options.venueMarketIds) != null ? _b : []).map((venueMarketId) => ({
2372
+ type: "venueMarket",
2373
+ venueMarketId
2374
+ })),
2375
+ ...((_c = options.venueEventIds) != null ? _c : []).map((venueEventId) => ({
2376
+ type: "venueEvent",
2377
+ venueEventId
2378
+ })),
2379
+ ...((_d = options.externalMarkets) != null ? _d : []).map((market) => ({
2380
+ type: "externalVenueMarket",
2381
+ venue: market.venue,
2382
+ externalMarketId: market.externalMarketId
2383
+ })),
2384
+ ...((_e = options.markets) != null ? _e : []).map((market) => {
2385
+ var _a2;
2386
+ return {
2387
+ type: "market",
2388
+ venue: market.venue,
2389
+ venueEventId: market.venueEventId,
2390
+ venueMarketId: market.venueMarketId,
2391
+ externalEventId: market.externalEventId,
2392
+ externalMarketId: market.externalMarketId,
2393
+ asset: market.asset,
2394
+ quoteAsset: (_a2 = market.quoteAsset) != null ? _a2 : "USD",
2395
+ resolution: market.resolution
2396
+ };
2397
+ }),
2398
+ ...((_f = options.windowMarkets) != null ? _f : []).flatMap(
2399
+ (windowMarket) => windowMarket.markets.map((market) => ({
2400
+ type: "market",
2401
+ venue: market.venue,
2402
+ venueEventId: market.venueEventId,
2403
+ venueMarketId: market.venueMarketId,
2404
+ externalEventId: market.externalEventId,
2405
+ externalMarketId: market.externalMarketId,
2406
+ asset: windowMarket.asset,
2407
+ quoteAsset: windowMarket.quoteAsset,
2408
+ resolution: market.resolution
2409
+ }))
2410
+ )
2411
+ ];
2412
+ if (targets.length === 0) {
2413
+ throw new Error("getCryptoReferencePrices requires at least one target");
2414
+ }
2415
+ return this.request("/crypto/reference-prices", {
2416
+ method: "POST",
2417
+ body: JSON.stringify({ targets }),
2418
+ signal: options.signal
2419
+ });
2420
+ });
2421
+ }
2178
2422
  /** List venue markets with optional filters. Requires appId or admin auth. Supports cursor-based pagination. */
2179
2423
  getVenueMarkets(options) {
2180
2424
  return __async(this, null, function* () {
@@ -2373,6 +2617,7 @@ Issued At: ${issuedAt}`;
2373
2617
  if (params.compareVenues) query.compareVenues = "true";
2374
2618
  if ((_c = params.allowedVenues) == null ? void 0 : _c.length) query.allowedVenues = params.allowedVenues.map(String);
2375
2619
  if (params.tradeSide) query.side = params.tradeSide;
2620
+ if (params.mode) query.mode = params.mode;
2376
2621
  if (params.deepEstimate) query.deepEstimate = "true";
2377
2622
  const response = yield this.request(
2378
2623
  `/orderbook/${encodeURIComponent(venueMarketOutcomeId)}/route`,
@@ -2474,6 +2719,7 @@ Issued At: ${issuedAt}`;
2474
2719
  if (params == null ? void 0 : params.cursor) query.cursor = params.cursor;
2475
2720
  if ((params == null ? void 0 : params.limit) != null) query.limit = String(params.limit);
2476
2721
  if (params == null ? void 0 : params.status) query.status = params.status;
2722
+ if (params == null ? void 0 : params.mode) query.mode = params.mode;
2477
2723
  return this.request("/execution/positions", {
2478
2724
  query: Object.keys(query).length > 0 ? query : void 0
2479
2725
  });
@@ -2512,6 +2758,18 @@ Issued At: ${issuedAt}`;
2512
2758
  // src/best-split.ts
2513
2759
  var computeBestSplitsByAmount2 = computeBestSplitsByAmount;
2514
2760
 
2761
+ // src/types.ts
2762
+ var RECURRENCE_CADENCES = [
2763
+ "PT5M",
2764
+ "PT10M",
2765
+ "PT15M",
2766
+ "PT1H",
2767
+ "P1D",
2768
+ "P1W",
2769
+ "P1M",
2770
+ "P1Y"
2771
+ ];
2772
+
2515
2773
  // src/errors.ts
2516
2774
  var TurnstileChallengeError = class extends Error {
2517
2775
  constructor(siteKey) {
@@ -2724,6 +2982,9 @@ function createAggClient(options) {
2724
2982
  MatchStatus,
2725
2983
  MatchType,
2726
2984
  OrderStatus,
2985
+ OrderType,
2986
+ RECURRENCE_CADENCES,
2987
+ TimeInForce,
2727
2988
  TradeSide,
2728
2989
  TurnstileChallengeError,
2729
2990
  VENUES,