pmxt 1.6.0__py3-none-any.whl → 2.0.0b0__py3-none-any.whl

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.
@@ -24419,13 +24419,118 @@ var require_BaseExchange = __commonJS({
24419
24419
  this.credentials = credentials;
24420
24420
  }
24421
24421
  /**
24422
+ * Fetch markets with optional filtering, search, or slug lookup.
24423
+ * This is the primary method for retrieving markets in CCXT-style.
24424
+ *
24425
+ * @param params - Optional parameters for filtering and search
24426
+ * @param params.query - Search keyword to filter markets
24427
+ * @param params.slug - Market slug/ticker for direct lookup
24428
+ * @param params.limit - Maximum number of results
24429
+ * @param params.offset - Pagination offset
24430
+ * @param params.sort - Sort order
24431
+ * @param params.searchIn - Where to search (title, description, or both)
24432
+ * @returns Array of unified markets
24433
+ *
24434
+ * @example Fetch all markets
24435
+ * await exchange.fetchMarkets()
24436
+ *
24437
+ * @example Search markets
24438
+ * await exchange.fetchMarkets({ query: 'Trump' })
24439
+ *
24440
+ * @example Get market by slug
24441
+ * await exchange.fetchMarkets({ slug: 'will-trump-win' })
24442
+ */
24443
+ async fetchMarkets(params) {
24444
+ if (params?.slug) {
24445
+ return this.fetchMarketsBySlugImpl(params.slug);
24446
+ }
24447
+ if (params?.query) {
24448
+ return this.searchMarketsImpl(params.query, params);
24449
+ }
24450
+ return this.fetchMarketsImpl(params);
24451
+ }
24452
+ /**
24453
+ * Fetch events with optional keyword search.
24454
+ * Events group related markets together.
24455
+ *
24456
+ * @param params - Optional parameters for search and filtering
24457
+ * @param params.query - Search keyword to filter events
24458
+ * @param params.limit - Maximum number of results
24459
+ * @param params.offset - Pagination offset
24460
+ * @param params.searchIn - Where to search (title, description, or both)
24461
+ * @returns Array of unified events
24462
+ *
24463
+ * @example Search events
24464
+ * await exchange.fetchEvents({ query: 'Election' })
24465
+ */
24466
+ async fetchEvents(params) {
24467
+ if (params?.query) {
24468
+ return this.searchEventsImpl(params.query, params);
24469
+ }
24470
+ throw new Error("fetchEvents() requires a query parameter");
24471
+ }
24472
+ // ----------------------------------------------------------------------------
24473
+ // Implementation methods (to be overridden by exchanges)
24474
+ // ----------------------------------------------------------------------------
24475
+ /**
24476
+ * @internal
24477
+ * Implementation for fetching all markets.
24478
+ */
24479
+ async fetchMarketsImpl(params) {
24480
+ throw new Error("Method fetchMarketsImpl not implemented.");
24481
+ }
24482
+ /**
24483
+ * @internal
24484
+ * Implementation for searching markets by keyword.
24485
+ */
24486
+ async searchMarketsImpl(query, params) {
24487
+ throw new Error("Method searchMarketsImpl not implemented.");
24488
+ }
24489
+ /**
24490
+ * @internal
24491
+ * Implementation for fetching markets by slug/ticker.
24492
+ */
24493
+ async fetchMarketsBySlugImpl(slug) {
24494
+ throw new Error("Method fetchMarketsBySlugImpl not implemented.");
24495
+ }
24496
+ /**
24497
+ * @internal
24498
+ * Implementation for searching events by keyword.
24499
+ */
24500
+ async searchEventsImpl(query, params) {
24501
+ throw new Error("Method searchEventsImpl not implemented.");
24502
+ }
24503
+ // ----------------------------------------------------------------------------
24504
+ // Deprecated methods (kept for backward compatibility)
24505
+ // ----------------------------------------------------------------------------
24506
+ /**
24507
+ * @deprecated Use fetchMarkets({ query: '...' }) instead. Will be removed in v2.0
24508
+ * Search for markets matching a keyword query.
24509
+ * By default, searches only in market titles. Use params.searchIn to search descriptions or both.
24510
+ */
24511
+ async searchMarkets(query, params) {
24512
+ console.warn('\u26A0\uFE0F searchMarkets() is deprecated. Use fetchMarkets({ query: "..." }) instead.');
24513
+ return this.fetchMarkets({ ...params, query });
24514
+ }
24515
+ /**
24516
+ * @deprecated Use fetchMarkets({ slug: '...' }) instead. Will be removed in v2.0
24517
+ * Fetch markets by URL slug (Polymarket) or ticker (Kalshi).
24518
+ * @param slug - Market slug or ticker
24519
+ */
24520
+ async getMarketsBySlug(slug) {
24521
+ console.warn('\u26A0\uFE0F getMarketsBySlug() is deprecated. Use fetchMarkets({ slug: "..." }) instead.');
24522
+ return this.fetchMarkets({ slug });
24523
+ }
24524
+ /**
24525
+ * @deprecated Use fetchEvents({ query: '...' }) instead. Will be removed in v2.0
24422
24526
  * Search for events matching a keyword query.
24423
24527
  * Returns grouped events, each containing related markets.
24424
24528
  * @param query - Search term
24425
24529
  * @param params - Optional filter parameters
24426
24530
  */
24427
24531
  async searchEvents(query, params) {
24428
- throw new Error("Method searchEvents not implemented.");
24532
+ console.warn('\u26A0\uFE0F searchEvents() is deprecated. Use fetchEvents({ query: "..." }) instead.');
24533
+ return this.fetchEvents({ ...params, query });
24429
24534
  }
24430
24535
  /**
24431
24536
  * Fetch historical price data for a specific market outcome.
@@ -38439,6 +38544,302 @@ var require_utils4 = __commonJS({
38439
38544
  }
38440
38545
  });
38441
38546
 
38547
+ // dist/errors.js
38548
+ var require_errors = __commonJS({
38549
+ "dist/errors.js"(exports2) {
38550
+ "use strict";
38551
+ Object.defineProperty(exports2, "__esModule", { value: true });
38552
+ exports2.ExchangeNotAvailable = exports2.NetworkError = exports2.ValidationError = exports2.InsufficientFunds = exports2.InvalidOrder = exports2.RateLimitExceeded = exports2.MarketNotFound = exports2.OrderNotFound = exports2.NotFound = exports2.PermissionDenied = exports2.AuthenticationError = exports2.BadRequest = exports2.BaseError = void 0;
38553
+ var BaseError2 = class extends Error {
38554
+ constructor(message, status, code, retryable = false, exchange) {
38555
+ super(message);
38556
+ this.name = this.constructor.name;
38557
+ this.status = status;
38558
+ this.code = code;
38559
+ this.retryable = retryable;
38560
+ this.exchange = exchange;
38561
+ if (Error.captureStackTrace) {
38562
+ Error.captureStackTrace(this, this.constructor);
38563
+ }
38564
+ }
38565
+ };
38566
+ exports2.BaseError = BaseError2;
38567
+ var BadRequest = class extends BaseError2 {
38568
+ constructor(message, exchange) {
38569
+ super(message, 400, "BAD_REQUEST", false, exchange);
38570
+ }
38571
+ };
38572
+ exports2.BadRequest = BadRequest;
38573
+ var AuthenticationError = class extends BaseError2 {
38574
+ constructor(message, exchange) {
38575
+ super(message, 401, "AUTHENTICATION_ERROR", false, exchange);
38576
+ }
38577
+ };
38578
+ exports2.AuthenticationError = AuthenticationError;
38579
+ var PermissionDenied = class extends BaseError2 {
38580
+ constructor(message, exchange) {
38581
+ super(message, 403, "PERMISSION_DENIED", false, exchange);
38582
+ }
38583
+ };
38584
+ exports2.PermissionDenied = PermissionDenied;
38585
+ var NotFound = class extends BaseError2 {
38586
+ constructor(message, exchange) {
38587
+ super(message, 404, "NOT_FOUND", false, exchange);
38588
+ }
38589
+ };
38590
+ exports2.NotFound = NotFound;
38591
+ var OrderNotFound = class extends BaseError2 {
38592
+ constructor(orderId, exchange) {
38593
+ super(`Order not found: ${orderId}`, 404, "ORDER_NOT_FOUND", false, exchange);
38594
+ }
38595
+ };
38596
+ exports2.OrderNotFound = OrderNotFound;
38597
+ var MarketNotFound = class extends BaseError2 {
38598
+ constructor(marketId, exchange) {
38599
+ super(`Market not found: ${marketId}`, 404, "MARKET_NOT_FOUND", false, exchange);
38600
+ }
38601
+ };
38602
+ exports2.MarketNotFound = MarketNotFound;
38603
+ var RateLimitExceeded = class extends BaseError2 {
38604
+ constructor(message, retryAfter, exchange) {
38605
+ super(message, 429, "RATE_LIMIT_EXCEEDED", true, exchange);
38606
+ this.retryAfter = retryAfter;
38607
+ }
38608
+ };
38609
+ exports2.RateLimitExceeded = RateLimitExceeded;
38610
+ var InvalidOrder = class extends BaseError2 {
38611
+ constructor(message, exchange) {
38612
+ super(message, 400, "INVALID_ORDER", false, exchange);
38613
+ }
38614
+ };
38615
+ exports2.InvalidOrder = InvalidOrder;
38616
+ var InsufficientFunds = class extends BaseError2 {
38617
+ constructor(message, exchange) {
38618
+ super(message, 400, "INSUFFICIENT_FUNDS", false, exchange);
38619
+ }
38620
+ };
38621
+ exports2.InsufficientFunds = InsufficientFunds;
38622
+ var ValidationError = class extends BaseError2 {
38623
+ constructor(message, field, exchange) {
38624
+ super(message, 400, "VALIDATION_ERROR", false, exchange);
38625
+ this.field = field;
38626
+ }
38627
+ };
38628
+ exports2.ValidationError = ValidationError;
38629
+ var NetworkError = class extends BaseError2 {
38630
+ constructor(message, exchange) {
38631
+ super(message, 503, "NETWORK_ERROR", true, exchange);
38632
+ }
38633
+ };
38634
+ exports2.NetworkError = NetworkError;
38635
+ var ExchangeNotAvailable = class extends BaseError2 {
38636
+ constructor(message, exchange) {
38637
+ super(message, 503, "EXCHANGE_NOT_AVAILABLE", true, exchange);
38638
+ }
38639
+ };
38640
+ exports2.ExchangeNotAvailable = ExchangeNotAvailable;
38641
+ }
38642
+ });
38643
+
38644
+ // dist/utils/error-mapper.js
38645
+ var require_error_mapper = __commonJS({
38646
+ "dist/utils/error-mapper.js"(exports2) {
38647
+ "use strict";
38648
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
38649
+ return mod && mod.__esModule ? mod : { "default": mod };
38650
+ };
38651
+ Object.defineProperty(exports2, "__esModule", { value: true });
38652
+ exports2.ErrorMapper = void 0;
38653
+ var axios_1 = __importDefault(require_axios());
38654
+ var errors_1 = require_errors();
38655
+ var ErrorMapper = class {
38656
+ constructor(exchangeName) {
38657
+ this.exchangeName = exchangeName;
38658
+ }
38659
+ /**
38660
+ * Main entry point for error mapping
38661
+ */
38662
+ mapError(error) {
38663
+ if (error instanceof errors_1.BaseError) {
38664
+ if (!error.exchange && this.exchangeName) {
38665
+ return new error.constructor(error.message, this.exchangeName);
38666
+ }
38667
+ return error;
38668
+ }
38669
+ if (axios_1.default.isAxiosError(error)) {
38670
+ return this.mapAxiosError(error);
38671
+ }
38672
+ if (error.code === "ECONNREFUSED" || error.code === "ENOTFOUND" || error.code === "ETIMEDOUT") {
38673
+ return new errors_1.NetworkError(`Network error: ${error.message}`, this.exchangeName);
38674
+ }
38675
+ const message = this.extractErrorMessage(error);
38676
+ return new errors_1.BadRequest(message, this.exchangeName);
38677
+ }
38678
+ /**
38679
+ * Maps axios HTTP errors to appropriate error classes
38680
+ */
38681
+ mapAxiosError(error) {
38682
+ const status = error.response?.status;
38683
+ const message = this.extractErrorMessage(error);
38684
+ const data = error.response?.data;
38685
+ if (!status) {
38686
+ if (error.code === "ECONNABORTED" || error.code === "ETIMEDOUT") {
38687
+ return new errors_1.NetworkError(`Request timeout: ${message}`, this.exchangeName);
38688
+ }
38689
+ return new errors_1.ExchangeNotAvailable(`Exchange unreachable: ${message}`, this.exchangeName);
38690
+ }
38691
+ switch (status) {
38692
+ case 400:
38693
+ return this.mapBadRequestError(message, data);
38694
+ case 401:
38695
+ return new errors_1.AuthenticationError(message, this.exchangeName);
38696
+ case 403:
38697
+ return new errors_1.PermissionDenied(message, this.exchangeName);
38698
+ case 404:
38699
+ return this.mapNotFoundError(message, data);
38700
+ case 429:
38701
+ return this.mapRateLimitError(message, error.response);
38702
+ case 500:
38703
+ case 502:
38704
+ case 503:
38705
+ case 504:
38706
+ return new errors_1.ExchangeNotAvailable(`Exchange error (${status}): ${message}`, this.exchangeName);
38707
+ default:
38708
+ return new errors_1.BadRequest(`HTTP ${status}: ${message}`, this.exchangeName);
38709
+ }
38710
+ }
38711
+ /**
38712
+ * Maps 400 errors to specific bad request subtypes
38713
+ */
38714
+ mapBadRequestError(message, data) {
38715
+ const lowerMessage = message.toLowerCase();
38716
+ if (lowerMessage.includes("insufficient") || lowerMessage.includes("balance") || lowerMessage.includes("not enough")) {
38717
+ return new errors_1.InsufficientFunds(message, this.exchangeName);
38718
+ }
38719
+ if (lowerMessage.includes("invalid order") || lowerMessage.includes("tick size") || lowerMessage.includes("price must be") || lowerMessage.includes("size must be") || lowerMessage.includes("amount must be")) {
38720
+ return new errors_1.InvalidOrder(message, this.exchangeName);
38721
+ }
38722
+ if (lowerMessage.includes("validation") || lowerMessage.includes("invalid parameter")) {
38723
+ return new errors_1.ValidationError(message, void 0, this.exchangeName);
38724
+ }
38725
+ return new errors_1.BadRequest(message, this.exchangeName);
38726
+ }
38727
+ /**
38728
+ * Maps 404 errors to specific not found subtypes
38729
+ */
38730
+ mapNotFoundError(message, data) {
38731
+ const lowerMessage = message.toLowerCase();
38732
+ if (lowerMessage.includes("order")) {
38733
+ const orderIdMatch = message.match(/order[:\s]+([a-zA-Z0-9-]+)/i);
38734
+ const orderId = orderIdMatch ? orderIdMatch[1] : "unknown";
38735
+ return new errors_1.OrderNotFound(orderId, this.exchangeName);
38736
+ }
38737
+ if (lowerMessage.includes("market")) {
38738
+ const marketIdMatch = message.match(/market[:\s]+([a-zA-Z0-9-]+)/i);
38739
+ const marketId = marketIdMatch ? marketIdMatch[1] : "unknown";
38740
+ return new errors_1.MarketNotFound(marketId, this.exchangeName);
38741
+ }
38742
+ return new errors_1.NotFound(message, this.exchangeName);
38743
+ }
38744
+ /**
38745
+ * Maps rate limit errors
38746
+ */
38747
+ mapRateLimitError(message, response) {
38748
+ const retryAfter = response?.headers?.["retry-after"];
38749
+ const retryAfterSeconds = retryAfter ? parseInt(retryAfter, 10) : void 0;
38750
+ return new errors_1.RateLimitExceeded(message, retryAfterSeconds, this.exchangeName);
38751
+ }
38752
+ /**
38753
+ * Extracts error message from various error formats
38754
+ */
38755
+ extractErrorMessage(error) {
38756
+ if (axios_1.default.isAxiosError(error) && error.response?.data) {
38757
+ const data = error.response.data;
38758
+ if (typeof data === "string") {
38759
+ return data;
38760
+ }
38761
+ if (data.error) {
38762
+ if (typeof data.error === "string") {
38763
+ return data.error;
38764
+ }
38765
+ if (data.error.message) {
38766
+ return data.error.message;
38767
+ }
38768
+ }
38769
+ if (data.message) {
38770
+ return data.message;
38771
+ }
38772
+ if (data.errorMsg) {
38773
+ return data.errorMsg;
38774
+ }
38775
+ return JSON.stringify(data);
38776
+ }
38777
+ if (error instanceof Error) {
38778
+ return error.message;
38779
+ }
38780
+ if (typeof error === "string") {
38781
+ return error;
38782
+ }
38783
+ return String(error);
38784
+ }
38785
+ };
38786
+ exports2.ErrorMapper = ErrorMapper;
38787
+ }
38788
+ });
38789
+
38790
+ // dist/exchanges/polymarket/errors.js
38791
+ var require_errors2 = __commonJS({
38792
+ "dist/exchanges/polymarket/errors.js"(exports2) {
38793
+ "use strict";
38794
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
38795
+ return mod && mod.__esModule ? mod : { "default": mod };
38796
+ };
38797
+ Object.defineProperty(exports2, "__esModule", { value: true });
38798
+ exports2.polymarketErrorMapper = exports2.PolymarketErrorMapper = void 0;
38799
+ var axios_1 = __importDefault(require_axios());
38800
+ var error_mapper_1 = require_error_mapper();
38801
+ var errors_1 = require_errors();
38802
+ var PolymarketErrorMapper = class extends error_mapper_1.ErrorMapper {
38803
+ constructor() {
38804
+ super("Polymarket");
38805
+ }
38806
+ /**
38807
+ * Override to handle Polymarket-specific error patterns
38808
+ */
38809
+ extractErrorMessage(error) {
38810
+ if (axios_1.default.isAxiosError(error) && error.response?.data) {
38811
+ const data = error.response.data;
38812
+ if (data.errorMsg) {
38813
+ return data.errorMsg;
38814
+ }
38815
+ if (data.error?.message) {
38816
+ return data.error.message;
38817
+ }
38818
+ if (data.message) {
38819
+ return data.message;
38820
+ }
38821
+ }
38822
+ return super.extractErrorMessage(error);
38823
+ }
38824
+ /**
38825
+ * Override to detect Polymarket-specific error patterns
38826
+ */
38827
+ mapBadRequestError(message, data) {
38828
+ const lowerMessage = message.toLowerCase();
38829
+ if (lowerMessage.includes("api key") || lowerMessage.includes("proxy") || lowerMessage.includes("signature type")) {
38830
+ return new errors_1.AuthenticationError(message, this.exchangeName);
38831
+ }
38832
+ if (lowerMessage.includes("tick size")) {
38833
+ return new errors_1.InvalidOrder(message, this.exchangeName);
38834
+ }
38835
+ return super.mapBadRequestError(message, data);
38836
+ }
38837
+ };
38838
+ exports2.PolymarketErrorMapper = PolymarketErrorMapper;
38839
+ exports2.polymarketErrorMapper = new PolymarketErrorMapper();
38840
+ }
38841
+ });
38842
+
38442
38843
  // dist/exchanges/polymarket/fetchMarkets.js
