pmxt-core 1.2.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseExchange.d.ts +8 -1
- package/dist/BaseExchange.js +9 -0
- package/dist/exchanges/kalshi/index.d.ts +2 -1
- package/dist/exchanges/kalshi/index.js +4 -0
- package/dist/exchanges/kalshi/searchEvents.d.ts +3 -0
- package/dist/exchanges/kalshi/searchEvents.js +57 -0
- package/dist/exchanges/polymarket/index.d.ts +2 -1
- package/dist/exchanges/polymarket/index.js +4 -0
- package/dist/exchanges/polymarket/searchEvents.d.ts +3 -0
- package/dist/exchanges/polymarket/searchEvents.js +71 -0
- package/dist/types.d.ts +17 -0
- package/package.json +3 -3
package/dist/BaseExchange.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UnifiedMarket, PriceCandle, CandleInterval, OrderBook, Trade, Order, Position, Balance, CreateOrderParams } from './types';
|
|
1
|
+
import { UnifiedMarket, UnifiedEvent, PriceCandle, CandleInterval, OrderBook, Trade, Order, Position, Balance, CreateOrderParams } from './types';
|
|
2
2
|
export interface MarketFilterParams {
|
|
3
3
|
limit?: number;
|
|
4
4
|
offset?: number;
|
|
@@ -32,6 +32,13 @@ export declare abstract class PredictionMarketExchange {
|
|
|
32
32
|
* By default, searches only in market titles. Use params.searchIn to search descriptions or both.
|
|
33
33
|
*/
|
|
34
34
|
abstract searchMarkets(query: string, params?: MarketFilterParams): Promise<UnifiedMarket[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Search for events matching a keyword query.
|
|
37
|
+
* Returns grouped events, each containing related markets.
|
|
38
|
+
* @param query - Search term
|
|
39
|
+
* @param params - Optional filter parameters
|
|
40
|
+
*/
|
|
41
|
+
searchEvents(query: string, params?: MarketFilterParams): Promise<UnifiedEvent[]>;
|
|
35
42
|
/**
|
|
36
43
|
* Fetch historical price data for a specific market outcome.
|
|
37
44
|
* @param id - The Outcome ID (MarketOutcome.id). This should be the ID of the specific tradeable asset.
|
package/dist/BaseExchange.js
CHANGED
|
@@ -8,6 +8,15 @@ class PredictionMarketExchange {
|
|
|
8
8
|
constructor(credentials) {
|
|
9
9
|
this.credentials = credentials;
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Search for events matching a keyword query.
|
|
13
|
+
* Returns grouped events, each containing related markets.
|
|
14
|
+
* @param query - Search term
|
|
15
|
+
* @param params - Optional filter parameters
|
|
16
|
+
*/
|
|
17
|
+
async searchEvents(query, params) {
|
|
18
|
+
throw new Error("Method searchEvents not implemented.");
|
|
19
|
+
}
|
|
11
20
|
/**
|
|
12
21
|
* Fetch historical price data for a specific market outcome.
|
|
13
22
|
* @param id - The Outcome ID (MarketOutcome.id). This should be the ID of the specific tradeable asset.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams, ExchangeCredentials } from '../../BaseExchange';
|
|
2
|
-
import { UnifiedMarket, PriceCandle, OrderBook, Trade, Balance, Order, Position, CreateOrderParams } from '../../types';
|
|
2
|
+
import { UnifiedMarket, UnifiedEvent, PriceCandle, OrderBook, Trade, Balance, Order, Position, CreateOrderParams } from '../../types';
|
|
3
3
|
import { KalshiWebSocketConfig } from './websocket';
|
|
4
4
|
export { KalshiWebSocketConfig };
|
|
5
5
|
export interface KalshiExchangeOptions {
|
|
@@ -14,6 +14,7 @@ export declare class KalshiExchange extends PredictionMarketExchange {
|
|
|
14
14
|
private ensureAuth;
|
|
15
15
|
fetchMarkets(params?: MarketFilterParams): Promise<UnifiedMarket[]>;
|
|
16
16
|
searchMarkets(query: string, params?: MarketFilterParams): Promise<UnifiedMarket[]>;
|
|
17
|
+
searchEvents(query: string, params?: MarketFilterParams): Promise<UnifiedEvent[]>;
|
|
17
18
|
getMarketsBySlug(slug: string): Promise<UnifiedMarket[]>;
|
|
18
19
|
fetchOHLCV(id: string, params: HistoryFilterParams): Promise<PriceCandle[]>;
|
|
19
20
|
fetchOrderBook(id: string): Promise<OrderBook>;
|
|
@@ -8,6 +8,7 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
8
8
|
const BaseExchange_1 = require("../../BaseExchange");
|
|
9
9
|
const fetchMarkets_1 = require("./fetchMarkets");
|
|
10
10
|
const searchMarkets_1 = require("./searchMarkets");
|
|
11
|
+
const searchEvents_1 = require("./searchEvents");
|
|
11
12
|
const getMarketsBySlug_1 = require("./getMarketsBySlug");
|
|
12
13
|
const fetchOHLCV_1 = require("./fetchOHLCV");
|
|
13
14
|
const fetchOrderBook_1 = require("./fetchOrderBook");
|
|
@@ -56,6 +57,9 @@ class KalshiExchange extends BaseExchange_1.PredictionMarketExchange {
|
|
|
56
57
|
async searchMarkets(query, params) {
|
|
57
58
|
return (0, searchMarkets_1.searchMarkets)(query, params);
|
|
58
59
|
}
|
|
60
|
+
async searchEvents(query, params) {
|
|
61
|
+
return (0, searchEvents_1.searchEvents)(query, params);
|
|
62
|
+
}
|
|
59
63
|
async getMarketsBySlug(slug) {
|
|
60
64
|
return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
|
|
61
65
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.searchEvents = searchEvents;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
async function searchEvents(query, params) {
|
|
10
|
+
try {
|
|
11
|
+
const queryParams = {
|
|
12
|
+
limit: 200, // Reasonable batch for search
|
|
13
|
+
with_nested_markets: true,
|
|
14
|
+
status: 'open'
|
|
15
|
+
};
|
|
16
|
+
const response = await axios_1.default.get(utils_1.KALSHI_API_URL, { params: queryParams });
|
|
17
|
+
const events = response.data.events || [];
|
|
18
|
+
const lowerQuery = query.toLowerCase();
|
|
19
|
+
const filtered = events.filter((event) => {
|
|
20
|
+
return (event.title || '').toLowerCase().includes(lowerQuery);
|
|
21
|
+
});
|
|
22
|
+
const unifiedEvents = filtered.map((event) => {
|
|
23
|
+
const markets = [];
|
|
24
|
+
if (event.markets) {
|
|
25
|
+
for (const market of event.markets) {
|
|
26
|
+
const unifiedMarket = (0, utils_1.mapMarketToUnified)(event, market);
|
|
27
|
+
if (unifiedMarket) {
|
|
28
|
+
markets.push(unifiedMarket);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const unifiedEvent = {
|
|
33
|
+
id: event.event_ticker,
|
|
34
|
+
title: event.title,
|
|
35
|
+
description: event.mututals_description || "",
|
|
36
|
+
slug: event.event_ticker,
|
|
37
|
+
markets: markets,
|
|
38
|
+
url: `https://kalshi.com/events/${event.event_ticker}`,
|
|
39
|
+
image: event.image_url,
|
|
40
|
+
category: event.category,
|
|
41
|
+
tags: event.tags || [],
|
|
42
|
+
searchMarkets: function (marketQuery) {
|
|
43
|
+
const lowerMarketQuery = marketQuery.toLowerCase();
|
|
44
|
+
return this.markets.filter(m => m.title.toLowerCase().includes(lowerMarketQuery) ||
|
|
45
|
+
m.outcomes.some(o => o.label.toLowerCase().includes(lowerMarketQuery)));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return unifiedEvent;
|
|
49
|
+
});
|
|
50
|
+
const limit = params?.limit || 20;
|
|
51
|
+
return unifiedEvents.slice(0, limit);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error("Error searching Kalshi events:", error);
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PredictionMarketExchange, MarketFilterParams, HistoryFilterParams, ExchangeCredentials } from '../../BaseExchange';
|
|
2
|
-
import { UnifiedMarket, PriceCandle, OrderBook, Trade, Order, Position, Balance, CreateOrderParams } from '../../types';
|
|
2
|
+
import { UnifiedMarket, UnifiedEvent, PriceCandle, OrderBook, Trade, Order, Position, Balance, CreateOrderParams } from '../../types';
|
|
3
3
|
import { PolymarketWebSocketConfig } from './websocket';
|
|
4
4
|
export { PolymarketWebSocketConfig };
|
|
5
5
|
export interface PolymarketExchangeOptions {
|
|
@@ -13,6 +13,7 @@ export declare class PolymarketExchange extends PredictionMarketExchange {
|
|
|
13
13
|
get name(): string;
|
|
14
14
|
fetchMarkets(params?: MarketFilterParams): Promise<UnifiedMarket[]>;
|
|
15
15
|
searchMarkets(query: string, params?: MarketFilterParams): Promise<UnifiedMarket[]>;
|
|
16
|
+
searchEvents(query: string, params?: MarketFilterParams): Promise<UnifiedEvent[]>;
|
|
16
17
|
getMarketsBySlug(slug: string): Promise<UnifiedMarket[]>;
|
|
17
18
|
fetchOHLCV(id: string, params: HistoryFilterParams): Promise<PriceCandle[]>;
|
|
18
19
|
fetchOrderBook(id: string): Promise<OrderBook>;
|
|
@@ -4,6 +4,7 @@ exports.PolymarketExchange = void 0;
|
|
|
4
4
|
const BaseExchange_1 = require("../../BaseExchange");
|
|
5
5
|
const fetchMarkets_1 = require("./fetchMarkets");
|
|
6
6
|
const searchMarkets_1 = require("./searchMarkets");
|
|
7
|
+
const searchEvents_1 = require("./searchEvents");
|
|
7
8
|
const getMarketsBySlug_1 = require("./getMarketsBySlug");
|
|
8
9
|
const fetchOHLCV_1 = require("./fetchOHLCV");
|
|
9
10
|
const fetchOrderBook_1 = require("./fetchOrderBook");
|
|
@@ -42,6 +43,9 @@ class PolymarketExchange extends BaseExchange_1.PredictionMarketExchange {
|
|
|
42
43
|
async searchMarkets(query, params) {
|
|
43
44
|
return (0, searchMarkets_1.searchMarkets)(query, params);
|
|
44
45
|
}
|
|
46
|
+
async searchEvents(query, params) {
|
|
47
|
+
return (0, searchEvents_1.searchEvents)(query, params);
|
|
48
|
+
}
|
|
45
49
|
async getMarketsBySlug(slug) {
|
|
46
50
|
return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
|
|
47
51
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.searchEvents = searchEvents;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
async function searchEvents(query, params) {
|
|
10
|
+
const searchLimit = 100000; // Fetch all events for comprehensive search
|
|
11
|
+
try {
|
|
12
|
+
// Fetch events from Gamma API
|
|
13
|
+
const response = await axios_1.default.get(utils_1.GAMMA_API_URL, {
|
|
14
|
+
params: {
|
|
15
|
+
active: 'true',
|
|
16
|
+
closed: 'false',
|
|
17
|
+
limit: searchLimit
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
const events = response.data || [];
|
|
21
|
+
// Client-side text filtering
|
|
22
|
+
const lowerQuery = query.toLowerCase();
|
|
23
|
+
const searchIn = params?.searchIn || 'title';
|
|
24
|
+
const filtered = events.filter((event) => {
|
|
25
|
+
const titleMatch = (event.title || '').toLowerCase().includes(lowerQuery);
|
|
26
|
+
const descMatch = (event.description || '').toLowerCase().includes(lowerQuery);
|
|
27
|
+
if (searchIn === 'title')
|
|
28
|
+
return titleMatch;
|
|
29
|
+
if (searchIn === 'description')
|
|
30
|
+
return descMatch;
|
|
31
|
+
return titleMatch || descMatch;
|
|
32
|
+
});
|
|
33
|
+
// Map to UnifiedEvent
|
|
34
|
+
const unifiedEvents = filtered.map((event) => {
|
|
35
|
+
const markets = [];
|
|
36
|
+
if (event.markets) {
|
|
37
|
+
for (const market of event.markets) {
|
|
38
|
+
const unifiedMarket = (0, utils_1.mapMarketToUnified)(event, market, { useQuestionAsCandidateFallback: true });
|
|
39
|
+
if (unifiedMarket) {
|
|
40
|
+
markets.push(unifiedMarket);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const unifiedEvent = {
|
|
45
|
+
id: event.id || event.slug,
|
|
46
|
+
title: event.title,
|
|
47
|
+
description: event.description || '',
|
|
48
|
+
slug: event.slug,
|
|
49
|
+
markets: markets,
|
|
50
|
+
url: `https://polymarket.com/event/${event.slug}`,
|
|
51
|
+
image: event.image || `https://polymarket.com/api/og?slug=${event.slug}`,
|
|
52
|
+
category: event.category || event.tags?.[0]?.label,
|
|
53
|
+
tags: event.tags?.map((t) => t.label) || [],
|
|
54
|
+
searchMarkets: function (marketQuery) {
|
|
55
|
+
const lowerMarketQuery = marketQuery.toLowerCase();
|
|
56
|
+
return this.markets.filter(m => m.title.toLowerCase().includes(lowerMarketQuery) ||
|
|
57
|
+
m.description.toLowerCase().includes(lowerMarketQuery) ||
|
|
58
|
+
m.outcomes.some(o => o.label.toLowerCase().includes(lowerMarketQuery)));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return unifiedEvent;
|
|
62
|
+
});
|
|
63
|
+
// Apply limit to filtered results
|
|
64
|
+
const limit = params?.limit || 20;
|
|
65
|
+
return unifiedEvents.slice(0, limit);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error("Error searching Polymarket events:", error);
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,6 +5,23 @@ export interface MarketOutcome {
|
|
|
5
5
|
priceChange24h?: number;
|
|
6
6
|
metadata?: Record<string, any>;
|
|
7
7
|
}
|
|
8
|
+
export interface UnifiedEvent {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
description: string;
|
|
12
|
+
slug: string;
|
|
13
|
+
markets: UnifiedMarket[];
|
|
14
|
+
url: string;
|
|
15
|
+
image?: string;
|
|
16
|
+
category?: string;
|
|
17
|
+
tags?: string[];
|
|
18
|
+
/**
|
|
19
|
+
* Search for markets within this event by keyword.
|
|
20
|
+
* @param query - Search term to filter markets
|
|
21
|
+
* @returns Array of markets matching the query
|
|
22
|
+
*/
|
|
23
|
+
searchMarkets(query: string): UnifiedMarket[];
|
|
24
|
+
}
|
|
8
25
|
export interface UnifiedMarket {
|
|
9
26
|
id: string;
|
|
10
27
|
title: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmxt-core",
|
|
3
|
-
"version": "1.2
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "pmxt is a unified prediction market data API. The ccxt for prediction markets.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"test": "jest -c jest.config.js",
|
|
30
30
|
"server": "tsx watch src/server/index.ts",
|
|
31
31
|
"server:prod": "node dist/server/index.js",
|
|
32
|
-
"generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=1.2
|
|
33
|
-
"generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=1.2
|
|
32
|
+
"generate:sdk:python": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g python -o ../sdks/python/generated --package-name pmxt_internal --additional-properties=projectName=pmxt-internal,packageVersion=1.3.2,library=urllib3",
|
|
33
|
+
"generate:sdk:typescript": "npx @openapitools/openapi-generator-cli generate -i src/server/openapi.yaml -g typescript-fetch -o ../sdks/typescript/generated --additional-properties=npmName=pmxtjs,npmVersion=1.3.2,supportsES6=true,typescriptThreePlus=true",
|
|
34
34
|
"generate:docs": "node ../scripts/generate-api-docs.js",
|
|
35
35
|
"generate:sdk:all": "npm run generate:sdk:python && npm run generate:sdk:typescript && npm run generate:docs"
|
|
36
36
|
},
|