pmxt 1.4.1__py3-none-any.whl → 1.5.1__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 +3 -2
- pmxt/_server/server/bundled.js +871 -33
- pmxt/client.py +36 -0
- {pmxt-1.4.1.dist-info → pmxt-1.5.1.dist-info}/METADATA +1 -1
- {pmxt-1.4.1.dist-info → pmxt-1.5.1.dist-info}/RECORD +10 -10
- pmxt_internal/__init__.py +1 -1
- pmxt_internal/api_client.py +1 -1
- pmxt_internal/configuration.py +1 -1
- {pmxt-1.4.1.dist-info → pmxt-1.5.1.dist-info}/WHEEL +0 -0
- {pmxt-1.4.1.dist-info → pmxt-1.5.1.dist-info}/top_level.txt +0 -0
pmxt/__init__.py
CHANGED
|
@@ -16,7 +16,7 @@ Example:
|
|
|
16
16
|
>>> print(markets[0].title)
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
|
-
from .client import Polymarket, Kalshi, Exchange
|
|
19
|
+
from .client import Polymarket, Kalshi, Limitless, Exchange
|
|
20
20
|
from .server_manager import ServerManager
|
|
21
21
|
from .models import (
|
|
22
22
|
UnifiedMarket,
|
|
@@ -33,11 +33,12 @@ from .models import (
|
|
|
33
33
|
CreateOrderParams,
|
|
34
34
|
)
|
|
35
35
|
|
|
36
|
-
__version__ = "1.
|
|
36
|
+
__version__ = "1.5.1"
|
|
37
37
|
__all__ = [
|
|
38
38
|
# Exchanges
|
|
39
39
|
"Polymarket",
|
|
40
40
|
"Kalshi",
|
|
41
|
+
"Limitless",
|
|
41
42
|
"Exchange",
|
|
42
43
|
# Server Management
|
|
43
44
|
"ServerManager",
|
pmxt/_server/server/bundled.js
CHANGED
|
@@ -104839,6 +104839,798 @@ var require_polymarket = __commonJS({
|
|
|
104839
104839
|
throw new Error("Price is required for limit orders");
|
|
104840
104840
|
}
|
|
104841
104841
|
const price = params.price || (side === clob_client_1.Side.BUY ? 0.99 : 0.01);
|
|
104842
|
+
let tickSize;
|
|
104843
|
+
if (params.tickSize) {
|
|
104844
|
+
tickSize = params.tickSize.toString();
|
|
104845
|
+
} else {
|
|
104846
|
+
try {
|
|
104847
|
+
const orderBook = await this.fetchOrderBook(params.outcomeId);
|
|
104848
|
+
tickSize = this.inferTickSize(orderBook);
|
|
104849
|
+
} catch (error) {
|
|
104850
|
+
tickSize = "0.01";
|
|
104851
|
+
}
|
|
104852
|
+
}
|
|
104853
|
+
try {
|
|
104854
|
+
const response = await client.createAndPostOrder({
|
|
104855
|
+
tokenID: params.outcomeId,
|
|
104856
|
+
price,
|
|
104857
|
+
side,
|
|
104858
|
+
size: params.amount,
|
|
104859
|
+
feeRateBps: 0
|
|
104860
|
+
}, {
|
|
104861
|
+
tickSize
|
|
104862
|
+
});
|
|
104863
|
+
if (!response || !response.success) {
|
|
104864
|
+
throw new Error(response?.errorMsg || "Order placement failed");
|
|
104865
|
+
}
|
|
104866
|
+
return {
|
|
104867
|
+
id: response.orderID,
|
|
104868
|
+
marketId: params.marketId,
|
|
104869
|
+
outcomeId: params.outcomeId,
|
|
104870
|
+
side: params.side,
|
|
104871
|
+
type: params.type,
|
|
104872
|
+
price,
|
|
104873
|
+
amount: params.amount,
|
|
104874
|
+
status: "open",
|
|
104875
|
+
filled: 0,
|
|
104876
|
+
remaining: params.amount,
|
|
104877
|
+
timestamp: Date.now()
|
|
104878
|
+
};
|
|
104879
|
+
} catch (error) {
|
|
104880
|
+
throw error;
|
|
104881
|
+
}
|
|
104882
|
+
}
|
|
104883
|
+
/**
|
|
104884
|
+
* Infer the tick size from order book price levels.
|
|
104885
|
+
* Analyzes the decimal precision of existing orders to determine the market's tick size.
|
|
104886
|
+
*/
|
|
104887
|
+
inferTickSize(orderBook) {
|
|
104888
|
+
const allPrices = [
|
|
104889
|
+
...orderBook.bids.map((b) => b.price),
|
|
104890
|
+
...orderBook.asks.map((a) => a.price)
|
|
104891
|
+
];
|
|
104892
|
+
if (allPrices.length === 0) {
|
|
104893
|
+
return "0.01";
|
|
104894
|
+
}
|
|
104895
|
+
let minIncrement = 1;
|
|
104896
|
+
for (const price of allPrices) {
|
|
104897
|
+
const priceStr = price.toString();
|
|
104898
|
+
const decimalPart = priceStr.split(".")[1];
|
|
104899
|
+
if (decimalPart) {
|
|
104900
|
+
const decimals = decimalPart.length;
|
|
104901
|
+
const increment = Math.pow(10, -decimals);
|
|
104902
|
+
if (increment < minIncrement) {
|
|
104903
|
+
minIncrement = increment;
|
|
104904
|
+
}
|
|
104905
|
+
}
|
|
104906
|
+
}
|
|
104907
|
+
if (minIncrement >= 0.1)
|
|
104908
|
+
return "0.1";
|
|
104909
|
+
if (minIncrement >= 0.01)
|
|
104910
|
+
return "0.01";
|
|
104911
|
+
if (minIncrement >= 1e-3)
|
|
104912
|
+
return "0.001";
|
|
104913
|
+
return "0.0001";
|
|
104914
|
+
}
|
|
104915
|
+
async cancelOrder(orderId) {
|
|
104916
|
+
const auth = this.ensureAuth();
|
|
104917
|
+
const client = await auth.getClobClient();
|
|
104918
|
+
try {
|
|
104919
|
+
await client.cancelOrder({ orderID: orderId });
|
|
104920
|
+
return {
|
|
104921
|
+
id: orderId,
|
|
104922
|
+
marketId: "unknown",
|
|
104923
|
+
outcomeId: "unknown",
|
|
104924
|
+
side: "buy",
|
|
104925
|
+
type: "limit",
|
|
104926
|
+
amount: 0,
|
|
104927
|
+
status: "cancelled",
|
|
104928
|
+
filled: 0,
|
|
104929
|
+
remaining: 0,
|
|
104930
|
+
timestamp: Date.now()
|
|
104931
|
+
};
|
|
104932
|
+
} catch (error) {
|
|
104933
|
+
throw error;
|
|
104934
|
+
}
|
|
104935
|
+
}
|
|
104936
|
+
async fetchOrder(orderId) {
|
|
104937
|
+
const auth = this.ensureAuth();
|
|
104938
|
+
const client = await auth.getClobClient();
|
|
104939
|
+
try {
|
|
104940
|
+
const order = await client.getOrder(orderId);
|
|
104941
|
+
return {
|
|
104942
|
+
id: order.id,
|
|
104943
|
+
marketId: order.market || "unknown",
|
|
104944
|
+
outcomeId: order.asset_id,
|
|
104945
|
+
side: order.side.toLowerCase(),
|
|
104946
|
+
type: order.order_type === "GTC" ? "limit" : "market",
|
|
104947
|
+
price: parseFloat(order.price),
|
|
104948
|
+
amount: parseFloat(order.original_size),
|
|
104949
|
+
status: order.status,
|
|
104950
|
+
// Needs precise mapping
|
|
104951
|
+
filled: parseFloat(order.size_matched),
|
|
104952
|
+
remaining: parseFloat(order.original_size) - parseFloat(order.size_matched),
|
|
104953
|
+
timestamp: order.created_at * 1e3
|
|
104954
|
+
};
|
|
104955
|
+
} catch (error) {
|
|
104956
|
+
throw error;
|
|
104957
|
+
}
|
|
104958
|
+
}
|
|
104959
|
+
async fetchOpenOrders(marketId) {
|
|
104960
|
+
const auth = this.ensureAuth();
|
|
104961
|
+
const client = await auth.getClobClient();
|
|
104962
|
+
try {
|
|
104963
|
+
const orders = await client.getOpenOrders({
|
|
104964
|
+
market: marketId
|
|
104965
|
+
});
|
|
104966
|
+
return orders.map((o) => ({
|
|
104967
|
+
id: o.id,
|
|
104968
|
+
marketId: o.market || "unknown",
|
|
104969
|
+
outcomeId: o.asset_id,
|
|
104970
|
+
side: o.side.toLowerCase(),
|
|
104971
|
+
type: "limit",
|
|
104972
|
+
price: parseFloat(o.price),
|
|
104973
|
+
amount: parseFloat(o.original_size),
|
|
104974
|
+
status: "open",
|
|
104975
|
+
filled: parseFloat(o.size_matched),
|
|
104976
|
+
remaining: parseFloat(o.size_left || parseFloat(o.original_size) - parseFloat(o.size_matched)),
|
|
104977
|
+
timestamp: o.created_at * 1e3
|
|
104978
|
+
}));
|
|
104979
|
+
} catch (error) {
|
|
104980
|
+
console.error("Error fetching Polymarket open orders:", error);
|
|
104981
|
+
return [];
|
|
104982
|
+
}
|
|
104983
|
+
}
|
|
104984
|
+
async fetchPositions() {
|
|
104985
|
+
const auth = this.ensureAuth();
|
|
104986
|
+
const address = auth.getAddress();
|
|
104987
|
+
return (0, fetchPositions_1.fetchPositions)(address);
|
|
104988
|
+
}
|
|
104989
|
+
async fetchBalance() {
|
|
104990
|
+
const auth = this.ensureAuth();
|
|
104991
|
+
const client = await auth.getClobClient();
|
|
104992
|
+
try {
|
|
104993
|
+
const USDC_DECIMALS = 6;
|
|
104994
|
+
const balRes = await client.getBalanceAllowance({
|
|
104995
|
+
asset_type: clob_client_1.AssetType.COLLATERAL
|
|
104996
|
+
});
|
|
104997
|
+
const rawBalance = parseFloat(balRes.balance);
|
|
104998
|
+
const total = rawBalance / Math.pow(10, USDC_DECIMALS);
|
|
104999
|
+
const openOrders = await client.getOpenOrders({});
|
|
105000
|
+
let locked = 0;
|
|
105001
|
+
if (openOrders && Array.isArray(openOrders)) {
|
|
105002
|
+
for (const order of openOrders) {
|
|
105003
|
+
if (order.side === clob_client_1.Side.BUY) {
|
|
105004
|
+
const remainingSize = parseFloat(order.original_size) - parseFloat(order.size_matched);
|
|
105005
|
+
const price = parseFloat(order.price);
|
|
105006
|
+
locked += remainingSize * price;
|
|
105007
|
+
}
|
|
105008
|
+
}
|
|
105009
|
+
}
|
|
105010
|
+
return [{
|
|
105011
|
+
currency: "USDC",
|
|
105012
|
+
total,
|
|
105013
|
+
available: total - locked,
|
|
105014
|
+
// Available for new trades
|
|
105015
|
+
locked
|
|
105016
|
+
}];
|
|
105017
|
+
} catch (error) {
|
|
105018
|
+
throw error;
|
|
105019
|
+
}
|
|
105020
|
+
}
|
|
105021
|
+
async watchOrderBook(id, limit) {
|
|
105022
|
+
if (!this.ws) {
|
|
105023
|
+
this.ws = new websocket_1.PolymarketWebSocket(this.wsConfig);
|
|
105024
|
+
}
|
|
105025
|
+
return this.ws.watchOrderBook(id);
|
|
105026
|
+
}
|
|
105027
|
+
async watchTrades(id, since, limit) {
|
|
105028
|
+
if (!this.ws) {
|
|
105029
|
+
this.ws = new websocket_1.PolymarketWebSocket(this.wsConfig);
|
|
105030
|
+
}
|
|
105031
|
+
return this.ws.watchTrades(id);
|
|
105032
|
+
}
|
|
105033
|
+
async close() {
|
|
105034
|
+
if (this.ws) {
|
|
105035
|
+
this.ws.close();
|
|
105036
|
+
this.ws = void 0;
|
|
105037
|
+
}
|
|
105038
|
+
}
|
|
105039
|
+
};
|
|
105040
|
+
exports2.PolymarketExchange = PolymarketExchange;
|
|
105041
|
+
}
|
|
105042
|
+
});
|
|
105043
|
+
|
|
105044
|
+
// dist/exchanges/limitless/utils.js
|
|
105045
|
+
var require_utils10 = __commonJS({
|
|
105046
|
+
"dist/exchanges/limitless/utils.js"(exports2) {
|
|
105047
|
+
"use strict";
|
|
105048
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105049
|
+
exports2.LIMITLESS_API_URL = void 0;
|
|
105050
|
+
exports2.mapMarketToUnified = mapMarketToUnified;
|
|
105051
|
+
exports2.mapIntervalToFidelity = mapIntervalToFidelity;
|
|
105052
|
+
var market_utils_1 = require_market_utils();
|
|
105053
|
+
exports2.LIMITLESS_API_URL = "https://api.limitless.exchange";
|
|
105054
|
+
function mapMarketToUnified(market) {
|
|
105055
|
+
if (!market)
|
|
105056
|
+
return null;
|
|
105057
|
+
const outcomes = [];
|
|
105058
|
+
if (market.tokens && market.prices) {
|
|
105059
|
+
const tokenEntries = Object.entries(market.tokens);
|
|
105060
|
+
tokenEntries.forEach(([label, tokenId], index) => {
|
|
105061
|
+
const outcomePrice = market.prices[index] || 0;
|
|
105062
|
+
outcomes.push({
|
|
105063
|
+
id: tokenId,
|
|
105064
|
+
label: label.charAt(0).toUpperCase() + label.slice(1),
|
|
105065
|
+
// Capitalize 'yes'/'no'
|
|
105066
|
+
price: outcomePrice,
|
|
105067
|
+
priceChange24h: 0,
|
|
105068
|
+
// Not directly available in this flat list, can be computed if needed
|
|
105069
|
+
metadata: {
|
|
105070
|
+
clobTokenId: tokenId
|
|
105071
|
+
}
|
|
105072
|
+
});
|
|
105073
|
+
});
|
|
105074
|
+
}
|
|
105075
|
+
const um = {
|
|
105076
|
+
id: market.slug,
|
|
105077
|
+
title: market.title || market.question,
|
|
105078
|
+
description: market.description,
|
|
105079
|
+
outcomes,
|
|
105080
|
+
resolutionDate: market.expirationTimestamp ? new Date(market.expirationTimestamp) : /* @__PURE__ */ new Date(),
|
|
105081
|
+
volume24h: Number(market.volumeFormatted || 0),
|
|
105082
|
+
volume: Number(market.volume || 0),
|
|
105083
|
+
liquidity: 0,
|
|
105084
|
+
// Not directly in the flat market list
|
|
105085
|
+
openInterest: 0,
|
|
105086
|
+
// Not directly in the flat market list
|
|
105087
|
+
url: `https://limitless.exchange/markets/${market.slug}`,
|
|
105088
|
+
image: market.logo || `https://limitless.exchange/api/og?slug=${market.slug}`,
|
|
105089
|
+
category: market.categories?.[0],
|
|
105090
|
+
tags: market.tags || []
|
|
105091
|
+
};
|
|
105092
|
+
(0, market_utils_1.addBinaryOutcomes)(um);
|
|
105093
|
+
return um;
|
|
105094
|
+
}
|
|
105095
|
+
function mapIntervalToFidelity(interval) {
|
|
105096
|
+
const mapping = {
|
|
105097
|
+
"1m": 1,
|
|
105098
|
+
"5m": 5,
|
|
105099
|
+
"15m": 15,
|
|
105100
|
+
"1h": 60,
|
|
105101
|
+
"6h": 360,
|
|
105102
|
+
"1d": 1440
|
|
105103
|
+
};
|
|
105104
|
+
return mapping[interval];
|
|
105105
|
+
}
|
|
105106
|
+
}
|
|
105107
|
+
});
|
|
105108
|
+
|
|
105109
|
+
// dist/exchanges/limitless/fetchMarkets.js
|
|
105110
|
+
var require_fetchMarkets2 = __commonJS({
|
|
105111
|
+
"dist/exchanges/limitless/fetchMarkets.js"(exports2) {
|
|
105112
|
+
"use strict";
|
|
105113
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105114
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105115
|
+
};
|
|
105116
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105117
|
+
exports2.fetchMarkets = fetchMarkets;
|
|
105118
|
+
var axios_1 = __importDefault(require_axios());
|
|
105119
|
+
var utils_1 = require_utils10();
|
|
105120
|
+
async function fetchMarkets(params) {
|
|
105121
|
+
const limit = params?.limit || 200;
|
|
105122
|
+
const offset = params?.offset || 0;
|
|
105123
|
+
const url2 = `${utils_1.LIMITLESS_API_URL}/markets/active`;
|
|
105124
|
+
try {
|
|
105125
|
+
const response = await axios_1.default.get(url2);
|
|
105126
|
+
const markets = response.data?.data || response.data;
|
|
105127
|
+
if (!markets || !Array.isArray(markets)) {
|
|
105128
|
+
return [];
|
|
105129
|
+
}
|
|
105130
|
+
const unifiedMarkets = [];
|
|
105131
|
+
for (const market of markets) {
|
|
105132
|
+
const unifiedMarket = (0, utils_1.mapMarketToUnified)(market);
|
|
105133
|
+
if (unifiedMarket) {
|
|
105134
|
+
unifiedMarkets.push(unifiedMarket);
|
|
105135
|
+
}
|
|
105136
|
+
}
|
|
105137
|
+
if (params?.sort === "volume") {
|
|
105138
|
+
unifiedMarkets.sort((a, b) => (b.volume ?? 0) - (a.volume ?? 0));
|
|
105139
|
+
} else {
|
|
105140
|
+
unifiedMarkets.sort((a, b) => (b.volume ?? 0) - (a.volume ?? 0));
|
|
105141
|
+
}
|
|
105142
|
+
return unifiedMarkets.slice(offset, offset + limit);
|
|
105143
|
+
} catch (error) {
|
|
105144
|
+
console.error("Error fetching Limitless markets:", error.message);
|
|
105145
|
+
return [];
|
|
105146
|
+
}
|
|
105147
|
+
}
|
|
105148
|
+
}
|
|
105149
|
+
});
|
|
105150
|
+
|
|
105151
|
+
// dist/exchanges/limitless/searchMarkets.js
|
|
105152
|
+
var require_searchMarkets2 = __commonJS({
|
|
105153
|
+
"dist/exchanges/limitless/searchMarkets.js"(exports2) {
|
|
105154
|
+
"use strict";
|
|
105155
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105156
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105157
|
+
};
|
|
105158
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105159
|
+
exports2.searchMarkets = searchMarkets;
|
|
105160
|
+
var axios_1 = __importDefault(require_axios());
|
|
105161
|
+
var utils_1 = require_utils10();
|
|
105162
|
+
async function searchMarkets(query, params) {
|
|
105163
|
+
try {
|
|
105164
|
+
const response = await axios_1.default.get(`${utils_1.LIMITLESS_API_URL}/markets/search`, {
|
|
105165
|
+
params: {
|
|
105166
|
+
query,
|
|
105167
|
+
limit: params?.limit || 20
|
|
105168
|
+
}
|
|
105169
|
+
});
|
|
105170
|
+
const markets = response.data?.markets || [];
|
|
105171
|
+
return markets.map((m) => (0, utils_1.mapMarketToUnified)(m)).filter((m) => m !== null).slice(0, params?.limit || 20);
|
|
105172
|
+
} catch (error) {
|
|
105173
|
+
console.error("Error searching Limitless data:", error.message);
|
|
105174
|
+
return [];
|
|
105175
|
+
}
|
|
105176
|
+
}
|
|
105177
|
+
}
|
|
105178
|
+
});
|
|
105179
|
+
|
|
105180
|
+
// dist/exchanges/limitless/searchEvents.js
|
|
105181
|
+
var require_searchEvents2 = __commonJS({
|
|
105182
|
+
"dist/exchanges/limitless/searchEvents.js"(exports2) {
|
|
105183
|
+
"use strict";
|
|
105184
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105185
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105186
|
+
};
|
|
105187
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105188
|
+
exports2.searchEvents = searchEvents;
|
|
105189
|
+
var axios_1 = __importDefault(require_axios());
|
|
105190
|
+
var utils_1 = require_utils10();
|
|
105191
|
+
async function searchEvents(query, params) {
|
|
105192
|
+
try {
|
|
105193
|
+
const response = await axios_1.default.get(`${utils_1.LIMITLESS_API_URL}/markets/search`, {
|
|
105194
|
+
params: {
|
|
105195
|
+
query,
|
|
105196
|
+
limit: params?.limit || 20
|
|
105197
|
+
}
|
|
105198
|
+
});
|
|
105199
|
+
const markets = response.data?.markets || [];
|
|
105200
|
+
return markets.map((market) => {
|
|
105201
|
+
const unifiedMarket = (0, utils_1.mapMarketToUnified)(market);
|
|
105202
|
+
const marketsList = unifiedMarket ? [unifiedMarket] : [];
|
|
105203
|
+
return {
|
|
105204
|
+
id: market.slug,
|
|
105205
|
+
title: market.title || market.question,
|
|
105206
|
+
description: market.description || "",
|
|
105207
|
+
slug: market.slug,
|
|
105208
|
+
markets: marketsList,
|
|
105209
|
+
url: `https://limitless.exchange/markets/${market.slug}`,
|
|
105210
|
+
image: market.logo || `https://limitless.exchange/api/og?slug=${market.slug}`,
|
|
105211
|
+
category: market.categories?.[0],
|
|
105212
|
+
tags: market.tags || [],
|
|
105213
|
+
searchMarkets: function(marketQuery) {
|
|
105214
|
+
const lowerMarketQuery = marketQuery.toLowerCase();
|
|
105215
|
+
return this.markets.filter((m) => m.title.toLowerCase().includes(lowerMarketQuery) || m.description.toLowerCase().includes(lowerMarketQuery));
|
|
105216
|
+
}
|
|
105217
|
+
};
|
|
105218
|
+
});
|
|
105219
|
+
} catch (error) {
|
|
105220
|
+
console.error("Error searching Limitless events:", error.message);
|
|
105221
|
+
return [];
|
|
105222
|
+
}
|
|
105223
|
+
}
|
|
105224
|
+
}
|
|
105225
|
+
});
|
|
105226
|
+
|
|
105227
|
+
// dist/exchanges/limitless/getMarketsBySlug.js
|
|
105228
|
+
var require_getMarketsBySlug2 = __commonJS({
|
|
105229
|
+
"dist/exchanges/limitless/getMarketsBySlug.js"(exports2) {
|
|
105230
|
+
"use strict";
|
|
105231
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105232
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105233
|
+
};
|
|
105234
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105235
|
+
exports2.getMarketsBySlug = getMarketsBySlug;
|
|
105236
|
+
var axios_1 = __importDefault(require_axios());
|
|
105237
|
+
var utils_1 = require_utils10();
|
|
105238
|
+
async function getMarketsBySlug(slug) {
|
|
105239
|
+
try {
|
|
105240
|
+
const response = await axios_1.default.get(`${utils_1.LIMITLESS_API_URL}/markets/${slug}`);
|
|
105241
|
+
const market = response.data;
|
|
105242
|
+
if (!market)
|
|
105243
|
+
return [];
|
|
105244
|
+
const unifiedMarket = (0, utils_1.mapMarketToUnified)(market);
|
|
105245
|
+
return unifiedMarket ? [unifiedMarket] : [];
|
|
105246
|
+
} catch (error) {
|
|
105247
|
+
console.error(`Error fetching Limitless slug ${slug}:`, error.message);
|
|
105248
|
+
return [];
|
|
105249
|
+
}
|
|
105250
|
+
}
|
|
105251
|
+
}
|
|
105252
|
+
});
|
|
105253
|
+
|
|
105254
|
+
// dist/exchanges/limitless/fetchOHLCV.js
|
|
105255
|
+
var require_fetchOHLCV2 = __commonJS({
|
|
105256
|
+
"dist/exchanges/limitless/fetchOHLCV.js"(exports2) {
|
|
105257
|
+
"use strict";
|
|
105258
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105259
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105260
|
+
};
|
|
105261
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105262
|
+
exports2.fetchOHLCV = fetchOHLCV;
|
|
105263
|
+
var axios_1 = __importDefault(require_axios());
|
|
105264
|
+
var utils_1 = require_utils10();
|
|
105265
|
+
async function fetchOHLCV(id, params) {
|
|
105266
|
+
try {
|
|
105267
|
+
const fidelity = (0, utils_1.mapIntervalToFidelity)(params.resolution);
|
|
105268
|
+
const url2 = `${utils_1.LIMITLESS_API_URL}/markets/${id}/historical-price`;
|
|
105269
|
+
const response = await axios_1.default.get(url2, {
|
|
105270
|
+
params: { fidelity }
|
|
105271
|
+
});
|
|
105272
|
+
const data = response.data;
|
|
105273
|
+
const prices = data.prices || [];
|
|
105274
|
+
let candles = prices.map((p) => {
|
|
105275
|
+
const price = Number(p.price);
|
|
105276
|
+
const ts = Number(p.timestamp);
|
|
105277
|
+
return {
|
|
105278
|
+
timestamp: ts,
|
|
105279
|
+
open: price,
|
|
105280
|
+
high: price,
|
|
105281
|
+
low: price,
|
|
105282
|
+
close: price,
|
|
105283
|
+
volume: 0
|
|
105284
|
+
// Volume not provided in this specific endpoint
|
|
105285
|
+
};
|
|
105286
|
+
}).sort((a, b) => a.timestamp - b.timestamp);
|
|
105287
|
+
if (params.start) {
|
|
105288
|
+
candles = candles.filter((c) => c.timestamp >= params.start.getTime());
|
|
105289
|
+
}
|
|
105290
|
+
if (params.end) {
|
|
105291
|
+
candles = candles.filter((c) => c.timestamp <= params.end.getTime());
|
|
105292
|
+
}
|
|
105293
|
+
if (params.limit) {
|
|
105294
|
+
candles = candles.slice(0, params.limit);
|
|
105295
|
+
}
|
|
105296
|
+
return candles;
|
|
105297
|
+
} catch (error) {
|
|
105298
|
+
console.error(`Error fetching Limitless history for ${id}:`, error.message);
|
|
105299
|
+
return [];
|
|
105300
|
+
}
|
|
105301
|
+
}
|
|
105302
|
+
}
|
|
105303
|
+
});
|
|
105304
|
+
|
|
105305
|
+
// dist/exchanges/limitless/fetchOrderBook.js
|
|
105306
|
+
var require_fetchOrderBook2 = __commonJS({
|
|
105307
|
+
"dist/exchanges/limitless/fetchOrderBook.js"(exports2) {
|
|
105308
|
+
"use strict";
|
|
105309
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105310
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105311
|
+
};
|
|
105312
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105313
|
+
exports2.fetchOrderBook = fetchOrderBook;
|
|
105314
|
+
var axios_1 = __importDefault(require_axios());
|
|
105315
|
+
var utils_1 = require_utils10();
|
|
105316
|
+
async function fetchOrderBook(id) {
|
|
105317
|
+
try {
|
|
105318
|
+
const url2 = `${utils_1.LIMITLESS_API_URL}/markets/${id}/orderbook`;
|
|
105319
|
+
const response = await axios_1.default.get(url2);
|
|
105320
|
+
const data = response.data;
|
|
105321
|
+
const bids = (data.bids || []).map((level) => ({
|
|
105322
|
+
price: parseFloat(level.price),
|
|
105323
|
+
size: parseFloat(level.size)
|
|
105324
|
+
})).sort((a, b) => b.price - a.price);
|
|
105325
|
+
const asks = (data.asks || []).map((level) => ({
|
|
105326
|
+
price: parseFloat(level.price),
|
|
105327
|
+
size: parseFloat(level.size)
|
|
105328
|
+
})).sort((a, b) => a.price - b.price);
|
|
105329
|
+
return {
|
|
105330
|
+
bids,
|
|
105331
|
+
asks,
|
|
105332
|
+
timestamp: Date.now()
|
|
105333
|
+
// API doesn't seem to return a specific timestamp in the root anymore
|
|
105334
|
+
};
|
|
105335
|
+
} catch (error) {
|
|
105336
|
+
console.error(`Error fetching Limitless orderbook for ${id}:`, error.message);
|
|
105337
|
+
return { bids: [], asks: [] };
|
|
105338
|
+
}
|
|
105339
|
+
}
|
|
105340
|
+
}
|
|
105341
|
+
});
|
|
105342
|
+
|
|
105343
|
+
// dist/exchanges/limitless/fetchTrades.js
|
|
105344
|
+
var require_fetchTrades2 = __commonJS({
|
|
105345
|
+
"dist/exchanges/limitless/fetchTrades.js"(exports2) {
|
|
105346
|
+
"use strict";
|
|
105347
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105348
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105349
|
+
};
|
|
105350
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105351
|
+
exports2.fetchTrades = fetchTrades;
|
|
105352
|
+
var axios_1 = __importDefault(require_axios());
|
|
105353
|
+
var utils_1 = require_utils10();
|
|
105354
|
+
async function fetchTrades(id, params) {
|
|
105355
|
+
try {
|
|
105356
|
+
const url2 = `${utils_1.LIMITLESS_API_URL}/portfolio/trades`;
|
|
105357
|
+
const requestParams = {
|
|
105358
|
+
limit: params.limit || 100
|
|
105359
|
+
};
|
|
105360
|
+
if (params.start) {
|
|
105361
|
+
requestParams.after = Math.floor(params.start.getTime() / 1e3);
|
|
105362
|
+
}
|
|
105363
|
+
if (params.end) {
|
|
105364
|
+
requestParams.before = Math.floor(params.end.getTime() / 1e3);
|
|
105365
|
+
}
|
|
105366
|
+
const response = await axios_1.default.get(url2, {
|
|
105367
|
+
params: requestParams
|
|
105368
|
+
});
|
|
105369
|
+
const tradesData = response.data?.data || response.data || [];
|
|
105370
|
+
let trades = tradesData.map((trade) => {
|
|
105371
|
+
const price = parseFloat(trade.price);
|
|
105372
|
+
const timestamp = Number(trade.timestamp);
|
|
105373
|
+
let side = "unknown";
|
|
105374
|
+
const rawSide = trade.side?.toLowerCase();
|
|
105375
|
+
if (rawSide === "buy")
|
|
105376
|
+
side = "buy";
|
|
105377
|
+
else if (rawSide === "sell")
|
|
105378
|
+
side = "sell";
|
|
105379
|
+
return {
|
|
105380
|
+
id: trade.id || `${timestamp}-${price}`,
|
|
105381
|
+
timestamp: timestamp * 1e3,
|
|
105382
|
+
price,
|
|
105383
|
+
amount: parseFloat(trade.size || trade.amount || 0),
|
|
105384
|
+
side
|
|
105385
|
+
};
|
|
105386
|
+
});
|
|
105387
|
+
trades.sort((a, b) => b.timestamp - a.timestamp);
|
|
105388
|
+
if (params.limit) {
|
|
105389
|
+
trades = trades.slice(0, params.limit);
|
|
105390
|
+
}
|
|
105391
|
+
return trades;
|
|
105392
|
+
} catch (error) {
|
|
105393
|
+
console.error(`Error fetching Limitless trades for ${id}:`, error.message);
|
|
105394
|
+
return [];
|
|
105395
|
+
}
|
|
105396
|
+
}
|
|
105397
|
+
}
|
|
105398
|
+
});
|
|
105399
|
+
|
|
105400
|
+
// dist/exchanges/limitless/fetchPositions.js
|
|
105401
|
+
var require_fetchPositions2 = __commonJS({
|
|
105402
|
+
"dist/exchanges/limitless/fetchPositions.js"(exports2) {
|
|
105403
|
+
"use strict";
|
|
105404
|
+
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
105405
|
+
return mod && mod.__esModule ? mod : { "default": mod };
|
|
105406
|
+
};
|
|
105407
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105408
|
+
exports2.fetchPositions = fetchPositions;
|
|
105409
|
+
var axios_1 = __importDefault(require_axios());
|
|
105410
|
+
var utils_1 = require_utils10();
|
|
105411
|
+
async function fetchPositions(userAddress) {
|
|
105412
|
+
try {
|
|
105413
|
+
const url2 = `${utils_1.LIMITLESS_API_URL}/portfolio/${userAddress}/positions`;
|
|
105414
|
+
const response = await axios_1.default.get(url2);
|
|
105415
|
+
const data = response.data?.data || response.data || [];
|
|
105416
|
+
return data.map((p) => ({
|
|
105417
|
+
marketId: p.market?.slug || p.conditionId,
|
|
105418
|
+
outcomeId: p.asset,
|
|
105419
|
+
outcomeLabel: p.outcome || "Unknown",
|
|
105420
|
+
size: parseFloat(p.size || "0"),
|
|
105421
|
+
entryPrice: parseFloat(p.avgPrice || "0"),
|
|
105422
|
+
currentPrice: parseFloat(p.curPrice || "0"),
|
|
105423
|
+
unrealizedPnL: parseFloat(p.cashPnl || "0"),
|
|
105424
|
+
realizedPnL: parseFloat(p.realizedPnl || "0")
|
|
105425
|
+
}));
|
|
105426
|
+
} catch (error) {
|
|
105427
|
+
if (error.response?.status === 404) {
|
|
105428
|
+
return [];
|
|
105429
|
+
}
|
|
105430
|
+
console.error(`Error fetching Limitless positions: ${error.message}`);
|
|
105431
|
+
return [];
|
|
105432
|
+
}
|
|
105433
|
+
}
|
|
105434
|
+
}
|
|
105435
|
+
});
|
|
105436
|
+
|
|
105437
|
+
// dist/exchanges/limitless/auth.js
|
|
105438
|
+
var require_auth2 = __commonJS({
|
|
105439
|
+
"dist/exchanges/limitless/auth.js"(exports2) {
|
|
105440
|
+
"use strict";
|
|
105441
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105442
|
+
exports2.LimitlessAuth = void 0;
|
|
105443
|
+
var clob_client_1 = (init_dist2(), __toCommonJS(dist_exports));
|
|
105444
|
+
var ethers_1 = require_lib36();
|
|
105445
|
+
var LIMITLESS_HOST = "https://api.limitless.exchange";
|
|
105446
|
+
var BASE_CHAIN_ID = 8453;
|
|
105447
|
+
var LimitlessAuth = class {
|
|
105448
|
+
constructor(credentials) {
|
|
105449
|
+
this.credentials = credentials;
|
|
105450
|
+
if (!credentials.privateKey) {
|
|
105451
|
+
throw new Error("Limitless requires a privateKey for authentication");
|
|
105452
|
+
}
|
|
105453
|
+
this.signer = new ethers_1.Wallet(credentials.privateKey);
|
|
105454
|
+
}
|
|
105455
|
+
/**
|
|
105456
|
+
* Get or create API credentials using L1 authentication.
|
|
105457
|
+
* This uses the private key to derive/create API credentials.
|
|
105458
|
+
*/
|
|
105459
|
+
async getApiCredentials() {
|
|
105460
|
+
if (this.apiCreds) {
|
|
105461
|
+
return this.apiCreds;
|
|
105462
|
+
}
|
|
105463
|
+
if (this.credentials.apiKey && this.credentials.apiSecret && this.credentials.passphrase) {
|
|
105464
|
+
this.apiCreds = {
|
|
105465
|
+
key: this.credentials.apiKey,
|
|
105466
|
+
secret: this.credentials.apiSecret,
|
|
105467
|
+
passphrase: this.credentials.passphrase
|
|
105468
|
+
};
|
|
105469
|
+
return this.apiCreds;
|
|
105470
|
+
}
|
|
105471
|
+
const l1Client = new clob_client_1.ClobClient(LIMITLESS_HOST, BASE_CHAIN_ID, this.signer);
|
|
105472
|
+
let creds;
|
|
105473
|
+
try {
|
|
105474
|
+
creds = await l1Client.deriveApiKey();
|
|
105475
|
+
} catch (deriveError) {
|
|
105476
|
+
try {
|
|
105477
|
+
creds = await l1Client.createApiKey();
|
|
105478
|
+
} catch (createError) {
|
|
105479
|
+
console.error("Failed to both derive and create API key:", createError?.message || createError);
|
|
105480
|
+
throw new Error("Authentication failed: Could not create or derive API key.");
|
|
105481
|
+
}
|
|
105482
|
+
}
|
|
105483
|
+
if (!creds) {
|
|
105484
|
+
throw new Error("Authentication failed: Credentials are empty.");
|
|
105485
|
+
}
|
|
105486
|
+
this.apiCreds = creds;
|
|
105487
|
+
return creds;
|
|
105488
|
+
}
|
|
105489
|
+
/**
|
|
105490
|
+
* Get an authenticated CLOB client for L2 operations (trading).
|
|
105491
|
+
* This client can place orders, cancel orders, query positions, etc.
|
|
105492
|
+
*/
|
|
105493
|
+
async getClobClient() {
|
|
105494
|
+
if (this.clobClient) {
|
|
105495
|
+
return this.clobClient;
|
|
105496
|
+
}
|
|
105497
|
+
const apiCreds = await this.getApiCredentials();
|
|
105498
|
+
const signatureType = this.credentials.signatureType ?? 0;
|
|
105499
|
+
const funderAddress = this.credentials.funderAddress ?? this.signer.address;
|
|
105500
|
+
this.clobClient = new clob_client_1.ClobClient(LIMITLESS_HOST, BASE_CHAIN_ID, this.signer, apiCreds, signatureType, funderAddress);
|
|
105501
|
+
return this.clobClient;
|
|
105502
|
+
}
|
|
105503
|
+
/**
|
|
105504
|
+
* Get the signer's address.
|
|
105505
|
+
*/
|
|
105506
|
+
getAddress() {
|
|
105507
|
+
return this.signer.address;
|
|
105508
|
+
}
|
|
105509
|
+
/**
|
|
105510
|
+
* Reset cached credentials and client (useful for testing or credential rotation).
|
|
105511
|
+
*/
|
|
105512
|
+
reset() {
|
|
105513
|
+
this.apiCreds = void 0;
|
|
105514
|
+
this.clobClient = void 0;
|
|
105515
|
+
}
|
|
105516
|
+
};
|
|
105517
|
+
exports2.LimitlessAuth = LimitlessAuth;
|
|
105518
|
+
}
|
|
105519
|
+
});
|
|
105520
|
+
|
|
105521
|
+
// dist/exchanges/limitless/websocket.js
|
|
105522
|
+
var require_websocket4 = __commonJS({
|
|
105523
|
+
"dist/exchanges/limitless/websocket.js"(exports2) {
|
|
105524
|
+
"use strict";
|
|
105525
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105526
|
+
exports2.LimitlessWebSocket = void 0;
|
|
105527
|
+
var LimitlessWebSocket = class {
|
|
105528
|
+
constructor(_config = {}) {
|
|
105529
|
+
}
|
|
105530
|
+
async watchOrderBook(_id) {
|
|
105531
|
+
throw new Error("Limitless WebSocket (watchOrderBook) is currently unavailable. The Limitless API v1 does not provide a public WebSocket endpoint for real-time updates. Please use fetchOrderBook() for polling instead.");
|
|
105532
|
+
}
|
|
105533
|
+
async watchTrades(_id) {
|
|
105534
|
+
throw new Error("Limitless WebSocket (watchTrades) is currently unavailable. The Limitless API v1 does not provide a public WebSocket endpoint for real-time updates. Please use fetchOHLCV() or fetchOrderBook() for recent activity instead.");
|
|
105535
|
+
}
|
|
105536
|
+
async close() {
|
|
105537
|
+
}
|
|
105538
|
+
};
|
|
105539
|
+
exports2.LimitlessWebSocket = LimitlessWebSocket;
|
|
105540
|
+
}
|
|
105541
|
+
});
|
|
105542
|
+
|
|
105543
|
+
// dist/exchanges/limitless/index.js
|
|
105544
|
+
var require_limitless = __commonJS({
|
|
105545
|
+
"dist/exchanges/limitless/index.js"(exports2) {
|
|
105546
|
+
"use strict";
|
|
105547
|
+
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105548
|
+
exports2.LimitlessExchange = void 0;
|
|
105549
|
+
var BaseExchange_1 = require_BaseExchange();
|
|
105550
|
+
var fetchMarkets_1 = require_fetchMarkets2();
|
|
105551
|
+
var searchMarkets_1 = require_searchMarkets2();
|
|
105552
|
+
var searchEvents_1 = require_searchEvents2();
|
|
105553
|
+
var getMarketsBySlug_1 = require_getMarketsBySlug2();
|
|
105554
|
+
var fetchOHLCV_1 = require_fetchOHLCV2();
|
|
105555
|
+
var fetchOrderBook_1 = require_fetchOrderBook2();
|
|
105556
|
+
var fetchTrades_1 = require_fetchTrades2();
|
|
105557
|
+
var fetchPositions_1 = require_fetchPositions2();
|
|
105558
|
+
var auth_1 = require_auth2();
|
|
105559
|
+
var clob_client_1 = (init_dist2(), __toCommonJS(dist_exports));
|
|
105560
|
+
var websocket_1 = require_websocket4();
|
|
105561
|
+
var LimitlessExchange = class extends BaseExchange_1.PredictionMarketExchange {
|
|
105562
|
+
constructor(options) {
|
|
105563
|
+
let credentials;
|
|
105564
|
+
let wsConfig;
|
|
105565
|
+
if (options && "credentials" in options) {
|
|
105566
|
+
credentials = options.credentials;
|
|
105567
|
+
wsConfig = options.websocket;
|
|
105568
|
+
} else if (options && "privateKey" in options) {
|
|
105569
|
+
credentials = options;
|
|
105570
|
+
} else {
|
|
105571
|
+
credentials = options;
|
|
105572
|
+
}
|
|
105573
|
+
super(credentials);
|
|
105574
|
+
this.wsConfig = wsConfig;
|
|
105575
|
+
if (credentials?.privateKey) {
|
|
105576
|
+
this.auth = new auth_1.LimitlessAuth(credentials);
|
|
105577
|
+
}
|
|
105578
|
+
}
|
|
105579
|
+
get name() {
|
|
105580
|
+
return "Limitless";
|
|
105581
|
+
}
|
|
105582
|
+
async fetchMarkets(params) {
|
|
105583
|
+
return (0, fetchMarkets_1.fetchMarkets)(params);
|
|
105584
|
+
}
|
|
105585
|
+
async searchMarkets(query, params) {
|
|
105586
|
+
return (0, searchMarkets_1.searchMarkets)(query, params);
|
|
105587
|
+
}
|
|
105588
|
+
async searchEvents(query, params) {
|
|
105589
|
+
return (0, searchEvents_1.searchEvents)(query, params);
|
|
105590
|
+
}
|
|
105591
|
+
async getMarketsBySlug(slug) {
|
|
105592
|
+
return (0, getMarketsBySlug_1.getMarketsBySlug)(slug);
|
|
105593
|
+
}
|
|
105594
|
+
async fetchOHLCV(id, params) {
|
|
105595
|
+
return (0, fetchOHLCV_1.fetchOHLCV)(id, params);
|
|
105596
|
+
}
|
|
105597
|
+
async fetchOrderBook(id) {
|
|
105598
|
+
return (0, fetchOrderBook_1.fetchOrderBook)(id);
|
|
105599
|
+
}
|
|
105600
|
+
async fetchTrades(id, params) {
|
|
105601
|
+
return (0, fetchTrades_1.fetchTrades)(id, params);
|
|
105602
|
+
}
|
|
105603
|
+
// ----------------------------------------------------------------------------
|
|
105604
|
+
// Trading Methods
|
|
105605
|
+
// ----------------------------------------------------------------------------
|
|
105606
|
+
/**
|
|
105607
|
+
* Ensure authentication is initialized before trading operations.
|
|
105608
|
+
*/
|
|
105609
|
+
ensureAuth() {
|
|
105610
|
+
if (!this.auth) {
|
|
105611
|
+
throw new Error('Trading operations require authentication. Initialize LimitlessExchange with credentials: new LimitlessExchange({ privateKey: "0x..." })');
|
|
105612
|
+
}
|
|
105613
|
+
return this.auth;
|
|
105614
|
+
}
|
|
105615
|
+
async createOrder(params) {
|
|
105616
|
+
const auth = this.ensureAuth();
|
|
105617
|
+
const client = await auth.getClobClient();
|
|
105618
|
+
const side = params.side.toUpperCase() === "BUY" ? clob_client_1.Side.BUY : clob_client_1.Side.SELL;
|
|
105619
|
+
if (params.type === "limit" && !params.price) {
|
|
105620
|
+
throw new Error("Price is required for limit orders");
|
|
105621
|
+
}
|
|
105622
|
+
const price = params.price || (side === clob_client_1.Side.BUY ? 0.99 : 0.01);
|
|
105623
|
+
let tickSize;
|
|
105624
|
+
if (params.tickSize) {
|
|
105625
|
+
tickSize = params.tickSize.toString();
|
|
105626
|
+
} else {
|
|
105627
|
+
try {
|
|
105628
|
+
const orderBook = await this.fetchOrderBook(params.outcomeId);
|
|
105629
|
+
tickSize = this.inferTickSize(orderBook);
|
|
105630
|
+
} catch (error) {
|
|
105631
|
+
tickSize = "0.001";
|
|
105632
|
+
}
|
|
105633
|
+
}
|
|
104842
105634
|
try {
|
|
104843
105635
|
const response = await client.createAndPostOrder({
|
|
104844
105636
|
tokenID: params.outcomeId,
|
|
@@ -104847,7 +105639,7 @@ var require_polymarket = __commonJS({
|
|
|
104847
105639
|
size: params.amount,
|
|
104848
105640
|
feeRateBps: 0
|
|
104849
105641
|
}, {
|
|
104850
|
-
tickSize
|
|
105642
|
+
tickSize
|
|
104851
105643
|
});
|
|
104852
105644
|
if (!response || !response.success) {
|
|
104853
105645
|
throw new Error(response?.errorMsg || "Order placement failed");
|
|
@@ -104869,6 +105661,38 @@ var require_polymarket = __commonJS({
|
|
|
104869
105661
|
throw error;
|
|
104870
105662
|
}
|
|
104871
105663
|
}
|
|
105664
|
+
/**
|
|
105665
|
+
* Infer the tick size from order book price levels.
|
|
105666
|
+
* Analyzes the decimal precision of existing orders to determine the market's tick size.
|
|
105667
|
+
*/
|
|
105668
|
+
inferTickSize(orderBook) {
|
|
105669
|
+
const allPrices = [
|
|
105670
|
+
...orderBook.bids.map((b) => b.price),
|
|
105671
|
+
...orderBook.asks.map((a) => a.price)
|
|
105672
|
+
];
|
|
105673
|
+
if (allPrices.length === 0) {
|
|
105674
|
+
return "0.001";
|
|
105675
|
+
}
|
|
105676
|
+
let minIncrement = 1;
|
|
105677
|
+
for (const price of allPrices) {
|
|
105678
|
+
const priceStr = price.toString();
|
|
105679
|
+
const decimalPart = priceStr.split(".")[1];
|
|
105680
|
+
if (decimalPart) {
|
|
105681
|
+
const decimals = decimalPart.length;
|
|
105682
|
+
const increment = Math.pow(10, -decimals);
|
|
105683
|
+
if (increment < minIncrement) {
|
|
105684
|
+
minIncrement = increment;
|
|
105685
|
+
}
|
|
105686
|
+
}
|
|
105687
|
+
}
|
|
105688
|
+
if (minIncrement >= 0.1)
|
|
105689
|
+
return "0.1";
|
|
105690
|
+
if (minIncrement >= 0.01)
|
|
105691
|
+
return "0.01";
|
|
105692
|
+
if (minIncrement >= 1e-3)
|
|
105693
|
+
return "0.001";
|
|
105694
|
+
return "0.0001";
|
|
105695
|
+
}
|
|
104872
105696
|
async cancelOrder(orderId) {
|
|
104873
105697
|
const auth = this.ensureAuth();
|
|
104874
105698
|
const client = await auth.getClobClient();
|
|
@@ -104934,7 +105758,7 @@ var require_polymarket = __commonJS({
|
|
|
104934
105758
|
timestamp: o.created_at * 1e3
|
|
104935
105759
|
}));
|
|
104936
105760
|
} catch (error) {
|
|
104937
|
-
console.error("Error fetching
|
|
105761
|
+
console.error("Error fetching Limitless open orders:", error.message);
|
|
104938
105762
|
return [];
|
|
104939
105763
|
}
|
|
104940
105764
|
}
|
|
@@ -104977,13 +105801,13 @@ var require_polymarket = __commonJS({
|
|
|
104977
105801
|
}
|
|
104978
105802
|
async watchOrderBook(id, limit) {
|
|
104979
105803
|
if (!this.ws) {
|
|
104980
|
-
this.ws = new websocket_1.
|
|
105804
|
+
this.ws = new websocket_1.LimitlessWebSocket(this.wsConfig);
|
|
104981
105805
|
}
|
|
104982
105806
|
return this.ws.watchOrderBook(id);
|
|
104983
105807
|
}
|
|
104984
105808
|
async watchTrades(id, since, limit) {
|
|
104985
105809
|
if (!this.ws) {
|
|
104986
|
-
this.ws = new websocket_1.
|
|
105810
|
+
this.ws = new websocket_1.LimitlessWebSocket(this.wsConfig);
|
|
104987
105811
|
}
|
|
104988
105812
|
return this.ws.watchTrades(id);
|
|
104989
105813
|
}
|
|
@@ -104994,12 +105818,12 @@ var require_polymarket = __commonJS({
|
|
|
104994
105818
|
}
|
|
104995
105819
|
}
|
|
104996
105820
|
};
|
|
104997
|
-
exports2.
|
|
105821
|
+
exports2.LimitlessExchange = LimitlessExchange;
|
|
104998
105822
|
}
|
|
104999
105823
|
});
|
|
105000
105824
|
|
|
105001
105825
|
// dist/exchanges/kalshi/utils.js
|
|
105002
|
-
var
|
|
105826
|
+
var require_utils11 = __commonJS({
|
|
105003
105827
|
"dist/exchanges/kalshi/utils.js"(exports2) {
|
|
105004
105828
|
"use strict";
|
|
105005
105829
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -105089,7 +105913,7 @@ var require_utils10 = __commonJS({
|
|
|
105089
105913
|
});
|
|
105090
105914
|
|
|
105091
105915
|
// dist/exchanges/kalshi/fetchMarkets.js
|
|
105092
|
-
var
|
|
105916
|
+
var require_fetchMarkets3 = __commonJS({
|
|
105093
105917
|
"dist/exchanges/kalshi/fetchMarkets.js"(exports2) {
|
|
105094
105918
|
"use strict";
|
|
105095
105919
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105099,7 +105923,7 @@ var require_fetchMarkets2 = __commonJS({
|
|
|
105099
105923
|
exports2.resetCache = resetCache;
|
|
105100
105924
|
exports2.fetchMarkets = fetchMarkets;
|
|
105101
105925
|
var axios_1 = __importDefault(require_axios());
|
|
105102
|
-
var utils_1 =
|
|
105926
|
+
var utils_1 = require_utils11();
|
|
105103
105927
|
async function fetchActiveEvents(targetMarketCount) {
|
|
105104
105928
|
let allEvents = [];
|
|
105105
105929
|
let totalMarketCount = 0;
|
|
@@ -105178,16 +106002,21 @@ var require_fetchMarkets2 = __commonJS({
|
|
|
105178
106002
|
events = cachedEvents;
|
|
105179
106003
|
seriesMap = cachedSeriesMap;
|
|
105180
106004
|
} else {
|
|
105181
|
-
const
|
|
106005
|
+
const isSorted = params?.sort && (params.sort === "volume" || params.sort === "liquidity");
|
|
106006
|
+
const fetchLimit = isSorted ? 1e3 : limit;
|
|
105182
106007
|
const [allEvents, fetchedSeriesMap] = await Promise.all([
|
|
105183
106008
|
fetchActiveEvents(fetchLimit),
|
|
105184
106009
|
fetchSeriesMap()
|
|
105185
106010
|
]);
|
|
105186
106011
|
events = allEvents;
|
|
105187
106012
|
seriesMap = fetchedSeriesMap;
|
|
105188
|
-
|
|
105189
|
-
|
|
105190
|
-
|
|
106013
|
+
events = allEvents;
|
|
106014
|
+
seriesMap = fetchedSeriesMap;
|
|
106015
|
+
if (fetchLimit >= 1e3) {
|
|
106016
|
+
cachedEvents = allEvents;
|
|
106017
|
+
cachedSeriesMap = fetchedSeriesMap;
|
|
106018
|
+
lastCacheTime = now;
|
|
106019
|
+
}
|
|
105191
106020
|
}
|
|
105192
106021
|
const allMarkets = [];
|
|
105193
106022
|
for (const event of events) {
|
|
@@ -105219,12 +106048,12 @@ var require_fetchMarkets2 = __commonJS({
|
|
|
105219
106048
|
});
|
|
105220
106049
|
|
|
105221
106050
|
// dist/exchanges/kalshi/searchMarkets.js
|
|
105222
|
-
var
|
|
106051
|
+
var require_searchMarkets3 = __commonJS({
|
|
105223
106052
|
"dist/exchanges/kalshi/searchMarkets.js"(exports2) {
|
|
105224
106053
|
"use strict";
|
|
105225
106054
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105226
106055
|
exports2.searchMarkets = searchMarkets;
|
|
105227
|
-
var fetchMarkets_1 =
|
|
106056
|
+
var fetchMarkets_1 = require_fetchMarkets3();
|
|
105228
106057
|
async function searchMarkets(query, params) {
|
|
105229
106058
|
const fetchLimit = 1e5;
|
|
105230
106059
|
try {
|
|
@@ -105251,7 +106080,7 @@ var require_searchMarkets2 = __commonJS({
|
|
|
105251
106080
|
});
|
|
105252
106081
|
|
|
105253
106082
|
// dist/exchanges/kalshi/searchEvents.js
|
|
105254
|
-
var
|
|
106083
|
+
var require_searchEvents3 = __commonJS({
|
|
105255
106084
|
"dist/exchanges/kalshi/searchEvents.js"(exports2) {
|
|
105256
106085
|
"use strict";
|
|
105257
106086
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105260,7 +106089,7 @@ var require_searchEvents2 = __commonJS({
|
|
|
105260
106089
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105261
106090
|
exports2.searchEvents = searchEvents;
|
|
105262
106091
|
var axios_1 = __importDefault(require_axios());
|
|
105263
|
-
var utils_1 =
|
|
106092
|
+
var utils_1 = require_utils11();
|
|
105264
106093
|
async function searchEvents(query, params) {
|
|
105265
106094
|
try {
|
|
105266
106095
|
const queryParams = {
|
|
@@ -105313,7 +106142,7 @@ var require_searchEvents2 = __commonJS({
|
|
|
105313
106142
|
});
|
|
105314
106143
|
|
|
105315
106144
|
// dist/exchanges/kalshi/getMarketsBySlug.js
|
|
105316
|
-
var
|
|
106145
|
+
var require_getMarketsBySlug3 = __commonJS({
|
|
105317
106146
|
"dist/exchanges/kalshi/getMarketsBySlug.js"(exports2) {
|
|
105318
106147
|
"use strict";
|
|
105319
106148
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105322,7 +106151,7 @@ var require_getMarketsBySlug2 = __commonJS({
|
|
|
105322
106151
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105323
106152
|
exports2.getMarketsBySlug = getMarketsBySlug;
|
|
105324
106153
|
var axios_1 = __importDefault(require_axios());
|
|
105325
|
-
var utils_1 =
|
|
106154
|
+
var utils_1 = require_utils11();
|
|
105326
106155
|
async function getMarketsBySlug(eventTicker) {
|
|
105327
106156
|
try {
|
|
105328
106157
|
const normalizedTicker = eventTicker.toUpperCase();
|
|
@@ -105371,7 +106200,7 @@ var require_getMarketsBySlug2 = __commonJS({
|
|
|
105371
106200
|
});
|
|
105372
106201
|
|
|
105373
106202
|
// dist/exchanges/kalshi/fetchOHLCV.js
|
|
105374
|
-
var
|
|
106203
|
+
var require_fetchOHLCV3 = __commonJS({
|
|
105375
106204
|
"dist/exchanges/kalshi/fetchOHLCV.js"(exports2) {
|
|
105376
106205
|
"use strict";
|
|
105377
106206
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105380,7 +106209,7 @@ var require_fetchOHLCV2 = __commonJS({
|
|
|
105380
106209
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
105381
106210
|
exports2.fetchOHLCV = fetchOHLCV;
|
|
105382
106211
|
var axios_1 = __importDefault(require_axios());
|
|
105383
|
-
var utils_1 =
|
|
106212
|
+
var utils_1 = require_utils11();
|
|
105384
106213
|
async function fetchOHLCV(id, params) {
|
|
105385
106214
|
try {
|
|
105386
106215
|
const cleanedId = id.replace(/-NO$/, "");
|
|
@@ -105458,7 +106287,7 @@ var require_fetchOHLCV2 = __commonJS({
|
|
|
105458
106287
|
});
|
|
105459
106288
|
|
|
105460
106289
|
// dist/exchanges/kalshi/fetchOrderBook.js
|
|
105461
|
-
var
|
|
106290
|
+
var require_fetchOrderBook3 = __commonJS({
|
|
105462
106291
|
"dist/exchanges/kalshi/fetchOrderBook.js"(exports2) {
|
|
105463
106292
|
"use strict";
|
|
105464
106293
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105509,7 +106338,7 @@ var require_fetchOrderBook2 = __commonJS({
|
|
|
105509
106338
|
});
|
|
105510
106339
|
|
|
105511
106340
|
// dist/exchanges/kalshi/fetchTrades.js
|
|
105512
|
-
var
|
|
106341
|
+
var require_fetchTrades3 = __commonJS({
|
|
105513
106342
|
"dist/exchanges/kalshi/fetchTrades.js"(exports2) {
|
|
105514
106343
|
"use strict";
|
|
105515
106344
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105545,7 +106374,7 @@ var require_fetchTrades2 = __commonJS({
|
|
|
105545
106374
|
});
|
|
105546
106375
|
|
|
105547
106376
|
// dist/exchanges/kalshi/auth.js
|
|
105548
|
-
var
|
|
106377
|
+
var require_auth3 = __commonJS({
|
|
105549
106378
|
"dist/exchanges/kalshi/auth.js"(exports2) {
|
|
105550
106379
|
"use strict";
|
|
105551
106380
|
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
@@ -105645,7 +106474,7 @@ var require_auth2 = __commonJS({
|
|
|
105645
106474
|
});
|
|
105646
106475
|
|
|
105647
106476
|
// dist/exchanges/kalshi/websocket.js
|
|
105648
|
-
var
|
|
106477
|
+
var require_websocket5 = __commonJS({
|
|
105649
106478
|
"dist/exchanges/kalshi/websocket.js"(exports2) {
|
|
105650
106479
|
"use strict";
|
|
105651
106480
|
var __importDefault = exports2 && exports2.__importDefault || function(mod) {
|
|
@@ -105939,15 +106768,15 @@ var require_kalshi = __commonJS({
|
|
|
105939
106768
|
exports2.KalshiExchange = void 0;
|
|
105940
106769
|
var axios_1 = __importDefault(require_axios());
|
|
105941
106770
|
var BaseExchange_1 = require_BaseExchange();
|
|
105942
|
-
var fetchMarkets_1 =
|
|
105943
|
-
var searchMarkets_1 =
|
|
105944
|
-
var searchEvents_1 =
|
|
105945
|
-
var getMarketsBySlug_1 =
|
|
105946
|
-
var fetchOHLCV_1 =
|
|
105947
|
-
var fetchOrderBook_1 =
|
|
105948
|
-
var fetchTrades_1 =
|
|
105949
|
-
var auth_1 =
|
|
105950
|
-
var websocket_1 =
|
|
106771
|
+
var fetchMarkets_1 = require_fetchMarkets3();
|
|
106772
|
+
var searchMarkets_1 = require_searchMarkets3();
|
|
106773
|
+
var searchEvents_1 = require_searchEvents3();
|
|
106774
|
+
var getMarketsBySlug_1 = require_getMarketsBySlug3();
|
|
106775
|
+
var fetchOHLCV_1 = require_fetchOHLCV3();
|
|
106776
|
+
var fetchOrderBook_1 = require_fetchOrderBook3();
|
|
106777
|
+
var fetchTrades_1 = require_fetchTrades3();
|
|
106778
|
+
var auth_1 = require_auth3();
|
|
106779
|
+
var websocket_1 = require_websocket5();
|
|
105951
106780
|
var KalshiExchange = class extends BaseExchange_1.PredictionMarketExchange {
|
|
105952
106781
|
constructor(options) {
|
|
105953
106782
|
let credentials;
|
|
@@ -106233,9 +107062,11 @@ var require_app = __commonJS({
|
|
|
106233
107062
|
var express_1 = __importDefault(require_express2());
|
|
106234
107063
|
var cors_1 = __importDefault(require_lib3());
|
|
106235
107064
|
var polymarket_1 = require_polymarket();
|
|
107065
|
+
var limitless_1 = require_limitless();
|
|
106236
107066
|
var kalshi_1 = require_kalshi();
|
|
106237
107067
|
var defaultExchanges = {
|
|
106238
107068
|
polymarket: null,
|
|
107069
|
+
limitless: null,
|
|
106239
107070
|
kalshi: null
|
|
106240
107071
|
};
|
|
106241
107072
|
async function startServer(port, accessToken) {
|
|
@@ -106299,6 +107130,13 @@ var require_app = __commonJS({
|
|
|
106299
107130
|
apiSecret: credentials?.apiSecret || process.env.POLYMARKET_API_SECRET,
|
|
106300
107131
|
passphrase: credentials?.passphrase || process.env.POLYMARKET_PASSPHRASE
|
|
106301
107132
|
});
|
|
107133
|
+
case "limitless":
|
|
107134
|
+
return new limitless_1.LimitlessExchange({
|
|
107135
|
+
privateKey: credentials?.privateKey || process.env.LIMITLESS_PK || process.env.LIMITLESS_PRIVATE_KEY,
|
|
107136
|
+
apiKey: credentials?.apiKey || process.env.LIMITLESS_API_KEY,
|
|
107137
|
+
apiSecret: credentials?.apiSecret || process.env.LIMITLESS_API_SECRET,
|
|
107138
|
+
passphrase: credentials?.passphrase || process.env.LIMITLESS_PASSPHRASE
|
|
107139
|
+
});
|
|
106302
107140
|
case "kalshi":
|
|
106303
107141
|
return new kalshi_1.KalshiExchange({
|
|
106304
107142
|
apiKey: credentials?.apiKey || process.env.KALSHI_API_KEY,
|
pmxt/client.py
CHANGED
|
@@ -990,3 +990,39 @@ class Kalshi(Exchange):
|
|
|
990
990
|
base_url=base_url,
|
|
991
991
|
auto_start_server=auto_start_server,
|
|
992
992
|
)
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
class Limitless(Exchange):
|
|
996
|
+
"""
|
|
997
|
+
Limitless exchange client.
|
|
998
|
+
|
|
999
|
+
Example:
|
|
1000
|
+
>>> # Public data (no auth)
|
|
1001
|
+
>>> limitless = Limitless()
|
|
1002
|
+
>>> markets = limitless.search_markets("Trump")
|
|
1003
|
+
>>>
|
|
1004
|
+
>>> # Trading (requires auth)
|
|
1005
|
+
>>> limitless = Limitless(private_key=os.getenv("LIMITLESS_PRIVATE_KEY"))
|
|
1006
|
+
>>> balance = limitless.fetch_balance()
|
|
1007
|
+
"""
|
|
1008
|
+
|
|
1009
|
+
def __init__(
|
|
1010
|
+
self,
|
|
1011
|
+
private_key: Optional[str] = None,
|
|
1012
|
+
base_url: str = "http://localhost:3847",
|
|
1013
|
+
auto_start_server: bool = True,
|
|
1014
|
+
):
|
|
1015
|
+
"""
|
|
1016
|
+
Initialize Limitless client.
|
|
1017
|
+
|
|
1018
|
+
Args:
|
|
1019
|
+
private_key: Ethereum private key (required for trading)
|
|
1020
|
+
base_url: Base URL of the PMXT sidecar server
|
|
1021
|
+
auto_start_server: Automatically start server if not running (default: True)
|
|
1022
|
+
"""
|
|
1023
|
+
super().__init__(
|
|
1024
|
+
exchange_name="limitless",
|
|
1025
|
+
private_key=private_key,
|
|
1026
|
+
base_url=base_url,
|
|
1027
|
+
auto_start_server=auto_start_server,
|
|
1028
|
+
)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
pmxt/__init__.py,sha256=
|
|
2
|
-
pmxt/client.py,sha256=
|
|
1
|
+
pmxt/__init__.py,sha256=boDsiDSOI47zl1FeTA-nuM4IH-PorRyCozDtVScez5s,1178
|
|
2
|
+
pmxt/client.py,sha256=YEArwWnyDbd5Hb_HxMWXIqsihUD0RZDaTrBZh4hOlq4,34026
|
|
3
3
|
pmxt/models.py,sha256=-jiQ9mmv_qnF6mzj3DrvNgEA77tE_Pl0RCblM1VbV7o,8581
|
|
4
4
|
pmxt/server_manager.py,sha256=6uS1LIZ2d5d_K-MtbMUAlCZvbvhZ_iyofKok55HEofc,11606
|
|
5
5
|
pmxt/_server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
pmxt/_server/bin/pmxt-ensure-server,sha256=kXIond0UbxS52FAVQD7kHmSBaL_s6cbIyapLRr4KZJw,4544
|
|
7
7
|
pmxt/_server/bin/pmxt-ensure-server.js,sha256=kXIond0UbxS52FAVQD7kHmSBaL_s6cbIyapLRr4KZJw,4544
|
|
8
|
-
pmxt/_server/server/bundled.js,sha256=
|
|
9
|
-
pmxt_internal/__init__.py,sha256=
|
|
10
|
-
pmxt_internal/api_client.py,sha256=
|
|
8
|
+
pmxt/_server/server/bundled.js,sha256=Os3W7syaDzC9_nYLOWcAzYDEAkGcWluW1rx_q0RSl_o,4228933
|
|
9
|
+
pmxt_internal/__init__.py,sha256=M7ymbKiAUn1HrvEJZ1YBrkd32Xjc18Q_V_PiJT5JGdo,7578
|
|
10
|
+
pmxt_internal/api_client.py,sha256=rUegyKlMlYJOH5qRuJTBNkWgRLJtnWr-5REq-zjE9mE,27889
|
|
11
11
|
pmxt_internal/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
|
|
12
|
-
pmxt_internal/configuration.py,sha256=
|
|
12
|
+
pmxt_internal/configuration.py,sha256=edgaKafrUFd_z-2f4zIwaTZg7-xp4_7dhsPR62WvLNQ,18320
|
|
13
13
|
pmxt_internal/exceptions.py,sha256=txF8A7vlan57JS69kFPs-IZF-Qhp7IZobBTJVa4fOaM,6644
|
|
14
14
|
pmxt_internal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
pmxt_internal/rest.py,sha256=FMj4yaV6XLr842u_ScWHSzQsTFdk0jaUeuWLJoRbogQ,9760
|
|
@@ -65,7 +65,7 @@ pmxt_internal/models/unified_market.py,sha256=DoYhiH4HycYGlq858PEeB-CIA7haT6rxmJ
|
|
|
65
65
|
pmxt_internal/models/watch_order_book_request.py,sha256=kavGUI-SLz2-Kam_jcJ_h0GDe0-9UkxqCmVsAi6Uios,3726
|
|
66
66
|
pmxt_internal/models/watch_order_book_request_args_inner.py,sha256=ZHrjmFDGxRG5MXbuz4mUp9KFfo3XS7zuXWTyMNgi4xI,5464
|
|
67
67
|
pmxt_internal/models/watch_trades_request.py,sha256=brrg8JbEe-aeg7mIe_Y2HzRPogp-IfRhkXChrxzqoLU,3722
|
|
68
|
-
pmxt-1.
|
|
69
|
-
pmxt-1.
|
|
70
|
-
pmxt-1.
|
|
71
|
-
pmxt-1.
|
|
68
|
+
pmxt-1.5.1.dist-info/METADATA,sha256=yqv45Tbq8HwunZn5FD5IpD1p2SmruMQ0YEAnGsNPwg4,6449
|
|
69
|
+
pmxt-1.5.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
70
|
+
pmxt-1.5.1.dist-info/top_level.txt,sha256=J_jrcouJ-x-5lpcXMxeW0GOSi1HsBVR5_PdSfvigVrw,19
|
|
71
|
+
pmxt-1.5.1.dist-info/RECORD,,
|
pmxt_internal/__init__.py
CHANGED
pmxt_internal/api_client.py
CHANGED
|
@@ -91,7 +91,7 @@ class ApiClient:
|
|
|
91
91
|
self.default_headers[header_name] = header_value
|
|
92
92
|
self.cookie = cookie
|
|
93
93
|
# Set default User-Agent.
|
|
94
|
-
self.user_agent = 'OpenAPI-Generator/1.
|
|
94
|
+
self.user_agent = 'OpenAPI-Generator/1.5.1/python'
|
|
95
95
|
self.client_side_validation = configuration.client_side_validation
|
|
96
96
|
|
|
97
97
|
def __enter__(self):
|
pmxt_internal/configuration.py
CHANGED
|
@@ -506,7 +506,7 @@ class Configuration:
|
|
|
506
506
|
"OS: {env}\n"\
|
|
507
507
|
"Python Version: {pyversion}\n"\
|
|
508
508
|
"Version of the API: 0.4.4\n"\
|
|
509
|
-
"SDK Package Version: 1.
|
|
509
|
+
"SDK Package Version: 1.5.1".\
|
|
510
510
|
format(env=sys.platform, pyversion=sys.version)
|
|
511
511
|
|
|
512
512
|
def get_host_settings(self) -> List[HostSetting]:
|
|
File without changes
|
|
File without changes
|