38443
38844
  var require_fetchMarkets = __commonJS({
38444
38845
  "dist/exchanges/polymarket/fetchMarkets.js"(exports2) {
@@ -38450,6 +38851,7 @@ var require_fetchMarkets = __commonJS({
38450
38851
  exports2.fetchMarkets = fetchMarkets;
38451
38852
  var axios_1 = __importDefault(require_axios());
38452
38853
  var utils_1 = require_utils4();
38854
+ var errors_1 = require_errors2();
38453
38855
  async function fetchMarkets(params) {
38454
38856
  const limit = params?.limit || 200;
38455
38857
  const offset = params?.offset || 0;
@@ -38494,8 +38896,7 @@ var require_fetchMarkets = __commonJS({
38494
38896
  }
38495
38897
  return unifiedMarkets.slice(0, limit);
38496
38898
  } catch (error) {
38497
- console.error("Error fetching Polymarket data:", error);
38498
- return [];
38899
+ throw errors_1.polymarketErrorMapper.mapError(error);
38499
38900
  }
38500
38901
  }
38501
38902
  }
@@ -38508,6 +38909,7 @@ var require_searchMarkets = __commonJS({
38508
38909
  Object.defineProperty(exports2, "__esModule", { value: true });
38509
38910
  exports2.searchMarkets = searchMarkets;
38510
38911
  var fetchMarkets_1 = require_fetchMarkets();
38912
+ var errors_1 = require_errors2();
38511
38913
  async function searchMarkets(query, params) {
38512
38914
  const searchLimit = 5e3;
38513
38915
  try {
@@ -38529,8 +38931,7 @@ var require_searchMarkets = __commonJS({
38529
38931
  const limit = params?.limit || 20;
38530
38932
  return filtered.slice(0, limit);
38531
38933
  } catch (error) {
38532
- console.error("Error searching Polymarket data:", error);
38533
- return [];
38934
+ throw errors_1.polymarketErrorMapper.mapError(error);
38534
38935
  }
38535
38936
  }
38536
38937
  }
@@ -38617,6 +39018,7 @@ var require_getMarketsBySlug = __commonJS({
38617
39018
  exports2.getMarketsBySlug = getMarketsBySlug;
38618
39019
  var axios_1 = __importDefault(require_axios());
38619
39020
  var utils_1 = require_utils4();
39021
+ var errors_1 = require_errors2();
38620
39022
  async function getMarketsBySlug(slug) {
38621
39023
  try {
38622
39024
  const response = await axios_1.default.get(utils_1.GAMMA_API_URL, {
@@ -38638,8 +39040,7 @@ var require_getMarketsBySlug = __commonJS({
38638
39040
  }
38639
39041
  return unifiedMarkets;
38640
39042
  } catch (error) {
38641
- console.error(`Error fetching Polymarket slug ${slug}:`, error);
38642
- return [];
39043
+ throw errors_1.polymarketErrorMapper.mapError(error);
38643
39044
  }
38644
39045
  }
38645
39046
  }
@@ -38652,14 +39053,15 @@ var require_validation = __commonJS({
38652
39053
  Object.defineProperty(exports2, "__esModule", { value: true });
38653
39054
  exports2.validateOutcomeId = validateOutcomeId;
38654
39055
  exports2.validateIdFormat = validateIdFormat;
39056
+ var errors_1 = require_errors();
38655
39057
  function validateOutcomeId(id, context) {
38656
39058
  if (id.length < 10 && /^\d+$/.test(id)) {
38657
- throw new Error(`Invalid ID for ${context}: "${id}". This appears to be a market ID (deprecated: market.id, use: market.marketId). Please use outcome ID (preferred: outcome.outcomeId, deprecated: outcome.id).`);
39059
+ throw new errors_1.ValidationError(`Invalid ID for ${context}: "${id}". This appears to be a market ID (deprecated: market.id, use: market.marketId). Please use outcome ID (preferred: outcome.outcomeId, deprecated: outcome.id).`, "id");
38658
39060
  }
38659
39061
  }
38660
39062
  function validateIdFormat(id, context) {
38661
39063
  if (!id || id.trim().length === 0) {
38662
- throw new Error(`Invalid ID for ${context}: ID cannot be empty`);
39064
+ throw new errors_1.ValidationError(`Invalid ID for ${context}: ID cannot be empty`, "id");
38663
39065
  }
38664
39066
  }
38665
39067
  }
@@ -38677,6 +39079,7 @@ var require_fetchOHLCV = __commonJS({
38677
39079
  var axios_1 = __importDefault(require_axios());
38678
39080
  var utils_1 = require_utils4();
38679
39081
  var validation_1 = require_validation();
39082
+ var errors_1 = require_errors2();
38680
39083
  async function fetchOHLCV(id, params) {
38681
39084
  (0, validation_1.validateIdFormat)(id, "OHLCV");
38682
39085
  (0, validation_1.validateOutcomeId)(id, "OHLCV");
@@ -38741,12 +39144,7 @@ var require_fetchOHLCV = __commonJS({
38741
39144
  }
38742
39145
  return candles;
38743
39146
  } catch (error) {
38744
- if (axios_1.default.isAxiosError(error) && error.response) {
38745
- const apiError = error.response.data?.error || error.response.data?.message || "Unknown API Error";
38746
- throw new Error(`Polymarket History API Error (${error.response.status}): ${apiError}. Used ID: ${id}`);
38747
- }
38748
- console.error(`Unexpected error fetching Polymarket history for ${id}:`, error);
38749
- throw error;
39147
+ throw errors_1.polymarketErrorMapper.mapError(error);
38750
39148
  }
38751
39149
  }
38752
39150
  }
@@ -38764,6 +39162,7 @@ var require_fetchOrderBook = __commonJS({
38764
39162
  var axios_1 = __importDefault(require_axios());
38765
39163
  var utils_1 = require_utils4();
38766
39164
  var validation_1 = require_validation();
39165
+ var errors_1 = require_errors2();
38767
39166
  async function fetchOrderBook(id) {
38768
39167
  (0, validation_1.validateIdFormat)(id, "OrderBook");
38769
39168
  (0, validation_1.validateOutcomeId)(id, "OrderBook");
@@ -38786,8 +39185,7 @@ var require_fetchOrderBook = __commonJS({
38786
39185
  timestamp: data.timestamp ? new Date(data.timestamp).getTime() : Date.now()
38787
39186
  };
38788
39187
  } catch (error) {
38789
- console.error(`Error fetching Polymarket orderbook for ${id}:`, error);
38790
- return { bids: [], asks: [] };
39188
+ throw errors_1.polymarketErrorMapper.mapError(error);
38791
39189
  }
38792
39190
  }
38793
39191
  }
@@ -38805,6 +39203,7 @@ var require_fetchTrades = __commonJS({
38805
39203
  var axios_1 = __importDefault(require_axios());
38806
39204
  var utils_1 = require_utils4();
38807
39205
  var validation_1 = require_validation();
39206
+ var errors_1 = require_errors2();
38808
39207
  async function fetchTrades(id, params) {
38809
39208
  (0, validation_1.validateIdFormat)(id, "Trades");
38810
39209
  (0, validation_1.validateOutcomeId)(id, "Trades");
@@ -38836,13 +39235,7 @@ var require_fetchTrades = __commonJS({
38836
39235
  }
38837
39236
  return mappedTrades;
38838
39237
  } catch (error) {
38839
- if (axios_1.default.isAxiosError(error)) {
38840
- const apiError = error.response?.data?.error || error.response?.data?.message || error.message;
38841
- console.error(`[Polymarket] fetchTrades failed for ID ${id}: ${apiError}`);
38842
- throw new Error(`Polymarket Trades API Error: ${apiError}`);
38843
- }
38844
- console.error(`Unexpected error fetching Polymarket trades for ${id}:`, error);
38845
- throw error;
39238
+ throw errors_1.polymarketErrorMapper.mapError(error);
38846
39239
  }
38847
39240
  }
38848
39241
  }
@@ -83439,6 +83832,7 @@ var require_auth = __commonJS({
83439
83832
  var clob_client_1 = (init_dist2(), __toCommonJS(dist_exports));
83440
83833
  var ethers_1 = require_lib36();
83441
83834
  var axios_1 = __importDefault(require_axios());
83835
+ var errors_1 = require_errors2();
83442
83836
  var POLYMARKET_HOST = "https://clob.polymarket.com";
83443
83837
  var POLYGON_CHAIN_ID = 137;
83444
83838
  var PolymarketAuth = class {
@@ -83479,9 +83873,7 @@ var require_auth = __commonJS({
83479
83873
  creds = await l1Client.createApiKey();
83480
83874
  console.log("[PolymarketAuth] createApiKey returned:", JSON.stringify(creds, null, 2));
83481
83875
  } catch (createError) {
83482
- const apiError = createError?.response?.data?.error || createError?.message || createError;
83483
- console.error("[PolymarketAuth] Failed to both derive and create API key. Create error:", apiError);
83484
- throw new Error(`Authentication failed: Could not create or derive API key. Latest error: ${apiError}`);
83876
+ throw errors_1.polymarketErrorMapper.mapError(createError);
83485
83877
  }
83486
83878
  }
83487
83879
  if (!creds || !creds.key || !creds.secret || !creds.passphrase) {
@@ -88934,7 +89326,7 @@ var require_align = __commonJS({
88934
89326
  });
88935
89327
 
88936
89328
  // ../node_modules/logform/errors.js
88937
- var require_errors = __commonJS({
89329
+ var require_errors3 = __commonJS({
88938
89330
  "../node_modules/logform/errors.js"(exports2, module2) {
88939
89331
  "use strict";
88940
89332
  var format = require_format();
@@ -90446,7 +90838,7 @@ var require_logform = __commonJS({
90446
90838
  return require_align();
90447
90839
  });
90448
90840
  exposeFormat("errors", function() {
90449
- return require_errors();
90841
+ return require_errors3();
90450
90842
  });
90451
90843
  exposeFormat("cli", function() {
90452
90844
  return require_cli2();
@@ -90717,7 +91109,7 @@ var require_destroy = __commonJS({
90717
91109
  });
90718
91110
 
90719
91111
  // ../node_modules/readable-stream/errors.js
90720
- var require_errors2 = __commonJS({
91112
+ var require_errors4 = __commonJS({
90721
91113
  "../node_modules/readable-stream/errors.js"(exports2, module2) {
90722
91114
  "use strict";
90723
91115
  var codes = {};
@@ -90820,7 +91212,7 @@ var require_errors2 = __commonJS({
90820
91212
  var require_state2 = __commonJS({
90821
91213
  "../node_modules/readable-stream/lib/internal/streams/state.js"(exports2, module2) {
90822
91214
  "use strict";
90823
- var ERR_INVALID_OPT_VALUE = require_errors2().codes.ERR_INVALID_OPT_VALUE;
91215
+ var ERR_INVALID_OPT_VALUE = require_errors4().codes.ERR_INVALID_OPT_VALUE;
90824
91216
  function highWaterMarkFrom(options, isDuplex, duplexKey) {
90825
91217
  return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
90826
91218
  }
@@ -91383,7 +91775,7 @@ var require_string_decoder = __commonJS({
91383
91775
  var require_end_of_stream = __commonJS({
91384
91776
  "../node_modules/readable-stream/lib/internal/streams/end-of-stream.js"(exports2, module2) {
91385
91777
  "use strict";
91386
- var ERR_STREAM_PREMATURE_CLOSE = require_errors2().codes.ERR_STREAM_PREMATURE_CLOSE;
91778
+ var ERR_STREAM_PREMATURE_CLOSE = require_errors4().codes.ERR_STREAM_PREMATURE_CLOSE;
91387
91779
  function once(callback) {
91388
91780
  var called = false;
91389
91781
  return function() {
@@ -91728,7 +92120,7 @@ var require_from = __commonJS({
91728
92120
  }
91729
92121
  return (hint === "string" ? String : Number)(input);
91730
92122
  }
91731
- var ERR_INVALID_ARG_TYPE = require_errors2().codes.ERR_INVALID_ARG_TYPE;
92123
+ var ERR_INVALID_ARG_TYPE = require_errors4().codes.ERR_INVALID_ARG_TYPE;
91732
92124
  function from(Readable2, iterable, opts) {
91733
92125
  var iterator2;
91734
92126
  if (iterable && typeof iterable.next === "function") {
@@ -91805,7 +92197,7 @@ var require_stream_readable = __commonJS({
91805
92197
  var destroyImpl = require_destroy();
91806
92198
  var _require = require_state2();
91807
92199
  var getHighWaterMark = _require.getHighWaterMark;
91808
- var _require$codes = require_errors2().codes;
92200
+ var _require$codes = require_errors4().codes;
91809
92201
  var ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE;
91810
92202
  var ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF;
91811
92203
  var ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED;
@@ -92629,7 +93021,7 @@ var require_stream_writable = __commonJS({
92629
93021
  var destroyImpl = require_destroy();
92630
93022
  var _require = require_state2();
92631
93023
  var getHighWaterMark = _require.getHighWaterMark;
92632
- var _require$codes = require_errors2().codes;
93024
+ var _require$codes = require_errors4().codes;
92633
93025
  var ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE;
92634
93026
  var ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED;
92635
93027
  var ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK;
@@ -93902,7 +94294,7 @@ var require_stream_transform = __commonJS({
93902
94294
  "../node_modules/readable-stream/lib/_stream_transform.js"(exports2, module2) {
93903
94295
  "use strict";
93904
94296
  module2.exports = Transform;
93905
- var _require$codes = require_errors2().codes;
94297
+ var _require$codes = require_errors4().codes;
93906
94298
  var ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED;
93907
94299
  var ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK;
93908
94300
  var ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING;
@@ -94028,7 +94420,7 @@ var require_pipeline = __commonJS({
94028
94420
  callback.apply(void 0, arguments);
94029
94421
  };
94030
94422
  }
94031
- var _require$codes = require_errors2().codes;
94423
+ var _require$codes = require_errors4().codes;
94032
94424
  var ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS;
94033
94425
  var ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
94034
94426
  function noop2(err) {
@@ -105131,6 +105523,8 @@ var require_polymarket = __commonJS({
105131
105523
  var auth_1 = require_auth();
105132
105524
  var clob_client_1 = (init_dist2(), __toCommonJS(dist_exports));
105133
105525
  var websocket_1 = require_websocket3();
105526
+ var errors_1 = require_errors2();
105527
+ var errors_2 = require_errors();
105134
105528
  var PolymarketExchange = class extends BaseExchange_1.PredictionMarketExchange {
105135
105529
  constructor(options) {
105136
105530
  let credentials;
@@ -105150,18 +105544,21 @@ var require_polymarket = __commonJS({
105150
105544
  get name() {
105151
105545
  return "Polymarket";
105152
105546
  }
105153
- async fetchMarkets(params) {
105547
+ // ----------------------------------------------------------------------------
105548
+ // Implementation methods for CCXT-style API
105549
+ // ----------------------------------------------------------------------------
105550
+ async fetchMarketsImpl(params) {
105154
105551
  return (0, fetchMarkets_1.fetchMarkets)(params);
105155
105552
  }
105156
- async searchMarkets(query, params) {
105553
+ async searchMarketsImpl(query, params) {
105157
105554
  return (0, searchMarkets_1.searchMarkets)(query, params);
105158
105555
  }
105159
- async searchEvents(query, params) {
105160
- return (0, searchEvents_1.searchEvents)(query, params);
105161
- }
105162
- async getMarketsBySlug(slug) {
105556
+ async fetchMarketsBySlugImpl(slug) {
105163
105557
  return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
105164
105558
  }
105559
+ async searchEventsImpl(query, params) {
105560
+ return (0, searchEvents_1.searchEvents)(query, params);
105561
+ }
105165
105562
  async fetchOHLCV(id, params) {
105166
105563
  return (0, fetchOHLCV_1.fetchOHLCV)(id, params);
105167
105564
  }
@@ -105179,30 +105576,30 @@ var require_polymarket = __commonJS({
105179
105576
  */
105180
105577
  ensureAuth() {
105181
105578
  if (!this.auth) {
105182
- throw new Error('Trading operations require authentication. Initialize PolymarketExchange with credentials: new PolymarketExchange({ privateKey: "0x..." })');
105579
+ throw new errors_2.AuthenticationError('Trading operations require authentication. Initialize PolymarketExchange with credentials: new PolymarketExchange({ privateKey: "0x..." })', "Polymarket");
105183
105580
  }
105184
105581
  return this.auth;
105185
105582
  }
105186
105583
  async createOrder(params) {
105187
- const auth = this.ensureAuth();
105188
- const client = await auth.getClobClient();
105189
- const side = params.side.toUpperCase() === "BUY" ? clob_client_1.Side.BUY : clob_client_1.Side.SELL;
105190
- if (params.type === "limit" && !params.price) {
105191
- throw new Error("Price is required for limit orders");
105192
- }
105193
- const price = params.price || (side === clob_client_1.Side.BUY ? 0.99 : 0.01);
105194
- let tickSize;
105195
- if (params.tickSize) {
105196
- tickSize = params.tickSize.toString();
105197
- } else {
105198
- try {
105199
- const orderBook = await this.fetchOrderBook(params.outcomeId);
105200
- tickSize = this.inferTickSize(orderBook);
105201
- } catch (error) {
105202
- tickSize = "0.01";
105203
- }
105204
- }
105205
105584
  try {
105585
+ const auth = this.ensureAuth();
105586
+ const client = await auth.getClobClient();
105587
+ const side = params.side.toUpperCase() === "BUY" ? clob_client_1.Side.BUY : clob_client_1.Side.SELL;
105588
+ if (params.type === "limit" && !params.price) {
105589
+ throw new Error("Price is required for limit orders");
105590
+ }
105591
+ const price = params.price || (side === clob_client_1.Side.BUY ? 0.99 : 0.01);
105592
+ let tickSize;
105593
+ if (params.tickSize) {
105594
+ tickSize = params.tickSize.toString();
105595
+ } else {
105596
+ try {
105597
+ const orderBook = await this.fetchOrderBook(params.outcomeId);
105598
+ tickSize = this.inferTickSize(orderBook);
105599
+ } catch (error) {
105600
+ tickSize = "0.01";
105601
+ }
105602
+ }
105206
105603
  const orderArgs = {
105207
105604
  tokenID: params.outcomeId,
105208
105605
  price,
@@ -105233,7 +105630,7 @@ var require_polymarket = __commonJS({
105233
105630
  timestamp: Date.now()
105234
105631
  };
105235
105632
  } catch (error) {
105236
- throw error;
105633
+ throw errors_1.polymarketErrorMapper.mapError(error);
105237
105634
  }
105238
105635
  }
105239
105636
  /**
@@ -105269,9 +105666,9 @@ var require_polymarket = __commonJS({
105269
105666
  return "0.0001";
105270
105667
  }
105271
105668
  async cancelOrder(orderId) {
105272
- const auth = this.ensureAuth();
105273
- const client = await auth.getClobClient();
105274
105669
  try {
105670
+ const auth = this.ensureAuth();
105671
+ const client = await auth.getClobClient();
105275
105672
  await client.cancelOrder({ orderID: orderId });
105276
105673
  return {
105277
105674
  id: orderId,
@@ -105286,13 +105683,13 @@ var require_polymarket = __commonJS({
105286
105683
  timestamp: Date.now()
105287
105684
  };
105288
105685
  } catch (error) {
105289
- throw error;
105686
+ throw errors_1.polymarketErrorMapper.mapError(error);
105290
105687
  }
105291
105688
  }
105292
105689
  async fetchOrder(orderId) {
105293
- const auth = this.ensureAuth();
105294
- const client = await auth.getClobClient();
105295
105690
  try {
105691
+ const auth = this.ensureAuth();
105692
+ const client = await auth.getClobClient();
105296
105693
  const order = await client.getOrder(orderId);
105297
105694
  if (!order || !order.id) {
105298
105695
  const errorMsg = order?.error || "Order not found (Invalid ID)";
@@ -105312,13 +105709,13 @@ var require_polymarket = __commonJS({
105312
105709
  timestamp: order.created_at * 1e3
105313
105710
  };
105314
105711
  } catch (error) {
105315
- throw error;
105712
+ throw errors_1.polymarketErrorMapper.mapError(error);
105316
105713
  }
105317
105714
  }
105318
105715
  async fetchOpenOrders(marketId) {
105319
- const auth = this.ensureAuth();
105320
- const client = await auth.getClobClient();
105321
105716
  try {
105717
+ const auth = this.ensureAuth();
105718
+ const client = await auth.getClobClient();
105322
105719
  const orders = await client.getOpenOrders({
105323
105720
  market: marketId
105324
105721
  });
@@ -105336,19 +105733,22 @@ var require_polymarket = __commonJS({
105336
105733
  timestamp: o.created_at * 1e3
105337
105734
  }));
105338
105735
  } catch (error) {
105339
- console.error("Error fetching Polymarket open orders:", error);
105340
- return [];
105736
+ throw errors_1.polymarketErrorMapper.mapError(error);
105341
105737
  }
105342
105738
  }
105343
105739
  async fetchPositions() {
105344
- const auth = this.ensureAuth();
105345
- const address = await auth.getEffectiveFunderAddress();
105346
- return (0, fetchPositions_1.fetchPositions)(address);
105740
+ try {
105741
+ const auth = this.ensureAuth();
105742
+ const address = await auth.getEffectiveFunderAddress();
105743
+ return (0, fetchPositions_1.fetchPositions)(address);
105744
+ } catch (error) {
105745
+ throw errors_1.polymarketErrorMapper.mapError(error);
105746
+ }
105347
105747
  }
105348
105748
  async fetchBalance() {
105349
- const auth = this.ensureAuth();
105350
- const client = await auth.getClobClient();
105351
105749
  try {
105750
+ const auth = this.ensureAuth();
105751
+ const client = await auth.getClobClient();
105352
105752
  const USDC_DECIMALS = 6;
105353
105753
  let total = 0;
105354
105754
  try {
@@ -105395,7 +105795,7 @@ var require_polymarket = __commonJS({
105395
105795
  locked
105396
105796
  }];
105397
105797
  } catch (error) {
105398
- throw error;
105798
+ throw errors_1.polymarketErrorMapper.mapError(error);
105399
105799
  }
105400
105800
  }
105401
105801
  async watchOrderBook(id, limit) {
@@ -105489,6 +105889,59 @@ var require_utils10 = __commonJS({
105489
105889
  }
105490
105890
  });
105491
105891
 
105892
+ // dist/exchanges/limitless/errors.js
105893
+ var require_errors5 = __commonJS({
105894
+ "dist/exchanges/limitless/errors.js"(exports2) {
105895
+ "use strict";
105896
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
105897
+ return mod && mod.__esModule ? mod : { "default": mod };
105898
+ };
105899
+ Object.defineProperty(exports2, "__esModule", { value: true });
105900
+ exports2.limitlessErrorMapper = exports2.LimitlessErrorMapper = void 0;
105901
+ var axios_1 = __importDefault(require_axios());
105902
+ var error_mapper_1 = require_error_mapper();
105903
+ var errors_1 = require_errors();
105904
+ var LimitlessErrorMapper = class extends error_mapper_1.ErrorMapper {
105905
+ constructor() {
105906
+ super("Limitless");
105907
+ }
105908
+ /**
105909
+ * Override to handle Limitless-specific error patterns
105910
+ */
105911
+ extractErrorMessage(error) {
105912
+ if (axios_1.default.isAxiosError(error) && error.response?.data) {
105913
+ const data = error.response.data;
105914
+ if (data.errorMsg) {
105915
+ return data.errorMsg;
105916
+ }
105917
+ if (data.error?.message) {
105918
+ return data.error.message;
105919
+ }
105920
+ if (data.message) {
105921
+ return data.message;
105922
+ }
105923
+ }
105924
+ return super.extractErrorMessage(error);
105925
+ }
105926
+ /**
105927
+ * Override to detect Limitless-specific error patterns
105928
+ */
105929
+ mapBadRequestError(message, data) {
105930
+ const lowerMessage = message.toLowerCase();
105931
+ if (lowerMessage.includes("api key") || lowerMessage.includes("proxy") || lowerMessage.includes("signature type")) {
105932
+ return new errors_1.AuthenticationError(message, this.exchangeName);
105933
+ }
105934
+ if (lowerMessage.includes("tick size")) {
105935
+ return new errors_1.InvalidOrder(message, this.exchangeName);
105936
+ }
105937
+ return super.mapBadRequestError(message, data);
105938
+ }
105939
+ };
105940
+ exports2.LimitlessErrorMapper = LimitlessErrorMapper;
105941
+ exports2.limitlessErrorMapper = new LimitlessErrorMapper();
105942
+ }
105943
+ });
105944
+
105492
105945
  // dist/exchanges/limitless/fetchMarkets.js
105493
105946
  var require_fetchMarkets2 = __commonJS({
105494
105947
  "dist/exchanges/limitless/fetchMarkets.js"(exports2) {
@@ -105500,6 +105953,7 @@ var require_fetchMarkets2 = __commonJS({
105500
105953
  exports2.fetchMarkets = fetchMarkets;
105501
105954
  var axios_1 = __importDefault(require_axios());
105502
105955
  var utils_1 = require_utils10();
105956
+ var errors_1 = require_errors5();
105503
105957
  async function fetchMarkets(params) {
105504
105958
  const limit = params?.limit || 200;
105505
105959
  const offset = params?.offset || 0;
@@ -105524,8 +105978,7 @@ var require_fetchMarkets2 = __commonJS({
105524
105978
  }
105525
105979
  return unifiedMarkets.slice(offset, offset + limit);
105526
105980
  } catch (error) {
105527
- console.error("Error fetching Limitless markets:", error.message);
105528
- return [];
105981
+ throw errors_1.limitlessErrorMapper.mapError(error);
105529
105982
  }
105530
105983
  }
105531
105984
  }
@@ -105542,6 +105995,7 @@ var require_searchMarkets2 = __commonJS({
105542
105995
  exports2.searchMarkets = searchMarkets;
105543
105996
  var axios_1 = __importDefault(require_axios());
105544
105997
  var utils_1 = require_utils10();
105998
+ var errors_1 = require_errors5();
105545
105999
  async function searchMarkets(query, params) {
105546
106000
  try {
105547
106001
  const response = await axios_1.default.get(`${utils_1.LIMITLESS_API_URL}/markets/search`, {
@@ -105567,8 +106021,7 @@ var require_searchMarkets2 = __commonJS({
105567
106021
  }
105568
106022
  return allMarkets.filter((m) => m !== null && m.outcomes.length > 0).slice(0, params?.limit || 20);
105569
106023
  } catch (error) {
105570
- console.error("Error searching Limitless data:", error.message);
105571
- return [];
106024
+ throw errors_1.limitlessErrorMapper.mapError(error);
105572
106025
  }
105573
106026
  }
105574
106027
  }
@@ -105666,6 +106119,7 @@ var require_fetchOHLCV2 = __commonJS({
105666
106119
  var axios_1 = __importDefault(require_axios());
105667
106120
  var utils_1 = require_utils10();
105668
106121
  var validation_1 = require_validation();
106122
+ var errors_1 = require_errors5();
105669
106123
  async function fetchOHLCV(id, params) {
105670
106124
  (0, validation_1.validateIdFormat)(id, "OHLCV");
105671
106125
  try {
@@ -105700,8 +106154,7 @@ var require_fetchOHLCV2 = __commonJS({
105700
106154
  }
105701
106155
  return candles;
105702
106156
  } catch (error) {
105703
- console.error(`Error fetching Limitless history for ${id}:`, error.message);
105704
- return [];
106157
+ throw errors_1.limitlessErrorMapper.mapError(error);
105705
106158
  }
105706
106159
  }
105707
106160
  }
@@ -105753,8 +106206,13 @@ var require_fetchTrades2 = __commonJS({
105753
106206
  "use strict";
105754
106207
  Object.defineProperty(exports2, "__esModule", { value: true });
105755
106208
  exports2.fetchTrades = fetchTrades;
106209
+ var errors_1 = require_errors5();
105756
106210
  async function fetchTrades(id, params) {
105757
- throw new Error("Limitless fetchTrades not implemented: No public market trades API available.");
106211
+ try {
106212
+ throw new Error("Limitless fetchTrades not implemented: No public market trades API available.");
106213
+ } catch (error) {
106214
+ throw errors_1.limitlessErrorMapper.mapError(error);
106215
+ }
105758
106216
  }
105759
106217
  }
105760
106218
  });
@@ -105804,6 +106262,7 @@ var require_auth2 = __commonJS({
105804
106262
  exports2.LimitlessAuth = void 0;
105805
106263
  var clob_client_1 = (init_dist2(), __toCommonJS(dist_exports));
105806
106264
  var ethers_1 = require_lib36();
106265
+ var errors_1 = require_errors5();
105807
106266
  var LIMITLESS_HOST = "https://api.limitless.exchange";
105808
106267
  var BASE_CHAIN_ID = 8453;
105809
106268
  var LimitlessAuth = class {
@@ -105838,8 +106297,7 @@ var require_auth2 = __commonJS({
105838
106297
  try {
105839
106298
  creds = await l1Client.createApiKey();
105840
106299
  } catch (createError) {
105841
- console.error("Failed to both derive and create API key:", createError?.message || createError);
105842
- throw new Error("Authentication failed: Could not create or derive API key.");
106300
+ throw errors_1.limitlessErrorMapper.mapError(createError);
105843
106301
  }
105844
106302
  }
105845
106303
  if (!creds) {
@@ -106113,6 +106571,8 @@ var require_limitless = __commonJS({
106113
106571
  var auth_1 = require_auth2();
106114
106572
  var client_1 = require_client();
106115
106573
  var websocket_1 = require_websocket4();
106574
+ var errors_1 = require_errors5();
106575
+ var errors_2 = require_errors();
106116
106576
  var LimitlessExchange = class extends BaseExchange_1.PredictionMarketExchange {
106117
106577
  constructor(options) {
106118
106578
  let credentials;
@@ -106135,18 +106595,21 @@ var require_limitless = __commonJS({
106135
106595
  get name() {
106136
106596
  return "Limitless";
106137
106597
  }
106138
- async fetchMarkets(params) {
106598
+ // ----------------------------------------------------------------------------
106599
+ // Implementation methods for CCXT-style API
106600
+ // ----------------------------------------------------------------------------
106601
+ async fetchMarketsImpl(params) {
106139
106602
  return (0, fetchMarkets_1.fetchMarkets)(params);
106140
106603
  }
106141
- async searchMarkets(query, params) {
106604
+ async searchMarketsImpl(query, params) {
106142
106605
  return (0, searchMarkets_1.searchMarkets)(query, params);
106143
106606
  }
106144
- async searchEvents(query, params) {
106145
- return (0, searchEvents_1.searchEvents)(query, params);
106146
- }
106147
- async getMarketsBySlug(slug) {
106607
+ async fetchMarketsBySlugImpl(slug) {
106148
106608
  return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
106149
106609
  }
106610
+ async searchEventsImpl(query, params) {
106611
+ return (0, searchEvents_1.searchEvents)(query, params);
106612
+ }
106150
106613
  async fetchOHLCV(id, params) {
106151
106614
  return (0, fetchOHLCV_1.fetchOHLCV)(id, params);
106152
106615
  }
@@ -106170,7 +106633,7 @@ var require_limitless = __commonJS({
106170
106633
  */
106171
106634
  ensureAuth() {
106172
106635
  if (!this.auth) {
106173
- throw new Error('Trading operations require authentication. Initialize LimitlessExchange with credentials: new LimitlessExchange({ privateKey: "0x..." })');
106636
+ throw new errors_2.AuthenticationError('Trading operations require authentication. Initialize LimitlessExchange with credentials: new LimitlessExchange({ privateKey: "0x..." })', "Limitless");
106174
106637
  }
106175
106638
  return this.auth;
106176
106639
  }
@@ -106205,8 +106668,7 @@ var require_limitless = __commonJS({
106205
106668
  timestamp: Date.now()
106206
106669
  };
106207
106670
  } catch (error) {
106208
- console.error("Limitless createOrder failed:", error.response?.data || error.message);
106209
- throw error;
106671
+ throw errors_1.limitlessErrorMapper.mapError(error);
106210
106672
  }
106211
106673
  }
106212
106674
  async cancelOrder(orderId) {
@@ -106226,8 +106688,7 @@ var require_limitless = __commonJS({
106226
106688
  timestamp: Date.now()
106227
106689
  };
106228
106690
  } catch (error) {
106229
- console.error("Limitless cancelOrder failed:", error.response?.data || error.message);
106230
- throw error;
106691
+ throw errors_1.limitlessErrorMapper.mapError(error);
106231
106692
  }
106232
106693
  }
106233
106694
  async fetchOrder(orderId) {
@@ -106258,8 +106719,7 @@ var require_limitless = __commonJS({
106258
106719
  // API doesn't always return TS in summary
106259
106720
  }));
106260
106721
  } catch (error) {
106261
- console.error("Error fetching Limitless open orders:", error.message);
106262
- return [];
106722
+ throw errors_1.limitlessErrorMapper.mapError(error);
106263
106723
  }
106264
106724
  }
106265
106725
  async fetchPositions() {
@@ -106285,8 +106745,7 @@ var require_limitless = __commonJS({
106285
106745
  locked: 0
106286
106746
  }];
106287
106747
  } catch (error) {
106288
- console.warn("fetchBalance failed via CLOB client", error.message);
106289
- return [{ currency: "USDC", total: 0, available: 0, locked: 0 }];
106748
+ throw errors_1.limitlessErrorMapper.mapError(error);
106290
106749
  }
106291
106750
  }
106292
106751
  async watchOrderBook(id, limit) {
@@ -106405,6 +106864,57 @@ var require_utils11 = __commonJS({
106405
106864
  }
106406
106865
  });
106407
106866
 
106867
+ // dist/exchanges/kalshi/errors.js
106868
+ var require_errors6 = __commonJS({
106869
+ "dist/exchanges/kalshi/errors.js"(exports2) {
106870
+ "use strict";
106871
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
106872
+ return mod && mod.__esModule ? mod : { "default": mod };
106873
+ };
106874
+ Object.defineProperty(exports2, "__esModule", { value: true });
106875
+ exports2.kalshiErrorMapper = exports2.KalshiErrorMapper = void 0;
106876
+ var axios_1 = __importDefault(require_axios());
106877
+ var error_mapper_1 = require_error_mapper();
106878
+ var errors_1 = require_errors();
106879
+ var KalshiErrorMapper = class extends error_mapper_1.ErrorMapper {
106880
+ constructor() {
106881
+ super("Kalshi");
106882
+ }
106883
+ /**
106884
+ * Override to handle Kalshi-specific error patterns
106885
+ */
106886
+ extractErrorMessage(error) {
106887
+ if (axios_1.default.isAxiosError(error) && error.response?.data) {
106888
+ const data = error.response.data;
106889
+ if (data.error?.message) {
106890
+ const status = error.response.status;
106891
+ return `[${status}] ${data.error.message}`;
106892
+ }
106893
+ if (data.message) {
106894
+ return data.message;
106895
+ }
106896
+ if (data.error && typeof data.error === "string") {
106897
+ return data.error;
106898
+ }
106899
+ }
106900
+ return super.extractErrorMessage(error);
106901
+ }
106902
+ /**
106903
+ * Override to detect Kalshi-specific error patterns
106904
+ */
106905
+ mapBadRequestError(message, data) {
106906
+ const lowerMessage = message.toLowerCase();
106907
+ if (lowerMessage.includes("balance")) {
106908
+ return new errors_1.InsufficientFunds(message, this.exchangeName);
106909
+ }
106910
+ return super.mapBadRequestError(message, data);
106911
+ }
106912
+ };
106913
+ exports2.KalshiErrorMapper = KalshiErrorMapper;
106914
+ exports2.kalshiErrorMapper = new KalshiErrorMapper();
106915
+ }
106916
+ });
106917
+
106408
106918
  // dist/exchanges/kalshi/fetchMarkets.js
106409
106919
  var require_fetchMarkets3 = __commonJS({
106410
106920
  "dist/exchanges/kalshi/fetchMarkets.js"(exports2) {
@@ -106417,6 +106927,7 @@ var require_fetchMarkets3 = __commonJS({
106417
106927
  exports2.fetchMarkets = fetchMarkets;
106418
106928
  var axios_1 = __importDefault(require_axios());
106419
106929
  var utils_1 = require_utils11();
106930
+ var errors_1 = require_errors6();
106420
106931
  async function fetchActiveEvents(targetMarketCount) {
106421
106932
  let allEvents = [];
106422
106933
  let totalMarketCount = 0;
@@ -106453,8 +106964,7 @@ var require_fetchMarkets3 = __commonJS({
106453
106964
  break;
106454
106965
  }
106455
106966
  } catch (e) {
106456
- console.error(`Error fetching Kalshi page ${page}:`, e);
106457
- break;
106967
+ throw errors_1.kalshiErrorMapper.mapError(e);
106458
106968
  }
106459
106969
  } while (cursor && page < MAX_PAGES);
106460
106970
  return allEvents;
@@ -106471,8 +106981,7 @@ var require_fetchMarkets3 = __commonJS({
106471
106981
  }
106472
106982
  return map;
106473
106983
  } catch (e) {
106474
- console.error("Error fetching Kalshi series:", e);
106475
- return /* @__PURE__ */ new Map();
106984
+ throw errors_1.kalshiErrorMapper.mapError(e);
106476
106985
  }
106477
106986
  }
106478
106987
  var cachedEvents = null;
@@ -106533,8 +107042,7 @@ var require_fetchMarkets3 = __commonJS({
106533
107042
  }
106534
107043
  return allMarkets.slice(offset, offset + limit);
106535
107044
  } catch (error) {
106536
- console.error("Error fetching Kalshi data:", error);
106537
- return [];
107045
+ throw errors_1.kalshiErrorMapper.mapError(error);
106538
107046
  }
106539
107047
  }
106540
107048
  }
@@ -106547,6 +107055,7 @@ var require_searchMarkets3 = __commonJS({
106547
107055
  Object.defineProperty(exports2, "__esModule", { value: true });
106548
107056
  exports2.searchMarkets = searchMarkets;
106549
107057
  var fetchMarkets_1 = require_fetchMarkets3();
107058
+ var errors_1 = require_errors6();
106550
107059
  async function searchMarkets(query, params) {
106551
107060
  const searchLimit = 5e3;
106552
107061
  try {
@@ -106565,8 +107074,7 @@ var require_searchMarkets3 = __commonJS({
106565
107074
  const limit = params?.limit || 20;
106566
107075
  return filtered.slice(0, limit);
106567
107076
  } catch (error) {
106568
- console.error("Error searching Kalshi data:", error);
106569
- return [];
107077
+ throw errors_1.kalshiErrorMapper.mapError(error);
106570
107078
  }
106571
107079
  }
106572
107080
  }
@@ -106583,6 +107091,7 @@ var require_searchEvents3 = __commonJS({
106583
107091
  exports2.searchEvents = searchEvents;
106584
107092
  var axios_1 = __importDefault(require_axios());
106585
107093
  var utils_1 = require_utils11();
107094
+ var errors_1 = require_errors6();
106586
107095
  async function searchEvents(query, params) {
106587
107096
  try {
106588
107097
  const queryParams = {
@@ -106627,8 +107136,7 @@ var require_searchEvents3 = __commonJS({
106627
107136
  const limit = params?.limit || 20;
106628
107137
  return unifiedEvents.slice(0, limit);
106629
107138
  } catch (error) {
106630
- console.error("Error searching Kalshi events:", error);
106631
- return [];
107139
+ throw errors_1.kalshiErrorMapper.mapError(error);
106632
107140
  }
106633
107141
  }
106634
107142
  }
@@ -106704,6 +107212,7 @@ var require_fetchOHLCV3 = __commonJS({
106704
107212
  var axios_1 = __importDefault(require_axios());
106705
107213
  var utils_1 = require_utils11();
106706
107214
  var validation_1 = require_validation();
107215
+ var errors_1 = require_errors6();
106707
107216
  async function fetchOHLCV(id, params) {
106708
107217
  (0, validation_1.validateIdFormat)(id, "OHLCV");
106709
107218
  try {
@@ -106770,12 +107279,7 @@ var require_fetchOHLCV3 = __commonJS({
106770
107279
  }
106771
107280
  return mappedCandles;
106772
107281
  } catch (error) {
106773
- if (axios_1.default.isAxiosError(error) && error.response) {
106774
- const apiError = error.response.data?.error || error.response.data?.message || "Unknown API Error";
106775
- throw new Error(`Kalshi History API Error (${error.response.status}): ${apiError}. Used Ticker: ${id}`);
106776
- }
106777
- console.error(`Unexpected error fetching Kalshi history for ${id}:`, error);
106778
- throw error;
107282
+ throw errors_1.kalshiErrorMapper.mapError(error);
106779
107283
  }
106780
107284
  }
106781
107285
  }
@@ -106792,6 +107296,7 @@ var require_fetchOrderBook3 = __commonJS({
106792
107296
  exports2.fetchOrderBook = fetchOrderBook;
106793
107297
  var axios_1 = __importDefault(require_axios());
106794
107298
  var validation_1 = require_validation();
107299
+ var errors_1 = require_errors6();
106795
107300
  async function fetchOrderBook(id) {
106796
107301
  (0, validation_1.validateIdFormat)(id, "OrderBook");
106797
107302
  try {
@@ -106827,8 +107332,7 @@ var require_fetchOrderBook3 = __commonJS({
106827
107332
  asks.sort((a, b) => a.price - b.price);
106828
107333
  return { bids, asks, timestamp: Date.now() };
106829
107334
  } catch (error) {
106830
- console.error(`Error fetching Kalshi orderbook for ${id}:`, error);
106831
- return { bids: [], asks: [] };
107335
+ throw errors_1.kalshiErrorMapper.mapError(error);
106832
107336
  }
106833
107337
  }
106834
107338
  }
@@ -106844,6 +107348,7 @@ var require_fetchTrades3 = __commonJS({
106844
107348
  Object.defineProperty(exports2, "__esModule", { value: true });
106845
107349
  exports2.fetchTrades = fetchTrades;
106846
107350
  var axios_1 = __importDefault(require_axios());
107351
+ var errors_1 = require_errors6();
106847
107352
  async function fetchTrades(id, params) {
106848
107353
  try {
106849
107354
  const ticker = id.replace(/-NO$/, "");
@@ -106863,8 +107368,7 @@ var require_fetchTrades3 = __commonJS({
106863
107368
  side: t.taker_side === "yes" ? "buy" : "sell"
106864
107369
  }));
106865
107370
  } catch (error) {
106866
- console.error(`Error fetching Kalshi trades for ${id}:`, error);
106867
- return [];
107371
+ throw errors_1.kalshiErrorMapper.mapError(error);
106868
107372
  }
106869
107373
  }
106870
107374
  }
@@ -106914,6 +107418,7 @@ var require_auth3 = __commonJS({
106914
107418
  Object.defineProperty(exports2, "__esModule", { value: true });
106915
107419
  exports2.KalshiAuth = void 0;
106916
107420
  var crypto2 = __importStar(require("crypto"));
107421
+ var errors_1 = require_errors6();
106917
107422
  var KalshiAuth = class {
106918
107423
  constructor(credentials) {
106919
107424
  this.credentials = credentials;
@@ -106961,8 +107466,7 @@ var require_auth3 = __commonJS({
106961
107466
  }, "base64");
106962
107467
  return signature;
106963
107468
  } catch (error) {
106964
- console.error("Error signing Kalshi request:", error);
106965
- throw new Error(`Failed to sign Kalshi request: ${error.message}`);
107469
+ throw errors_1.kalshiErrorMapper.mapError(error);
106966
107470
  }
106967
107471
  }
106968
107472
  };
@@ -107315,6 +107819,8 @@ var require_kalshi = __commonJS({
107315
107819
  var fetchTrades_1 = require_fetchTrades3();
107316
107820
  var auth_1 = require_auth3();
107317
107821
  var websocket_1 = require_websocket5();
107822
+ var errors_1 = require_errors6();
107823
+ var errors_2 = require_errors();
107318
107824
  var KalshiExchange = class extends BaseExchange_1.PredictionMarketExchange {
107319
107825
  constructor(options) {
107320
107826
  let credentials;
@@ -107342,25 +107848,25 @@ var require_kalshi = __commonJS({
107342
107848
  // ----------------------------------------------------------------------------
107343
107849
  ensureAuth() {
107344
107850
  if (!this.auth) {
107345
- throw new Error("Trading operations require authentication. Initialize KalshiExchange with credentials (apiKey and privateKey).");
107851
+ throw new errors_2.AuthenticationError("Trading operations require authentication. Initialize KalshiExchange with credentials (apiKey and privateKey).", "Kalshi");
107346
107852
  }
107347
107853
  return this.auth;
107348
107854
  }
107349
107855
  // ----------------------------------------------------------------------------
107350
- // Market Data Methods
107856
+ // Market Data Methods - Implementation for CCXT-style API
107351
107857
  // ----------------------------------------------------------------------------
107352
- async fetchMarkets(params) {
107858
+ async fetchMarketsImpl(params) {
107353
107859
  return (0, fetchMarkets_1.fetchMarkets)(params);
107354
107860
  }
107355
- async searchMarkets(query, params) {
107861
+ async searchMarketsImpl(query, params) {
107356
107862
  return (0, searchMarkets_1.searchMarkets)(query, params);
107357
107863
  }
107358
- async searchEvents(query, params) {
107359
- return (0, searchEvents_1.searchEvents)(query, params);
107360
- }
107361
- async getMarketsBySlug(slug) {
107864
+ async fetchMarketsBySlugImpl(slug) {
107362
107865
  return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
107363
107866
  }
107867
+ async searchEventsImpl(query, params) {
107868
+ return (0, searchEvents_1.searchEvents)(query, params);
107869
+ }
107364
107870
  async fetchOHLCV(id, params) {
107365
107871
  return (0, fetchOHLCV_1.fetchOHLCV)(id, params);
107366
107872
  }
@@ -107374,11 +107880,11 @@ var require_kalshi = __commonJS({
107374
107880
  // User Data Methods
107375
107881
  // ----------------------------------------------------------------------------
107376
107882
  async fetchBalance() {
107377
- const auth = this.ensureAuth();
107378
- const path = "/trade-api/v2/portfolio/balance";
107379
- const baseUrl = this.getBaseUrl();
107380
- const headers = auth.getHeaders("GET", path);
107381
107883
  try {
107884
+ const auth = this.ensureAuth();
107885
+ const path = "/trade-api/v2/portfolio/balance";
107886
+ const baseUrl = this.getBaseUrl();
107887
+ const headers = auth.getHeaders("GET", path);
107382
107888
  const response = await axios_1.default.get(`${baseUrl}${path}`, { headers });
107383
107889
  const balanceCents = response.data.balance;
107384
107890
  const portfolioValueCents = response.data.portfolio_value;
@@ -107395,37 +107901,37 @@ var require_kalshi = __commonJS({
107395
107901
  // Value locked in positions
107396
107902
  }];
107397
107903
  } catch (error) {
107398
- throw error;
107904
+ throw errors_1.kalshiErrorMapper.mapError(error);
107399
107905
  }
107400
107906
  }
107401
107907
  // ----------------------------------------------------------------------------
107402
107908
  // Trading Methods
107403
107909
  // ----------------------------------------------------------------------------
107404
107910
  async createOrder(params) {
107405
- const auth = this.ensureAuth();
107406
- const path = "/trade-api/v2/portfolio/orders";
107407
- const baseUrl = this.getBaseUrl();
107408
- const headers = auth.getHeaders("POST", path);
107409
- const isYesSide = params.side === "buy";
107410
- const kalshiOrder = {
107411
- ticker: params.marketId,
107412
- // Kalshi uses ticker for market identification
107413
- client_order_id: `pmxt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
107414
- side: isYesSide ? "yes" : "no",
107415
- action: params.side === "buy" ? "buy" : "sell",
107416
- count: params.amount,
107417
- // Number of contracts
107418
- type: params.type === "limit" ? "limit" : "market"
107419
- };
107420
- if (params.price) {
107421
- const priceInCents = Math.round(params.price * 100);
107422
- if (isYesSide) {
107423
- kalshiOrder.yes_price = priceInCents;
107424
- } else {
107425
- kalshiOrder.no_price = priceInCents;
107426
- }
107427
- }
107428
107911
  try {
107912
+ const auth = this.ensureAuth();
107913
+ const path = "/trade-api/v2/portfolio/orders";
107914
+ const baseUrl = this.getBaseUrl();
107915
+ const headers = auth.getHeaders("POST", path);
107916
+ const isYesSide = params.side === "buy";
107917
+ const kalshiOrder = {
107918
+ ticker: params.marketId,
107919
+ // Kalshi uses ticker for market identification
107920
+ client_order_id: `pmxt-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
107921
+ side: isYesSide ? "yes" : "no",
107922
+ action: params.side === "buy" ? "buy" : "sell",
107923
+ count: params.amount,
107924
+ // Number of contracts
107925
+ type: params.type === "limit" ? "limit" : "market"
107926
+ };
107927
+ if (params.price) {
107928
+ const priceInCents = Math.round(params.price * 100);
107929
+ if (isYesSide) {
107930
+ kalshiOrder.yes_price = priceInCents;
107931
+ } else {
107932
+ kalshiOrder.no_price = priceInCents;
107933
+ }
107934
+ }
107429
107935
  const response = await axios_1.default.post(`${baseUrl}${path}`, kalshiOrder, { headers });
107430
107936
  const order = response.data.order;
107431
107937
  return {
@@ -107442,15 +107948,15 @@ var require_kalshi = __commonJS({
107442
107948
  timestamp: new Date(order.created_time).getTime()
107443
107949
  };
107444
107950
  } catch (error) {
107445
- throw new Error(`${error.response?.data?.error?.message || error.message} (Status: ${error.response?.status} - ${JSON.stringify(error.response?.data || {})})`);
107951
+ throw errors_1.kalshiErrorMapper.mapError(error);
107446
107952
  }
107447
107953
  }
107448
107954
  async cancelOrder(orderId) {
107449
- const auth = this.ensureAuth();
107450
- const path = `/trade-api/v2/portfolio/orders/${orderId}`;
107451
- const baseUrl = this.getBaseUrl();
107452
- const headers = auth.getHeaders("DELETE", path);
107453
107955
  try {
107956
+ const auth = this.ensureAuth();
107957
+ const path = `/trade-api/v2/portfolio/orders/${orderId}`;
107958
+ const baseUrl = this.getBaseUrl();
107959
+ const headers = auth.getHeaders("DELETE", path);
107454
107960
  const response = await axios_1.default.delete(`${baseUrl}${path}`, { headers });
107455
107961
  const order = response.data.order;
107456
107962
  return {
@@ -107466,15 +107972,15 @@ var require_kalshi = __commonJS({
107466
107972
  timestamp: new Date(order.created_time).getTime()
107467
107973
  };
107468
107974
  } catch (error) {
107469
- throw error;
107975
+ throw errors_1.kalshiErrorMapper.mapError(error);
107470
107976
  }
107471
107977
  }
107472
107978
  async fetchOrder(orderId) {
107473
- const auth = this.ensureAuth();
107474
- const path = `/trade-api/v2/portfolio/orders/${orderId}`;
107475
- const baseUrl = this.getBaseUrl();
107476
- const headers = auth.getHeaders("GET", path);
107477
107979
  try {
107980
+ const auth = this.ensureAuth();
107981
+ const path = `/trade-api/v2/portfolio/orders/${orderId}`;
107982
+ const baseUrl = this.getBaseUrl();
107983
+ const headers = auth.getHeaders("GET", path);
107478
107984
  const response = await axios_1.default.get(`${baseUrl}${path}`, { headers });
107479
107985
  const order = response.data.order;
107480
107986
  return {
@@ -107491,19 +107997,19 @@ var require_kalshi = __commonJS({
107491
107997
  timestamp: new Date(order.created_time).getTime()
107492
107998
  };
107493
107999
  } catch (error) {
107494
- throw error;
108000
+ throw errors_1.kalshiErrorMapper.mapError(error);
107495
108001
  }
107496
108002
  }
107497
108003
  async fetchOpenOrders(marketId) {
107498
- const auth = this.ensureAuth();
107499
- const basePath = "/trade-api/v2/portfolio/orders";
107500
- let queryParams = "?status=resting";
107501
- if (marketId) {
107502
- queryParams += `&ticker=${marketId}`;
107503
- }
107504
- const baseUrl = this.getBaseUrl();
107505
- const headers = auth.getHeaders("GET", basePath);
107506
108004
  try {
108005
+ const auth = this.ensureAuth();
108006
+ const basePath = "/trade-api/v2/portfolio/orders";
108007
+ let queryParams = "?status=resting";
108008
+ if (marketId) {
108009
+ queryParams += `&ticker=${marketId}`;
108010
+ }
108011
+ const baseUrl = this.getBaseUrl();
108012
+ const headers = auth.getHeaders("GET", basePath);
107507
108013
  const response = await axios_1.default.get(`${baseUrl}${basePath}${queryParams}`, { headers });
107508
108014
  const orders = response.data.orders || [];
107509
108015
  return orders.map((order) => ({
@@ -107520,15 +108026,15 @@ var require_kalshi = __commonJS({
107520
108026
  timestamp: new Date(order.created_time).getTime()
107521
108027
  }));
107522
108028
  } catch (error) {
107523
- return [];
108029
+ throw errors_1.kalshiErrorMapper.mapError(error);
107524
108030
  }
107525
108031
  }
107526
108032
  async fetchPositions() {
107527
- const auth = this.ensureAuth();
107528
- const path = "/trade-api/v2/portfolio/positions";
107529
- const baseUrl = this.getBaseUrl();
107530
- const headers = auth.getHeaders("GET", path);
107531
108033
  try {
108034
+ const auth = this.ensureAuth();
108035
+ const path = "/trade-api/v2/portfolio/positions";
108036
+ const baseUrl = this.getBaseUrl();
108037
+ const headers = auth.getHeaders("GET", path);
107532
108038
  const response = await axios_1.default.get(`${baseUrl}${path}`, { headers });
107533
108039
  const positions = response.data.market_positions || [];
107534
108040
  return positions.map((pos) => {
@@ -107548,7 +108054,7 @@ var require_kalshi = __commonJS({
107548
108054
  };
107549
108055
  });
107550
108056
  } catch (error) {
107551
- return [];
108057
+ throw errors_1.kalshiErrorMapper.mapError(error);
107552
108058
  }
107553
108059
  }
107554
108060
  // Helper to map Kalshi order status to unified status
@@ -107607,6 +108113,7 @@ var require_app = __commonJS({
107607
108113
  var polymarket_1 = require_polymarket();
107608
108114
  var limitless_1 = require_limitless();
107609
108115
  var kalshi_1 = require_kalshi();
108116
+ var errors_1 = require_errors();
107610
108117
  var defaultExchanges = {
107611
108118
  polymarket: null,
107612
108119
  limitless: null,
@@ -107657,6 +108164,27 @@ var require_app = __commonJS({
107657
108164
  if (error.stack) {
107658
108165
  console.error(error.stack);
107659
108166
  }
108167
+ if (error instanceof errors_1.BaseError) {
108168
+ const errorResponse = {
108169
+ success: false,
108170
+ error: {
108171
+ message: error.message,
108172
+ code: error.code,
108173
+ retryable: error.retryable
108174
+ }
108175
+ };
108176
+ if (error.exchange) {
108177
+ errorResponse.error.exchange = error.exchange;
108178
+ }
108179
+ if ("retryAfter" in error && error.retryAfter !== void 0) {
108180
+ errorResponse.error.retryAfter = error.retryAfter;
108181
+ }
108182
+ if (process.env.NODE_ENV === "development") {
108183
+ errorResponse.error.stack = error.stack;
108184
+ }
108185
+ res.status(error.status).json(errorResponse);
108186
+ return;
108187
+ }
107660
108188
  res.status(error.status || 500).json({
107661
108189
  success: false,
107662
108190
  error: {