pmxtjs 0.4.3 → 1.0.0-b2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +161 -0
- package/dist/esm/generated/src/apis/DefaultApi.d.ts +268 -0
- package/dist/esm/generated/src/apis/DefaultApi.js +501 -0
- package/dist/esm/generated/src/apis/index.d.ts +1 -0
- package/dist/esm/generated/src/apis/index.js +19 -0
- package/dist/esm/generated/src/index.d.ts +3 -0
- package/dist/esm/generated/src/index.js +21 -0
- package/dist/esm/generated/src/models/Balance.d.ts +50 -0
- package/dist/esm/generated/src/models/Balance.js +54 -0
- package/dist/esm/generated/src/models/BaseResponse.d.ts +39 -0
- package/dist/esm/generated/src/models/BaseResponse.js +51 -0
- package/dist/esm/generated/src/models/CancelOrderRequest.d.ts +32 -0
- package/dist/esm/generated/src/models/CancelOrderRequest.js +50 -0
- package/dist/esm/generated/src/models/CreateOrder200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/CreateOrder200Response.js +54 -0
- package/dist/esm/generated/src/models/CreateOrderParams.d.ts +78 -0
- package/dist/esm/generated/src/models/CreateOrderParams.js +83 -0
- package/dist/esm/generated/src/models/CreateOrderRequest.d.ts +33 -0
- package/dist/esm/generated/src/models/CreateOrderRequest.js +51 -0
- package/dist/esm/generated/src/models/ErrorDetail.d.ts +32 -0
- package/dist/esm/generated/src/models/ErrorDetail.js +48 -0
- package/dist/esm/generated/src/models/ErrorResponse.d.ts +39 -0
- package/dist/esm/generated/src/models/ErrorResponse.js +51 -0
- package/dist/esm/generated/src/models/FetchBalance200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchBalance200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchMarkets200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchMarkets200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchMarketsRequest.d.ts +33 -0
- package/dist/esm/generated/src/models/FetchMarketsRequest.js +49 -0
- package/dist/esm/generated/src/models/FetchOHLCV200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchOHLCV200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchOHLCVRequest.d.ts +33 -0
- package/dist/esm/generated/src/models/FetchOHLCVRequest.js +51 -0
- package/dist/esm/generated/src/models/FetchOHLCVRequestArgsInner.d.ts +22 -0
- package/dist/esm/generated/src/models/FetchOHLCVRequestArgsInner.js +56 -0
- package/dist/esm/generated/src/models/FetchOpenOrders200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchOpenOrders200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchOpenOrdersRequest.d.ts +32 -0
- package/dist/esm/generated/src/models/FetchOpenOrdersRequest.js +48 -0
- package/dist/esm/generated/src/models/FetchOrderBook200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchOrderBook200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchOrderBookRequest.d.ts +32 -0
- package/dist/esm/generated/src/models/FetchOrderBookRequest.js +50 -0
- package/dist/esm/generated/src/models/FetchPositions200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchPositions200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchPositionsRequest.d.ts +32 -0
- package/dist/esm/generated/src/models/FetchPositionsRequest.js +48 -0
- package/dist/esm/generated/src/models/FetchTrades200Response.d.ts +46 -0
- package/dist/esm/generated/src/models/FetchTrades200Response.js +54 -0
- package/dist/esm/generated/src/models/FetchTradesRequest.d.ts +33 -0
- package/dist/esm/generated/src/models/FetchTradesRequest.js +51 -0
- package/dist/esm/generated/src/models/GetMarketsBySlugRequest.d.ts +32 -0
- package/dist/esm/generated/src/models/GetMarketsBySlugRequest.js +50 -0
- package/dist/esm/generated/src/models/HealthCheck200Response.d.ts +38 -0
- package/dist/esm/generated/src/models/HealthCheck200Response.js +50 -0
- package/dist/esm/generated/src/models/HistoryFilterParams.d.ts +62 -0
- package/dist/esm/generated/src/models/HistoryFilterParams.js +68 -0
- package/dist/esm/generated/src/models/MarketFilterParams.d.ts +68 -0
- package/dist/esm/generated/src/models/MarketFilterParams.js +71 -0
- package/dist/esm/generated/src/models/MarketOutcome.d.ts +44 -0
- package/dist/esm/generated/src/models/MarketOutcome.js +52 -0
- package/dist/esm/generated/src/models/Order.d.ts +108 -0
- package/dist/esm/generated/src/models/Order.js +83 -0
- package/dist/esm/generated/src/models/OrderBook.d.ts +39 -0
- package/dist/esm/generated/src/models/OrderBook.js +51 -0
- package/dist/esm/generated/src/models/OrderLevel.d.ts +38 -0
- package/dist/esm/generated/src/models/OrderLevel.js +50 -0
- package/dist/esm/generated/src/models/Position.d.ts +74 -0
- package/dist/esm/generated/src/models/Position.js +62 -0
- package/dist/esm/generated/src/models/PriceCandle.d.ts +62 -0
- package/dist/esm/generated/src/models/PriceCandle.js +58 -0
- package/dist/esm/generated/src/models/SearchMarketsRequest.d.ts +33 -0
- package/dist/esm/generated/src/models/SearchMarketsRequest.js +51 -0
- package/dist/esm/generated/src/models/SearchMarketsRequestArgsInner.d.ts +22 -0
- package/dist/esm/generated/src/models/SearchMarketsRequestArgsInner.js +56 -0
- package/dist/esm/generated/src/models/Trade.d.ts +65 -0
- package/dist/esm/generated/src/models/Trade.js +65 -0
- package/dist/esm/generated/src/models/UnifiedMarket.d.ts +63 -0
- package/dist/esm/generated/src/models/UnifiedMarket.js +59 -0
- package/dist/esm/generated/src/models/index.d.ts +36 -0
- package/dist/esm/generated/src/models/index.js +54 -0
- package/dist/esm/generated/src/runtime.d.ts +184 -0
- package/dist/esm/generated/src/runtime.js +349 -0
- package/dist/esm/index.d.ts +32 -0
- package/dist/esm/index.js +33 -0
- package/dist/esm/pmxt/client.d.ts +213 -0
- package/dist/esm/pmxt/client.js +518 -0
- package/dist/esm/pmxt/models.d.ts +218 -0
- package/dist/esm/pmxt/models.js +6 -0
- package/dist/esm/pmxt/server-manager.d.ts +29 -0
- package/dist/esm/pmxt/server-manager.js +68 -0
- package/dist/generated/src/apis/DefaultApi.d.ts +268 -0
- package/dist/generated/src/apis/DefaultApi.js +501 -0
- package/dist/generated/src/apis/index.d.ts +1 -0
- package/dist/generated/src/apis/index.js +19 -0
- package/dist/generated/src/index.d.ts +3 -0
- package/dist/generated/src/index.js +21 -0
- package/dist/generated/src/models/Balance.d.ts +50 -0
- package/dist/generated/src/models/Balance.js +54 -0
- package/dist/generated/src/models/BaseResponse.d.ts +39 -0
- package/dist/generated/src/models/BaseResponse.js +51 -0
- package/dist/generated/src/models/CancelOrderRequest.d.ts +32 -0
- package/dist/generated/src/models/CancelOrderRequest.js +50 -0
- package/dist/generated/src/models/CreateOrder200Response.d.ts +46 -0
- package/dist/generated/src/models/CreateOrder200Response.js +54 -0
- package/dist/generated/src/models/CreateOrderParams.d.ts +78 -0
- package/dist/generated/src/models/CreateOrderParams.js +83 -0
- package/dist/generated/src/models/CreateOrderRequest.d.ts +33 -0
- package/dist/generated/src/models/CreateOrderRequest.js +51 -0
- package/dist/generated/src/models/ErrorDetail.d.ts +32 -0
- package/dist/generated/src/models/ErrorDetail.js +48 -0
- package/dist/generated/src/models/ErrorResponse.d.ts +39 -0
- package/dist/generated/src/models/ErrorResponse.js +51 -0
- package/dist/generated/src/models/FetchBalance200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchBalance200Response.js +54 -0
- package/dist/generated/src/models/FetchMarkets200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchMarkets200Response.js +54 -0
- package/dist/generated/src/models/FetchMarketsRequest.d.ts +33 -0
- package/dist/generated/src/models/FetchMarketsRequest.js +49 -0
- package/dist/generated/src/models/FetchOHLCV200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchOHLCV200Response.js +54 -0
- package/dist/generated/src/models/FetchOHLCVRequest.d.ts +33 -0
- package/dist/generated/src/models/FetchOHLCVRequest.js +51 -0
- package/dist/generated/src/models/FetchOHLCVRequestArgsInner.d.ts +22 -0
- package/dist/generated/src/models/FetchOHLCVRequestArgsInner.js +56 -0
- package/dist/generated/src/models/FetchOpenOrders200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchOpenOrders200Response.js +54 -0
- package/dist/generated/src/models/FetchOpenOrdersRequest.d.ts +32 -0
- package/dist/generated/src/models/FetchOpenOrdersRequest.js +48 -0
- package/dist/generated/src/models/FetchOrderBook200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchOrderBook200Response.js +54 -0
- package/dist/generated/src/models/FetchOrderBookRequest.d.ts +32 -0
- package/dist/generated/src/models/FetchOrderBookRequest.js +50 -0
- package/dist/generated/src/models/FetchPositions200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchPositions200Response.js +54 -0
- package/dist/generated/src/models/FetchPositionsRequest.d.ts +32 -0
- package/dist/generated/src/models/FetchPositionsRequest.js +48 -0
- package/dist/generated/src/models/FetchTrades200Response.d.ts +46 -0
- package/dist/generated/src/models/FetchTrades200Response.js +54 -0
- package/dist/generated/src/models/FetchTradesRequest.d.ts +33 -0
- package/dist/generated/src/models/FetchTradesRequest.js +51 -0
- package/dist/generated/src/models/GetMarketsBySlugRequest.d.ts +32 -0
- package/dist/generated/src/models/GetMarketsBySlugRequest.js +50 -0
- package/dist/generated/src/models/HealthCheck200Response.d.ts +38 -0
- package/dist/generated/src/models/HealthCheck200Response.js +50 -0
- package/dist/generated/src/models/HistoryFilterParams.d.ts +62 -0
- package/dist/generated/src/models/HistoryFilterParams.js +68 -0
- package/dist/generated/src/models/MarketFilterParams.d.ts +68 -0
- package/dist/generated/src/models/MarketFilterParams.js +71 -0
- package/dist/generated/src/models/MarketOutcome.d.ts +44 -0
- package/dist/generated/src/models/MarketOutcome.js +52 -0
- package/dist/generated/src/models/Order.d.ts +108 -0
- package/dist/generated/src/models/Order.js +83 -0
- package/dist/generated/src/models/OrderBook.d.ts +39 -0
- package/dist/generated/src/models/OrderBook.js +51 -0
- package/dist/generated/src/models/OrderLevel.d.ts +38 -0
- package/dist/generated/src/models/OrderLevel.js +50 -0
- package/dist/generated/src/models/Position.d.ts +74 -0
- package/dist/generated/src/models/Position.js +62 -0
- package/dist/generated/src/models/PriceCandle.d.ts +62 -0
- package/dist/generated/src/models/PriceCandle.js +58 -0
- package/dist/generated/src/models/SearchMarketsRequest.d.ts +33 -0
- package/dist/generated/src/models/SearchMarketsRequest.js +51 -0
- package/dist/generated/src/models/SearchMarketsRequestArgsInner.d.ts +22 -0
- package/dist/generated/src/models/SearchMarketsRequestArgsInner.js +56 -0
- package/dist/generated/src/models/Trade.d.ts +65 -0
- package/dist/generated/src/models/Trade.js +65 -0
- package/dist/generated/src/models/UnifiedMarket.d.ts +63 -0
- package/dist/generated/src/models/UnifiedMarket.js +59 -0
- package/dist/generated/src/models/index.d.ts +36 -0
- package/dist/generated/src/models/index.js +54 -0
- package/dist/generated/src/runtime.d.ts +184 -0
- package/dist/generated/src/runtime.js +349 -0
- package/dist/index.d.ts +29 -10
- package/dist/index.js +31 -27
- package/dist/pmxt/client.d.ts +213 -0
- package/dist/pmxt/client.js +518 -0
- package/dist/pmxt/models.d.ts +218 -0
- package/dist/pmxt/models.js +6 -0
- package/dist/pmxt/server-manager.d.ts +29 -0
- package/dist/pmxt/server-manager.js +68 -0
- package/generated/.openapi-generator/FILES +84 -0
- package/generated/.openapi-generator/VERSION +1 -0
- package/generated/.openapi-generator-ignore +23 -0
- package/generated/docs/Balance.md +40 -0
- package/generated/docs/BaseResponse.md +36 -0
- package/generated/docs/CancelOrderRequest.md +34 -0
- package/generated/docs/CreateOrder200Response.md +38 -0
- package/generated/docs/CreateOrderParams.md +44 -0
- package/generated/docs/CreateOrderRequest.md +34 -0
- package/generated/docs/DefaultApi.md +896 -0
- package/generated/docs/ErrorDetail.md +34 -0
- package/generated/docs/ErrorResponse.md +36 -0
- package/generated/docs/FetchBalance200Response.md +38 -0
- package/generated/docs/FetchMarkets200Response.md +38 -0
- package/generated/docs/FetchMarketsRequest.md +34 -0
- package/generated/docs/FetchOHLCV200Response.md +38 -0
- package/generated/docs/FetchOHLCVRequest.md +34 -0
- package/generated/docs/FetchOHLCVRequestArgsInner.md +40 -0
- package/generated/docs/FetchOpenOrders200Response.md +38 -0
- package/generated/docs/FetchOpenOrdersRequest.md +34 -0
- package/generated/docs/FetchOrderBook200Response.md +38 -0
- package/generated/docs/FetchOrderBookRequest.md +34 -0
- package/generated/docs/FetchPositions200Response.md +38 -0
- package/generated/docs/FetchPositionsRequest.md +34 -0
- package/generated/docs/FetchTrades200Response.md +38 -0
- package/generated/docs/FetchTradesRequest.md +34 -0
- package/generated/docs/GetMarketsBySlugRequest.md +34 -0
- package/generated/docs/HealthCheck200Response.md +36 -0
- package/generated/docs/HistoryFilterParams.md +40 -0
- package/generated/docs/MarketFilterParams.md +40 -0
- package/generated/docs/MarketOutcome.md +38 -0
- package/generated/docs/Order.md +54 -0
- package/generated/docs/OrderBook.md +36 -0
- package/generated/docs/OrderLevel.md +36 -0
- package/generated/docs/Position.md +48 -0
- package/generated/docs/PriceCandle.md +44 -0
- package/generated/docs/SearchMarketsRequest.md +34 -0
- package/generated/docs/SearchMarketsRequestArgsInner.md +40 -0
- package/generated/docs/Trade.md +42 -0
- package/generated/docs/UnifiedMarket.md +44 -0
- package/generated/package.json +21 -0
- package/generated/src/apis/DefaultApi.ts +752 -0
- package/generated/src/apis/index.ts +3 -0
- package/generated/src/index.ts +5 -0
- package/generated/src/models/Balance.ts +89 -0
- package/generated/src/models/BaseResponse.ts +81 -0
- package/generated/src/models/CancelOrderRequest.ts +66 -0
- package/generated/src/models/CreateOrder200Response.ts +96 -0
- package/generated/src/models/CreateOrderParams.ts +130 -0
- package/generated/src/models/CreateOrderRequest.ts +74 -0
- package/generated/src/models/ErrorDetail.ts +65 -0
- package/generated/src/models/ErrorResponse.ts +81 -0
- package/generated/src/models/FetchBalance200Response.ts +96 -0
- package/generated/src/models/FetchMarkets200Response.ts +96 -0
- package/generated/src/models/FetchMarketsRequest.ts +73 -0
- package/generated/src/models/FetchOHLCV200Response.ts +96 -0
- package/generated/src/models/FetchOHLCVRequest.ts +74 -0
- package/generated/src/models/FetchOHLCVRequestArgsInner.ts +69 -0
- package/generated/src/models/FetchOpenOrders200Response.ts +96 -0
- package/generated/src/models/FetchOpenOrdersRequest.ts +65 -0
- package/generated/src/models/FetchOrderBook200Response.ts +96 -0
- package/generated/src/models/FetchOrderBookRequest.ts +66 -0
- package/generated/src/models/FetchPositions200Response.ts +96 -0
- package/generated/src/models/FetchPositionsRequest.ts +65 -0
- package/generated/src/models/FetchTrades200Response.ts +96 -0
- package/generated/src/models/FetchTradesRequest.ts +74 -0
- package/generated/src/models/GetMarketsBySlugRequest.ts +66 -0
- package/generated/src/models/HealthCheck200Response.ts +73 -0
- package/generated/src/models/HistoryFilterParams.ts +105 -0
- package/generated/src/models/MarketFilterParams.ts +111 -0
- package/generated/src/models/MarketOutcome.ts +81 -0
- package/generated/src/models/Order.ts +165 -0
- package/generated/src/models/OrderBook.ts +81 -0
- package/generated/src/models/OrderLevel.ts +73 -0
- package/generated/src/models/Position.ts +121 -0
- package/generated/src/models/PriceCandle.ts +105 -0
- package/generated/src/models/SearchMarketsRequest.ts +74 -0
- package/generated/src/models/SearchMarketsRequestArgsInner.ts +69 -0
- package/generated/src/models/Trade.ts +109 -0
- package/generated/src/models/UnifiedMarket.ts +113 -0
- package/generated/src/models/index.ts +38 -0
- package/generated/src/runtime.ts +432 -0
- package/generated/tsconfig.esm.json +7 -0
- package/generated/tsconfig.json +16 -0
- package/index.ts +40 -0
- package/package.json +39 -27
- package/pmxt/client.ts +628 -0
- package/pmxt/models.ts +292 -0
- package/pmxt/server-manager.ts +86 -0
- package/API_REFERENCE.md +0 -483
- package/LICENSE +0 -21
- package/dist/BaseExchange.d.ts +0 -74
- package/dist/BaseExchange.js +0 -72
- package/dist/exchanges/kalshi/auth.d.ts +0 -23
- package/dist/exchanges/kalshi/auth.js +0 -99
- package/dist/exchanges/kalshi/fetchMarkets.d.ts +0 -3
- package/dist/exchanges/kalshi/fetchMarkets.js +0 -110
- package/dist/exchanges/kalshi/fetchOHLCV.d.ts +0 -3
- package/dist/exchanges/kalshi/fetchOHLCV.js +0 -78
- package/dist/exchanges/kalshi/fetchOrderBook.d.ts +0 -2
- package/dist/exchanges/kalshi/fetchOrderBook.js +0 -32
- package/dist/exchanges/kalshi/fetchTrades.d.ts +0 -3
- package/dist/exchanges/kalshi/fetchTrades.js +0 -31
- package/dist/exchanges/kalshi/getMarketsBySlug.d.ts +0 -7
- package/dist/exchanges/kalshi/getMarketsBySlug.js +0 -62
- package/dist/exchanges/kalshi/index.d.ts +0 -21
- package/dist/exchanges/kalshi/index.js +0 -273
- package/dist/exchanges/kalshi/kalshi.test.d.ts +0 -1
- package/dist/exchanges/kalshi/kalshi.test.js +0 -309
- package/dist/exchanges/kalshi/searchMarkets.d.ts +0 -3
- package/dist/exchanges/kalshi/searchMarkets.js +0 -28
- package/dist/exchanges/kalshi/utils.d.ts +0 -5
- package/dist/exchanges/kalshi/utils.js +0 -85
- package/dist/exchanges/polymarket/auth.d.ts +0 -32
- package/dist/exchanges/polymarket/auth.js +0 -98
- package/dist/exchanges/polymarket/fetchMarkets.d.ts +0 -3
- package/dist/exchanges/polymarket/fetchMarkets.js +0 -75
- package/dist/exchanges/polymarket/fetchOHLCV.d.ts +0 -7
- package/dist/exchanges/polymarket/fetchOHLCV.js +0 -73
- package/dist/exchanges/polymarket/fetchOrderBook.d.ts +0 -6
- package/dist/exchanges/polymarket/fetchOrderBook.js +0 -38
- package/dist/exchanges/polymarket/fetchPositions.d.ts +0 -2
- package/dist/exchanges/polymarket/fetchPositions.js +0 -27
- package/dist/exchanges/polymarket/fetchTrades.d.ts +0 -11
- package/dist/exchanges/polymarket/fetchTrades.js +0 -59
- package/dist/exchanges/polymarket/getMarketsBySlug.d.ts +0 -7
- package/dist/exchanges/polymarket/getMarketsBySlug.js +0 -39
- package/dist/exchanges/polymarket/index.d.ts +0 -23
- package/dist/exchanges/polymarket/index.js +0 -216
- package/dist/exchanges/polymarket/searchMarkets.d.ts +0 -3
- package/dist/exchanges/polymarket/searchMarkets.js +0 -35
- package/dist/exchanges/polymarket/utils.d.ts +0 -7
- package/dist/exchanges/polymarket/utils.js +0 -95
- package/dist/types.d.ts +0 -85
- package/dist/types.js +0 -5
- package/readme.md +0 -133
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exchange client implementations.
|
|
3
|
+
*
|
|
4
|
+
* This module provides clean, TypeScript-friendly wrappers around the auto-generated
|
|
5
|
+
* OpenAPI client, matching the Python API exactly.
|
|
6
|
+
*/
|
|
7
|
+
import { DefaultApi, Configuration, } from "../generated/src/index.js";
|
|
8
|
+
import { ServerManager } from "./server-manager.js";
|
|
9
|
+
// Converter functions
|
|
10
|
+
function convertMarket(raw) {
|
|
11
|
+
const outcomes = (raw.outcomes || []).map((o) => ({
|
|
12
|
+
id: o.id,
|
|
13
|
+
label: o.label,
|
|
14
|
+
price: o.price,
|
|
15
|
+
priceChange24h: o.priceChange24h,
|
|
16
|
+
metadata: o.metadata,
|
|
17
|
+
}));
|
|
18
|
+
return {
|
|
19
|
+
id: raw.id,
|
|
20
|
+
title: raw.title,
|
|
21
|
+
outcomes,
|
|
22
|
+
volume24h: raw.volume24h || 0,
|
|
23
|
+
liquidity: raw.liquidity || 0,
|
|
24
|
+
url: raw.url,
|
|
25
|
+
description: raw.description,
|
|
26
|
+
resolutionDate: raw.resolutionDate ? new Date(raw.resolutionDate) : undefined,
|
|
27
|
+
volume: raw.volume,
|
|
28
|
+
openInterest: raw.openInterest,
|
|
29
|
+
image: raw.image,
|
|
30
|
+
category: raw.category,
|
|
31
|
+
tags: raw.tags,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function convertCandle(raw) {
|
|
35
|
+
return {
|
|
36
|
+
timestamp: raw.timestamp,
|
|
37
|
+
open: raw.open,
|
|
38
|
+
high: raw.high,
|
|
39
|
+
low: raw.low,
|
|
40
|
+
close: raw.close,
|
|
41
|
+
volume: raw.volume,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function convertOrderBook(raw) {
|
|
45
|
+
const bids = (raw.bids || []).map((b) => ({
|
|
46
|
+
price: b.price,
|
|
47
|
+
size: b.size,
|
|
48
|
+
}));
|
|
49
|
+
const asks = (raw.asks || []).map((a) => ({
|
|
50
|
+
price: a.price,
|
|
51
|
+
size: a.size,
|
|
52
|
+
}));
|
|
53
|
+
return {
|
|
54
|
+
bids,
|
|
55
|
+
asks,
|
|
56
|
+
timestamp: raw.timestamp,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function convertTrade(raw) {
|
|
60
|
+
return {
|
|
61
|
+
id: raw.id,
|
|
62
|
+
timestamp: raw.timestamp,
|
|
63
|
+
price: raw.price,
|
|
64
|
+
amount: raw.amount,
|
|
65
|
+
side: raw.side || "unknown",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function convertOrder(raw) {
|
|
69
|
+
return {
|
|
70
|
+
id: raw.id,
|
|
71
|
+
marketId: raw.marketId,
|
|
72
|
+
outcomeId: raw.outcomeId,
|
|
73
|
+
side: raw.side,
|
|
74
|
+
type: raw.type,
|
|
75
|
+
amount: raw.amount,
|
|
76
|
+
status: raw.status,
|
|
77
|
+
filled: raw.filled,
|
|
78
|
+
remaining: raw.remaining,
|
|
79
|
+
timestamp: raw.timestamp,
|
|
80
|
+
price: raw.price,
|
|
81
|
+
fee: raw.fee,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function convertPosition(raw) {
|
|
85
|
+
return {
|
|
86
|
+
marketId: raw.marketId,
|
|
87
|
+
outcomeId: raw.outcomeId,
|
|
88
|
+
outcomeLabel: raw.outcomeLabel,
|
|
89
|
+
size: raw.size,
|
|
90
|
+
entryPrice: raw.entryPrice,
|
|
91
|
+
currentPrice: raw.currentPrice,
|
|
92
|
+
unrealizedPnL: raw.unrealizedPnL,
|
|
93
|
+
realizedPnL: raw.realizedPnL,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function convertBalance(raw) {
|
|
97
|
+
return {
|
|
98
|
+
currency: raw.currency,
|
|
99
|
+
total: raw.total,
|
|
100
|
+
available: raw.available,
|
|
101
|
+
locked: raw.locked,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Base class for prediction market exchanges.
|
|
106
|
+
*
|
|
107
|
+
* This provides a unified interface for interacting with different
|
|
108
|
+
* prediction market platforms (Polymarket, Kalshi, etc.).
|
|
109
|
+
*/
|
|
110
|
+
export class Exchange {
|
|
111
|
+
exchangeName;
|
|
112
|
+
apiKey;
|
|
113
|
+
privateKey;
|
|
114
|
+
api;
|
|
115
|
+
serverManager;
|
|
116
|
+
constructor(exchangeName, options = {}) {
|
|
117
|
+
this.exchangeName = exchangeName.toLowerCase();
|
|
118
|
+
this.apiKey = options.apiKey;
|
|
119
|
+
this.privateKey = options.privateKey;
|
|
120
|
+
const baseUrl = options.baseUrl || "http://localhost:3847";
|
|
121
|
+
const autoStartServer = options.autoStartServer !== false;
|
|
122
|
+
// Initialize server manager
|
|
123
|
+
this.serverManager = new ServerManager({ baseUrl });
|
|
124
|
+
// Ensure server is running (unless disabled)
|
|
125
|
+
if (autoStartServer) {
|
|
126
|
+
this.serverManager.ensureServerRunning().catch((error) => {
|
|
127
|
+
throw new Error(`Failed to start PMXT server: ${error}\n\n` +
|
|
128
|
+
`Please ensure 'pmxt-core' is installed: npm install -g pmxt-core\n` +
|
|
129
|
+
`Or start the server manually: pmxt-server`);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// Configure the API client
|
|
133
|
+
const config = new Configuration({ basePath: baseUrl });
|
|
134
|
+
this.api = new DefaultApi(config);
|
|
135
|
+
}
|
|
136
|
+
handleResponse(response) {
|
|
137
|
+
if (!response.success) {
|
|
138
|
+
const error = response.error || {};
|
|
139
|
+
throw new Error(error.message || "Unknown error");
|
|
140
|
+
}
|
|
141
|
+
return response.data;
|
|
142
|
+
}
|
|
143
|
+
// Market Data Methods
|
|
144
|
+
/**
|
|
145
|
+
* Get active markets from the exchange.
|
|
146
|
+
*
|
|
147
|
+
* @param params - Optional filter parameters
|
|
148
|
+
* @returns List of unified markets
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const markets = await exchange.fetchMarkets({ limit: 20, sort: "volume" });
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
async fetchMarkets(params) {
|
|
156
|
+
try {
|
|
157
|
+
const args = [];
|
|
158
|
+
if (params) {
|
|
159
|
+
args.push(params);
|
|
160
|
+
}
|
|
161
|
+
const requestBody = { args };
|
|
162
|
+
const response = await this.api.fetchMarkets({
|
|
163
|
+
exchange: this.exchangeName,
|
|
164
|
+
fetchMarketsRequest: requestBody,
|
|
165
|
+
});
|
|
166
|
+
const data = this.handleResponse(response);
|
|
167
|
+
return data.map(convertMarket);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
throw new Error(`Failed to fetch markets: ${error}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Search markets by keyword.
|
|
175
|
+
*
|
|
176
|
+
* @param query - Search query
|
|
177
|
+
* @param params - Optional filter parameters
|
|
178
|
+
* @returns List of matching markets
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const markets = await exchange.searchMarkets("Trump", { limit: 10 });
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
async searchMarkets(query, params) {
|
|
186
|
+
try {
|
|
187
|
+
const args = [query];
|
|
188
|
+
if (params) {
|
|
189
|
+
args.push(params);
|
|
190
|
+
}
|
|
191
|
+
const requestBody = { args };
|
|
192
|
+
const response = await this.api.searchMarkets({
|
|
193
|
+
exchange: this.exchangeName,
|
|
194
|
+
searchMarketsRequest: requestBody,
|
|
195
|
+
});
|
|
196
|
+
const data = this.handleResponse(response);
|
|
197
|
+
return data.map(convertMarket);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
throw new Error(`Failed to search markets: ${error}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Fetch markets by URL slug/ticker.
|
|
205
|
+
*
|
|
206
|
+
* @param slug - Market slug (Polymarket) or ticker (Kalshi)
|
|
207
|
+
* @returns List of matching markets
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```typescript
|
|
211
|
+
* // Polymarket
|
|
212
|
+
* const markets = await poly.getMarketsBySlug("who-will-trump-nominate-as-fed-chair");
|
|
213
|
+
*
|
|
214
|
+
* // Kalshi
|
|
215
|
+
* const markets = await kalshi.getMarketsBySlug("KXFEDCHAIRNOM-29");
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
async getMarketsBySlug(slug) {
|
|
219
|
+
try {
|
|
220
|
+
const requestBody = { args: [slug] };
|
|
221
|
+
const response = await this.api.getMarketsBySlug({
|
|
222
|
+
exchange: this.exchangeName,
|
|
223
|
+
getMarketsBySlugRequest: requestBody,
|
|
224
|
+
});
|
|
225
|
+
const data = this.handleResponse(response);
|
|
226
|
+
return data.map(convertMarket);
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
throw new Error(`Failed to get markets by slug: ${error}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get historical price candles.
|
|
234
|
+
*
|
|
235
|
+
* **CRITICAL**: Use outcome.id, not market.id.
|
|
236
|
+
* - Polymarket: outcome.id is the CLOB Token ID
|
|
237
|
+
* - Kalshi: outcome.id is the Market Ticker
|
|
238
|
+
*
|
|
239
|
+
* @param outcomeId - Outcome ID (from market.outcomes[].id)
|
|
240
|
+
* @param params - History filter parameters
|
|
241
|
+
* @returns List of price candles
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```typescript
|
|
245
|
+
* const markets = await exchange.searchMarkets("Trump");
|
|
246
|
+
* const outcomeId = markets[0].outcomes[0].id;
|
|
247
|
+
* const candles = await exchange.fetchOHLCV(outcomeId, {
|
|
248
|
+
* resolution: "1h",
|
|
249
|
+
* limit: 100
|
|
250
|
+
* });
|
|
251
|
+
* ```
|
|
252
|
+
*/
|
|
253
|
+
async fetchOHLCV(outcomeId, params) {
|
|
254
|
+
try {
|
|
255
|
+
const paramsDict = { resolution: params.resolution };
|
|
256
|
+
if (params.start) {
|
|
257
|
+
paramsDict.start = params.start.toISOString();
|
|
258
|
+
}
|
|
259
|
+
if (params.end) {
|
|
260
|
+
paramsDict.end = params.end.toISOString();
|
|
261
|
+
}
|
|
262
|
+
if (params.limit) {
|
|
263
|
+
paramsDict.limit = params.limit;
|
|
264
|
+
}
|
|
265
|
+
const requestBody = { args: [outcomeId, paramsDict] };
|
|
266
|
+
const response = await this.api.fetchOHLCV({
|
|
267
|
+
exchange: this.exchangeName,
|
|
268
|
+
fetchOHLCVRequest: requestBody,
|
|
269
|
+
});
|
|
270
|
+
const data = this.handleResponse(response);
|
|
271
|
+
return data.map(convertCandle);
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
throw new Error(`Failed to fetch OHLCV: ${error}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get current order book for an outcome.
|
|
279
|
+
*
|
|
280
|
+
* @param outcomeId - Outcome ID
|
|
281
|
+
* @returns Current order book
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```typescript
|
|
285
|
+
* const orderBook = await exchange.fetchOrderBook(outcomeId);
|
|
286
|
+
* console.log(`Best bid: ${orderBook.bids[0].price}`);
|
|
287
|
+
* console.log(`Best ask: ${orderBook.asks[0].price}`);
|
|
288
|
+
* ```
|
|
289
|
+
*/
|
|
290
|
+
async fetchOrderBook(outcomeId) {
|
|
291
|
+
try {
|
|
292
|
+
const requestBody = { args: [outcomeId] };
|
|
293
|
+
const response = await this.api.fetchOrderBook({
|
|
294
|
+
exchange: this.exchangeName,
|
|
295
|
+
fetchOrderBookRequest: requestBody,
|
|
296
|
+
});
|
|
297
|
+
const data = this.handleResponse(response);
|
|
298
|
+
return convertOrderBook(data);
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
throw new Error(`Failed to fetch order book: ${error}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get trade history for an outcome.
|
|
306
|
+
*
|
|
307
|
+
* Note: Polymarket requires API key.
|
|
308
|
+
*
|
|
309
|
+
* @param outcomeId - Outcome ID
|
|
310
|
+
* @param params - History filter parameters
|
|
311
|
+
* @returns List of trades
|
|
312
|
+
*/
|
|
313
|
+
async fetchTrades(outcomeId, params) {
|
|
314
|
+
try {
|
|
315
|
+
const paramsDict = { resolution: params.resolution };
|
|
316
|
+
if (params.limit) {
|
|
317
|
+
paramsDict.limit = params.limit;
|
|
318
|
+
}
|
|
319
|
+
const requestBody = { args: [outcomeId, paramsDict] };
|
|
320
|
+
const response = await this.api.fetchTrades({
|
|
321
|
+
exchange: this.exchangeName,
|
|
322
|
+
fetchTradesRequest: requestBody,
|
|
323
|
+
});
|
|
324
|
+
const data = this.handleResponse(response);
|
|
325
|
+
return data.map(convertTrade);
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
throw new Error(`Failed to fetch trades: ${error}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Trading Methods (require authentication)
|
|
332
|
+
/**
|
|
333
|
+
* Create a new order.
|
|
334
|
+
*
|
|
335
|
+
* @param params - Order parameters
|
|
336
|
+
* @returns Created order
|
|
337
|
+
*
|
|
338
|
+
* @example
|
|
339
|
+
* ```typescript
|
|
340
|
+
* const order = await exchange.createOrder({
|
|
341
|
+
* marketId: "663583",
|
|
342
|
+
* outcomeId: "10991849...",
|
|
343
|
+
* side: "buy",
|
|
344
|
+
* type: "limit",
|
|
345
|
+
* amount: 10,
|
|
346
|
+
* price: 0.55
|
|
347
|
+
* });
|
|
348
|
+
* ```
|
|
349
|
+
*/
|
|
350
|
+
async createOrder(params) {
|
|
351
|
+
try {
|
|
352
|
+
const paramsDict = {
|
|
353
|
+
marketId: params.marketId,
|
|
354
|
+
outcomeId: params.outcomeId,
|
|
355
|
+
side: params.side,
|
|
356
|
+
type: params.type,
|
|
357
|
+
amount: params.amount,
|
|
358
|
+
};
|
|
359
|
+
if (params.price !== undefined) {
|
|
360
|
+
paramsDict.price = params.price;
|
|
361
|
+
}
|
|
362
|
+
const requestBody = { args: [paramsDict] };
|
|
363
|
+
const response = await this.api.createOrder({
|
|
364
|
+
exchange: this.exchangeName,
|
|
365
|
+
createOrderRequest: requestBody,
|
|
366
|
+
});
|
|
367
|
+
const data = this.handleResponse(response);
|
|
368
|
+
return convertOrder(data);
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
throw new Error(`Failed to create order: ${error}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Cancel an open order.
|
|
376
|
+
*
|
|
377
|
+
* @param orderId - Order ID to cancel
|
|
378
|
+
* @returns Cancelled order
|
|
379
|
+
*/
|
|
380
|
+
async cancelOrder(orderId) {
|
|
381
|
+
try {
|
|
382
|
+
const requestBody = { args: [orderId] };
|
|
383
|
+
const response = await this.api.cancelOrder({
|
|
384
|
+
exchange: this.exchangeName,
|
|
385
|
+
cancelOrderRequest: requestBody,
|
|
386
|
+
});
|
|
387
|
+
const data = this.handleResponse(response);
|
|
388
|
+
return convertOrder(data);
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
throw new Error(`Failed to cancel order: ${error}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Get details of a specific order.
|
|
396
|
+
*
|
|
397
|
+
* @param orderId - Order ID
|
|
398
|
+
* @returns Order details
|
|
399
|
+
*/
|
|
400
|
+
async fetchOrder(orderId) {
|
|
401
|
+
try {
|
|
402
|
+
const requestBody = { args: [orderId] };
|
|
403
|
+
const response = await this.api.fetchOrder({
|
|
404
|
+
exchange: this.exchangeName,
|
|
405
|
+
cancelOrderRequest: requestBody,
|
|
406
|
+
});
|
|
407
|
+
const data = this.handleResponse(response);
|
|
408
|
+
return convertOrder(data);
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
throw new Error(`Failed to fetch order: ${error}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get all open orders, optionally filtered by market.
|
|
416
|
+
*
|
|
417
|
+
* @param marketId - Optional market ID to filter by
|
|
418
|
+
* @returns List of open orders
|
|
419
|
+
*/
|
|
420
|
+
async fetchOpenOrders(marketId) {
|
|
421
|
+
try {
|
|
422
|
+
const args = [];
|
|
423
|
+
if (marketId) {
|
|
424
|
+
args.push(marketId);
|
|
425
|
+
}
|
|
426
|
+
const requestBody = { args };
|
|
427
|
+
const response = await this.api.fetchOpenOrders({
|
|
428
|
+
exchange: this.exchangeName,
|
|
429
|
+
fetchOpenOrdersRequest: requestBody,
|
|
430
|
+
});
|
|
431
|
+
const data = this.handleResponse(response);
|
|
432
|
+
return data.map(convertOrder);
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
throw new Error(`Failed to fetch open orders: ${error}`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// Account Methods
|
|
439
|
+
/**
|
|
440
|
+
* Get current positions across all markets.
|
|
441
|
+
*
|
|
442
|
+
* @returns List of positions
|
|
443
|
+
*/
|
|
444
|
+
async fetchPositions() {
|
|
445
|
+
try {
|
|
446
|
+
const requestBody = { args: [] };
|
|
447
|
+
const response = await this.api.fetchPositions({
|
|
448
|
+
exchange: this.exchangeName,
|
|
449
|
+
fetchPositionsRequest: requestBody,
|
|
450
|
+
});
|
|
451
|
+
const data = this.handleResponse(response);
|
|
452
|
+
return data.map(convertPosition);
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
throw new Error(`Failed to fetch positions: ${error}`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Get account balance.
|
|
460
|
+
*
|
|
461
|
+
* @returns List of balances (by currency)
|
|
462
|
+
*/
|
|
463
|
+
async fetchBalance() {
|
|
464
|
+
try {
|
|
465
|
+
const requestBody = { args: [] };
|
|
466
|
+
const response = await this.api.fetchBalance({
|
|
467
|
+
exchange: this.exchangeName,
|
|
468
|
+
fetchPositionsRequest: requestBody,
|
|
469
|
+
});
|
|
470
|
+
const data = this.handleResponse(response);
|
|
471
|
+
return data.map(convertBalance);
|
|
472
|
+
}
|
|
473
|
+
catch (error) {
|
|
474
|
+
throw new Error(`Failed to fetch balance: ${error}`);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Polymarket exchange client.
|
|
480
|
+
*
|
|
481
|
+
* @example
|
|
482
|
+
* ```typescript
|
|
483
|
+
* // Public data (no auth)
|
|
484
|
+
* const poly = new Polymarket();
|
|
485
|
+
* const markets = await poly.searchMarkets("Trump");
|
|
486
|
+
*
|
|
487
|
+
* // Trading (requires auth)
|
|
488
|
+
* const poly = new Polymarket({ privateKey: process.env.POLYMARKET_PRIVATE_KEY });
|
|
489
|
+
* const balance = await poly.fetchBalance();
|
|
490
|
+
* ```
|
|
491
|
+
*/
|
|
492
|
+
export class Polymarket extends Exchange {
|
|
493
|
+
constructor(options = {}) {
|
|
494
|
+
super("polymarket", options);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Kalshi exchange client.
|
|
499
|
+
*
|
|
500
|
+
* @example
|
|
501
|
+
* ```typescript
|
|
502
|
+
* // Public data (no auth)
|
|
503
|
+
* const kalshi = new Kalshi();
|
|
504
|
+
* const markets = await kalshi.searchMarkets("Fed rates");
|
|
505
|
+
*
|
|
506
|
+
* // Trading (requires auth)
|
|
507
|
+
* const kalshi = new Kalshi({
|
|
508
|
+
* apiKey: process.env.KALSHI_API_KEY,
|
|
509
|
+
* privateKey: process.env.KALSHI_PRIVATE_KEY
|
|
510
|
+
* });
|
|
511
|
+
* const balance = await kalshi.fetchBalance();
|
|
512
|
+
* ```
|
|
513
|
+
*/
|
|
514
|
+
export class Kalshi extends Exchange {
|
|
515
|
+
constructor(options = {}) {
|
|
516
|
+
super("kalshi", options);
|
|
517
|
+
}
|
|
518
|
+
}
|