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.
- pmxt/__init__.py +1 -1
- pmxt/_server/server/bundled.js +714 -186
- {pmxt-1.6.0.dist-info → pmxt-2.0.0b0.dist-info}/METADATA +9 -9
- {pmxt-1.6.0.dist-info → pmxt-2.0.0b0.dist-info}/RECORD +9 -9
- pmxt_internal/__init__.py +1 -1
- pmxt_internal/api_client.py +1 -1
- pmxt_internal/configuration.py +1 -1
- {pmxt-1.6.0.dist-info → pmxt-2.0.0b0.dist-info}/WHEEL +0 -0
- {pmxt-1.6.0.dist-info → pmxt-2.0.0b0.dist-info}/top_level.txt +0 -0
pmxt/_server/server/bundled.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
105553
|
+
async searchMarketsImpl(query, params) {
|
|
105157
105554
|
return (0, searchMarkets_1.searchMarkets)(query, params);
|
|
105158
105555
|
}
|
|
105159
|
-
async
|
|
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
|
|
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
|
-
|
|
105340
|
-
return [];
|
|
105736
|
+
throw errors_1.polymarketErrorMapper.mapError(error);
|
|
105341
105737
|
}
|
|
105342
105738
|
}
|
|
105343
105739
|
async fetchPositions() {
|
|
105344
|
-
|
|
105345
|
-
|
|
105346
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
106604
|
+
async searchMarketsImpl(query, params) {
|
|
106142
106605
|
return (0, searchMarkets_1.searchMarkets)(query, params);
|
|
106143
106606
|
}
|
|
106144
|
-
async
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
107858
|
+
async fetchMarketsImpl(params) {
|
|
107353
107859
|
return (0, fetchMarkets_1.fetchMarkets)(params);
|
|
107354
107860
|
}
|
|
107355
|
-
async
|
|
107861
|
+
async searchMarketsImpl(query, params) {
|
|
107356
107862
|
return (0, searchMarkets_1.searchMarkets)(query, params);
|
|
107357
107863
|
}
|
|
107358
|
-
async
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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: {
|