pmxt 1.3.4__py3-none-any.whl → 1.4.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 CHANGED
@@ -33,7 +33,7 @@ from .models import (
33
33
  CreateOrderParams,
34
34
  )
35
35
 
36
- __version__ = "1.3.4"
36
+ __version__ = "1.4.1"
37
37
  __all__ = [
38
38
  # Exchanges
39
39
  "Polymarket",
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * PMXT Server Launcher
5
+ *
6
+ * This script ensures the PMXT sidecar server is running.
7
+ * It's designed to be called by SDKs in any language (Python, Java, C#, Go, etc.)
8
+ *
9
+ * Behavior:
10
+ * 1. Check if server is already running (via lock file)
11
+ * 2. If running, exit successfully
12
+ * 3. If not running, spawn the server and wait for health check
13
+ * 4. Exit with code 0 on success, 1 on failure
14
+ */
15
+
16
+ const fs = require('fs');
17
+ const path = require('path');
18
+ const os = require('os');
19
+ const { spawn } = require('child_process');
20
+ const http = require('http');
21
+
22
+ const LOCK_FILE = path.join(os.homedir(), '.pmxt', 'server.lock');
23
+ const DEFAULT_PORT = 3847;
24
+ const HEALTH_CHECK_TIMEOUT = 10000; // 10 seconds
25
+ const HEALTH_CHECK_INTERVAL = 100; // 100ms
26
+
27
+ /**
28
+ * Check if the server is currently running
29
+ */
30
+ function isServerRunning() {
31
+ try {
32
+ if (!fs.existsSync(LOCK_FILE)) {
33
+ return false;
34
+ }
35
+
36
+ const lockData = JSON.parse(fs.readFileSync(LOCK_FILE, 'utf-8'));
37
+ const { pid, port } = lockData;
38
+
39
+ // Check if process exists
40
+ try {
41
+ process.kill(pid, 0); // Signal 0 checks existence without killing
42
+ return { running: true, port };
43
+ } catch (err) {
44
+ // Process doesn't exist, remove stale lock file
45
+ fs.unlinkSync(LOCK_FILE);
46
+ return false;
47
+ }
48
+ } catch (err) {
49
+ return false;
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Wait for server to respond to health check
55
+ */
56
+ function waitForHealth(port, timeout = HEALTH_CHECK_TIMEOUT) {
57
+ return new Promise((resolve, reject) => {
58
+ const startTime = Date.now();
59
+
60
+ const checkHealth = () => {
61
+ const req = http.get(`http://localhost:${port}/health`, (res) => {
62
+ if (res.statusCode === 200) {
63
+ resolve(true);
64
+ } else {
65
+ scheduleNextCheck();
66
+ }
67
+ });
68
+
69
+ req.on('error', () => {
70
+ scheduleNextCheck();
71
+ });
72
+
73
+ req.setTimeout(1000);
74
+ };
75
+
76
+ const scheduleNextCheck = () => {
77
+ if (Date.now() - startTime > timeout) {
78
+ reject(new Error('Server health check timeout'));
79
+ } else {
80
+ setTimeout(checkHealth, HEALTH_CHECK_INTERVAL);
81
+ }
82
+ };
83
+
84
+ checkHealth();
85
+ });
86
+ }
87
+
88
+ /**
89
+ * Start the PMXT server
90
+ */
91
+ async function startServer() {
92
+ // 1. Try to find the server binary/script
93
+ let serverCmd = 'pmxt-server';
94
+ let args = [];
95
+
96
+ // Check for Python-bundled server (when bundled in pip package)
97
+ const pythonBundledServer = path.join(__dirname, '..', 'server', 'bundled.js');
98
+ // Check for local dev bundled server
99
+ const localBundledServer = path.join(__dirname, '..', 'dist', 'server', 'bundled.js');
100
+ const localDistServer = path.join(__dirname, '..', 'dist', 'server', 'index.js');
101
+ const localBinServer = path.join(__dirname, 'pmxt-server');
102
+
103
+ if (fs.existsSync(pythonBundledServer)) {
104
+ serverCmd = 'node';
105
+ args = [pythonBundledServer];
106
+ } else if (fs.existsSync(localBundledServer)) {
107
+ serverCmd = 'node';
108
+ args = [localBundledServer];
109
+ } else if (fs.existsSync(localDistServer)) {
110
+ serverCmd = 'node';
111
+ args = [localDistServer];
112
+ } else if (fs.existsSync(localBinServer)) {
113
+ serverCmd = localBinServer;
114
+ }
115
+
116
+ // Spawn server as detached process
117
+ const serverProcess = spawn(serverCmd, args, {
118
+ detached: true,
119
+ stdio: 'ignore',
120
+ env: process.env
121
+ });
122
+
123
+ // Detach from parent process
124
+ serverProcess.unref();
125
+
126
+ // Wait for server to be ready
127
+ await waitForHealth(DEFAULT_PORT);
128
+ }
129
+
130
+ /**
131
+ * Main entry point
132
+ */
133
+ async function main() {
134
+ try {
135
+ // Check if server is already running
136
+ const serverStatus = isServerRunning();
137
+
138
+ if (serverStatus && serverStatus.running) {
139
+ // Server is running, verify it's healthy
140
+ try {
141
+ await waitForHealth(serverStatus.port, 2000);
142
+ process.exit(0);
143
+ } catch (err) {
144
+ // Server process exists but not responding, try to start fresh
145
+ console.error('Server process exists but not responding, starting fresh...');
146
+ }
147
+ }
148
+
149
+ // Start the server
150
+ await startServer();
151
+ process.exit(0);
152
+ } catch (err) {
153
+ console.error('Failed to ensure server is running:', err.message);
154
+ process.exit(1);
155
+ }
156
+ }
157
+
158
+ main();
@@ -24359,12 +24359,61 @@ var require_lib3 = __commonJS({
24359
24359
  }
24360
24360
  });
24361
24361
 
24362
+ // dist/utils/math.js
24363
+ var require_math = __commonJS({
24364
+ "dist/utils/math.js"(exports2) {
24365
+ "use strict";
24366
+ Object.defineProperty(exports2, "__esModule", { value: true });
24367
+ exports2.getExecutionPrice = getExecutionPrice;
24368
+ exports2.getExecutionPriceDetailed = getExecutionPriceDetailed;
24369
+ function getExecutionPrice(orderBook, side, amount) {
24370
+ const result = getExecutionPriceDetailed(orderBook, side, amount);
24371
+ return result.fullyFilled ? result.price : 0;
24372
+ }
24373
+ function getExecutionPriceDetailed(orderBook, side, amount) {
24374
+ if (amount <= 0) {
24375
+ throw new Error("Amount must be greater than 0");
24376
+ }
24377
+ let levels = (side === "buy" ? orderBook.asks : orderBook.bids).filter((l) => l.size > 0);
24378
+ levels.sort((a, b) => side === "buy" ? a.price - b.price : b.price - a.price);
24379
+ if (levels.length === 0) {
24380
+ return {
24381
+ price: 0,
24382
+ filledAmount: 0,
24383
+ fullyFilled: false
24384
+ };
24385
+ }
24386
+ let remainingAmount = amount;
24387
+ let totalCost = 0;
24388
+ let filledAmount = 0;
24389
+ const EPSILON = 1e-8;
24390
+ for (const level of levels) {
24391
+ if (remainingAmount <= EPSILON) {
24392
+ break;
24393
+ }
24394
+ const fillSize = Math.min(remainingAmount, level.size);
24395
+ totalCost += fillSize * level.price;
24396
+ filledAmount += fillSize;
24397
+ remainingAmount -= fillSize;
24398
+ }
24399
+ const fullyFilled = remainingAmount <= EPSILON;
24400
+ const executionPrice = filledAmount > EPSILON ? totalCost / filledAmount : 0;
24401
+ return {
24402
+ price: executionPrice,
24403
+ filledAmount,
24404
+ fullyFilled
24405
+ };
24406
+ }
24407
+ }
24408
+ });
24409
+
24362
24410
  // dist/BaseExchange.js
24363
24411
  var require_BaseExchange = __commonJS({
24364
24412
  "dist/BaseExchange.js"(exports2) {
24365
24413
  "use strict";
24366
24414
  Object.defineProperty(exports2, "__esModule", { value: true });
24367
24415
  exports2.PredictionMarketExchange = void 0;
24416
+ var math_1 = require_math();
24368
24417
  var PredictionMarketExchange = class {
24369
24418
  constructor(credentials) {
24370
24419
  this.credentials = credentials;
@@ -24438,6 +24487,12 @@ var require_BaseExchange = __commonJS({
24438
24487
  async fetchBalance() {
24439
24488
  throw new Error("Method fetchBalance not implemented.");
24440
24489
  }
24490
+ getExecutionPrice(orderBook, side, amount) {
24491
+ return (0, math_1.getExecutionPrice)(orderBook, side, amount);
24492
+ }
24493
+ getExecutionPriceDetailed(orderBook, side, amount) {
24494
+ return (0, math_1.getExecutionPriceDetailed)(orderBook, side, amount);
24495
+ }
24441
24496
  // ----------------------------------------------------------------------------
24442
24497
  // WebSocket Streaming Methods
24443
24498
  // ----------------------------------------------------------------------------
pmxt/client.py CHANGED
@@ -7,9 +7,10 @@ OpenAPI client, matching the JavaScript API exactly.
7
7
 
8
8
  import os
9
9
  import sys
10
- from typing import List, Optional, Dict, Any
10
+ from typing import List, Optional, Dict, Any, Literal
11
11
  from datetime import datetime
12
12
  from abc import ABC, abstractmethod
13
+ import json
13
14
 
14
15
  # Add generated client to path
15
16
  _GENERATED_PATH = os.path.join(os.path.dirname(__file__), "..", "generated")
@@ -35,6 +36,7 @@ from .models import (
35
36
  MarketFilterParams,
36
37
  HistoryFilterParams,
37
38
  CreateOrderParams,
39
+ ExecutionPriceResult,
38
40
  )
39
41
  from .server_manager import ServerManager
40
42
 
@@ -169,6 +171,15 @@ def _convert_balance(raw: Dict[str, Any]) -> Balance:
169
171
  )
170
172
 
171
173
 
174
+ def _convert_execution_result(raw: Dict[str, Any]) -> ExecutionPriceResult:
175
+ """Convert raw API response to ExecutionPriceResult."""
176
+ return ExecutionPriceResult(
177
+ price=raw.get("price", 0),
178
+ filled_amount=raw.get("filledAmount", 0),
179
+ fully_filled=raw.get("fullyFilled", False),
180
+ )
181
+
182
+
172
183
  class Exchange(ABC):
173
184
  """
174
185
  Base class for prediction market exchanges.
@@ -831,6 +842,77 @@ class Exchange(ABC):
831
842
  except ApiException as e:
832
843
  raise Exception(f"Failed to fetch balance: {e}")
833
844
 
845
+ def get_execution_price(
846
+ self,
847
+ order_book: OrderBook,
848
+ side: Literal["buy", "sell"],
849
+ amount: float
850
+ ) -> float:
851
+ """
852
+ Calculate the average execution price for a given amount.
853
+
854
+ Args:
855
+ order_book: The current order book
856
+ side: "buy" or "sell"
857
+ amount: The amount to execute
858
+
859
+ Returns:
860
+ The volume-weighted average price, or 0 if insufficient liquidity
861
+ """
862
+ result = self.get_execution_price_detailed(order_book, side, amount)
863
+ return result.price if result.fully_filled else 0
864
+
865
+ def get_execution_price_detailed(
866
+ self,
867
+ order_book: OrderBook,
868
+ side: Literal["buy", "sell"],
869
+ amount: float
870
+ ) -> ExecutionPriceResult:
871
+ """
872
+ Calculate detailed execution price information.
873
+
874
+ Args:
875
+ order_book: The current order book
876
+ side: "buy" or "sell"
877
+ amount: The amount to execute
878
+
879
+ Returns:
880
+ Detailed execution result
881
+ """
882
+ try:
883
+ # Convert order_book to dict for API call
884
+ bids = [{"price": b.price, "size": b.size} for b in order_book.bids]
885
+ asks = [{"price": a.price, "size": a.size} for a in order_book.asks]
886
+ ob_dict = {"bids": bids, "asks": asks, "timestamp": order_book.timestamp}
887
+
888
+ body = {
889
+ "args": [ob_dict, side, amount]
890
+ }
891
+
892
+ creds = self._get_credentials_dict()
893
+ if creds:
894
+ body["credentials"] = creds
895
+
896
+ url = f"{self._api_client.configuration.host}/api/{self.exchange_name}/getExecutionPriceDetailed"
897
+
898
+ headers = {"Content-Type": "application/json", "Accept": "application/json"}
899
+ headers.update(self._api_client.default_headers)
900
+
901
+ response = self._api_client.call_api(
902
+ method="POST",
903
+ url=url,
904
+ body=body,
905
+ header_params=headers
906
+ )
907
+
908
+ response.read()
909
+ data_json = json.loads(response.data)
910
+
911
+ data = self._handle_response(data_json)
912
+ return _convert_execution_result(data)
913
+ except Exception as e:
914
+ raise Exception(f"Failed to get execution price: {e}")
915
+
834
916
 
835
917
  class Polymarket(Exchange):
836
918
  """
pmxt/models.py CHANGED
@@ -217,6 +217,20 @@ class OrderBook:
217
217
  """Unix timestamp (milliseconds)"""
218
218
 
219
219
 
220
+ @dataclass
221
+ class ExecutionPriceResult:
222
+ """Result of an execution price calculation."""
223
+
224
+ price: float
225
+ """The volume-weighted average price"""
226
+
227
+ filled_amount: float
228
+ """The actual amount that can be filled"""
229
+
230
+ fully_filled: bool
231
+ """Whether the full requested amount can be filled"""
232
+
233
+
220
234
  @dataclass
221
235
  class Trade:
222
236
  """A historical trade."""
pmxt/server_manager.py CHANGED
@@ -209,15 +209,19 @@ class ServerManager:
209
209
  Start the server using the pmxt-ensure-server launcher.
210
210
  """
211
211
  # 1. Check for bundled server (PRODUCTION - installed via pip)
212
- bundled_launcher = Path(__file__).parent / '_server' / 'bin' / 'pmxt-ensure-server'
213
-
212
+ launcher_filename = 'pmxt-ensure-server'
213
+ if os.name == "nt": # Check if running Windows
214
+ launcher_filename += ".js"
215
+
216
+ bundled_launcher = Path(__file__).parent / '_server' / 'bin' / launcher_filename
217
+
214
218
  # 2. Check for monorepo structure (DEVELOPMENT)
215
219
  current_file = Path(__file__).resolve()
216
- local_launcher = current_file.parent.parent.parent.parent / 'core' / 'bin' / 'pmxt-ensure-server'
217
-
220
+ local_launcher = current_file.parent.parent.parent.parent / 'core' / 'bin' / launcher_filename
221
+
218
222
  # 3. Check PATH (GLOBAL INSTALL)
219
- path_launcher = shutil.which('pmxt-ensure-server')
220
-
223
+ path_launcher = shutil.which(launcher_filename)
224
+
221
225
  # Priority order: bundled > local dev > PATH
222
226
  if bundled_launcher.exists():
223
227
  launcher = str(bundled_launcher)
@@ -235,7 +239,7 @@ class ServerManager:
235
239
 
236
240
  # Call the launcher
237
241
  try:
238
- # If it's a JS file and we are calling it directly, might need node
242
+ # If it's a JS file, and we are calling it directly, might need node
239
243
  cmd = [launcher]
240
244
  if launcher.endswith('.js') or not os.access(launcher, os.X_OK):
241
245
  cmd = ['node', launcher]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pmxt
3
- Version: 1.3.4
3
+ Version: 1.4.1
4
4
  Summary: Unified prediction market data API - The ccxt for prediction markets
5
5
  Author: PMXT Contributors
6
6
  License: MIT
@@ -160,6 +160,8 @@ for pos in positions:
160
160
  - `fetch_ohlcv(outcome_id, params)` - Get historical price candles
161
161
  - `fetch_order_book(outcome_id)` - Get current order book
162
162
  - `fetch_trades(outcome_id, params)` - Get trade history
163
+ - `get_execution_price(order_book, side, amount)` - Get execution price
164
+ - `get_execution_price_detailed(order_book, side, amount)` - Get detailed execution info
163
165
 
164
166
  ### Trading Methods (require authentication)
165
167
 
@@ -1,20 +1,21 @@
1
- pmxt/__init__.py,sha256=QUyTYIHTeamwGXyGf7_d-7UM91n-trP78TgmiooWQjA,1150
2
- pmxt/client.py,sha256=YytS9Y1CD8A2NihUxedpmojH830eWE32v4-hbMsA4a8,30175
3
- pmxt/models.py,sha256=6ku911tJoT1ItglYWHmg_OfvDmCPEvFXWDL562wCBIs,8259
4
- pmxt/server_manager.py,sha256=-G97dYEdKl7F3HK9bAOKYl-SGWP6HsvzZIx2QxiZm24,11494
1
+ pmxt/__init__.py,sha256=MF02BpWSi_lMTTekzj6fxuZn9EBApLDlxqG9XfyHURs,1150
2
+ pmxt/client.py,sha256=1qa8ObZtf-tdzhDXQXvWWdeLvGbyxsiVHAgQvl8Z4Uk,32955
3
+ pmxt/models.py,sha256=-jiQ9mmv_qnF6mzj3DrvNgEA77tE_Pl0RCblM1VbV7o,8581
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
- pmxt/_server/server/bundled.js,sha256=KxMsOJdiw5D2ynSJGFUCeojDlA-w7Eu6ldlgDoeApp4,4196247
8
- pmxt_internal/__init__.py,sha256=rTbculzYsP3ZAsVNJckX_iFXMNdLU3eETpPLcR-Y6Is,6762
9
- pmxt_internal/api_client.py,sha256=7tnxPGfTzVx9xEneYQMVhZFCix6NMoR2NKHa1gkbeQk,27889
7
+ pmxt/_server/bin/pmxt-ensure-server.js,sha256=kXIond0UbxS52FAVQD7kHmSBaL_s6cbIyapLRr4KZJw,4544
8
+ pmxt/_server/server/bundled.js,sha256=ETpsJ6ZmRtO1gQmBZYwwHWTHJIEI8ooeeMhOwoeDJ84,4198184
9
+ pmxt_internal/__init__.py,sha256=Uxuh0MqjsHQ7vIaFnF5ZFSVlu4uJJFRDkQ_ued-QLHc,7578
10
+ pmxt_internal/api_client.py,sha256=0IalYtBszV5nLMHLkPqwECHqeWVOdE6ROcPrH72zwHs,27889
10
11
  pmxt_internal/api_response.py,sha256=eMxw1mpmJcoGZ3gs9z6jM4oYoZ10Gjk333s9sKxGv7s,652
11
- pmxt_internal/configuration.py,sha256=sqCSSQUykt5E1s7EEI1gr-NYzCzKBtiei3cJXUVqnDs,18320
12
+ pmxt_internal/configuration.py,sha256=uo3MWYp8NBZ8lVhNrWRWWSDzSOfuYF0O5RLuV4FUUUs,18320
12
13
  pmxt_internal/exceptions.py,sha256=txF8A7vlan57JS69kFPs-IZF-Qhp7IZobBTJVa4fOaM,6644
13
14
  pmxt_internal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
15
  pmxt_internal/rest.py,sha256=FMj4yaV6XLr842u_ScWHSzQsTFdk0jaUeuWLJoRbogQ,9760
15
16
  pmxt_internal/api/__init__.py,sha256=ppJSCipQ5IAk2z6UZkFaGSsEmnoAnSSHb8sjb_DYUkY,101
16
- pmxt_internal/api/default_api.py,sha256=4ySNtjkT9zJBfaHzX4fmXN5IgE-zIsr-uJs6WMO_N28,183099
17
- pmxt_internal/models/__init__.py,sha256=VPMpFsTZYckNs5JLcdO_8UwcZn4xEK3xQ58LUO0rxv4,3667
17
+ pmxt_internal/api/default_api.py,sha256=6nMYcL__0wtDJAyDAHadN8zk1Sw-qE3nhcpvqUf3ymw,206490
18
+ pmxt_internal/models/__init__.py,sha256=nviUepbTwMI-ro_lY6JbUgsQ1MskT7AKN3mb5WKJR74,4141
18
19
  pmxt_internal/models/balance.py,sha256=Dj5kFiLrsXOZyyXTC18bPjWrgw7qdWnTgTSCmk_l6xk,2962
19
20
  pmxt_internal/models/base_request.py,sha256=ZNipF7ycXFkQJ6j3QmB1TzA0UO3fB54AMPlAgIA3KOA,2987
20
21
  pmxt_internal/models/base_response.py,sha256=g-NG4Swxl3cg4-YOCPl65dUeHzOnA9S7ubTj8HOYZs0,2975
@@ -25,6 +26,7 @@ pmxt_internal/models/create_order_request.py,sha256=prj6TnIFbhB8eDq-6e-MK2DtfDzA
25
26
  pmxt_internal/models/error_detail.py,sha256=590jlnQmIgqcjUQ5ef07_nWMn7fnyjuAvkUjmSoAkMs,2605
26
27
  pmxt_internal/models/error_response.py,sha256=c5DgOpTGqx9Qoz7hYKhRPAM3UfoX4GBWkyhfxerMXEI,2979
27
28
  pmxt_internal/models/exchange_credentials.py,sha256=BtZCkGnnGQ24KPolTRtoA_jtXp-5_1Y1FmQLe1L5WCo,3308
29
+ pmxt_internal/models/execution_price_result.py,sha256=gsYJWD4GXVC9-_YmtLleegxmS4p7Q9bLNaJNEz6Ljsk,3012
28
30
  pmxt_internal/models/fetch_balance200_response.py,sha256=VN5yrsVSKnI_WprK1U4wbl60jGEiSnu4VAOGkSM5K4o,3539
29
31
  pmxt_internal/models/fetch_markets200_response.py,sha256=olOMs8IBKPL2Foqw3r66jeGcRlJpOpGcGq0jNccUPuA,3564
30
32
  pmxt_internal/models/fetch_markets_request.py,sha256=2kV2N3jVPy7qKMpVMt-QiTP_Ea0Unrkq2R-qBnB5xKk,3627
@@ -39,6 +41,10 @@ pmxt_internal/models/fetch_positions200_response.py,sha256=mzEq-rEYJaZHmjqjcaW9w
39
41
  pmxt_internal/models/fetch_positions_request.py,sha256=F823DuKhltLMw04QrtSi1ZNVhkSISKz72evpWaEIaE8,3208
40
42
  pmxt_internal/models/fetch_trades200_response.py,sha256=fdsEd4luXJpzk6MuM192PaZ62fOBA3He3VreZhCd4-w,3527
41
43
  pmxt_internal/models/fetch_trades_request.py,sha256=GQZGh2dy-Y3n8DnR8x5b9bLH_nLmCmIJqjcTTNzcoSA,3690
44
+ pmxt_internal/models/get_execution_price200_response.py,sha256=uf5eCUHZK5ZVzgJ2UrXMvOJnNvVhNq5Zwb6_MAWa_O4,3172
45
+ pmxt_internal/models/get_execution_price_detailed200_response.py,sha256=PqBksuFhxToYvl-O4eM9WhSn0h5x0lwK4c7cttbAoL8,3463
46
+ pmxt_internal/models/get_execution_price_request.py,sha256=sVPuP6QKDeAMOueYlJT9MQTg9JnQzDHI-C4B4Db4Cvc,3756
47
+ pmxt_internal/models/get_execution_price_request_args_inner.py,sha256=CoiBFk1iGMIfWNGEDCLBGAyT4fFhjANttQftNOKaDIo,6225
42
48
  pmxt_internal/models/get_markets_by_slug_request.py,sha256=PtjXAw6hixHuYzCvSGH1aka2rZrsHmT8ofXYSuuOh9k,3173
43
49
  pmxt_internal/models/health_check200_response.py,sha256=yR_OkIlTPztO0zFmpyWllSwyaEbI48RpumfmVVCJAyc,2758
44
50
  pmxt_internal/models/history_filter_params.py,sha256=0i9oQLwJsRWRyzPZuW467y_0ccKpc2_I6T2lgZCkHd4,3239
@@ -59,7 +65,7 @@ pmxt_internal/models/unified_market.py,sha256=DoYhiH4HycYGlq858PEeB-CIA7haT6rxmJ
59
65
  pmxt_internal/models/watch_order_book_request.py,sha256=kavGUI-SLz2-Kam_jcJ_h0GDe0-9UkxqCmVsAi6Uios,3726
60
66
  pmxt_internal/models/watch_order_book_request_args_inner.py,sha256=ZHrjmFDGxRG5MXbuz4mUp9KFfo3XS7zuXWTyMNgi4xI,5464
61
67
  pmxt_internal/models/watch_trades_request.py,sha256=brrg8JbEe-aeg7mIe_Y2HzRPogp-IfRhkXChrxzqoLU,3722
62
- pmxt-1.3.4.dist-info/METADATA,sha256=Xp9QzK2hMi2HUFkBrflPTR88Do9Q_GLNd4QPLwHaNxE,6288
63
- pmxt-1.3.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
64
- pmxt-1.3.4.dist-info/top_level.txt,sha256=J_jrcouJ-x-5lpcXMxeW0GOSi1HsBVR5_PdSfvigVrw,19
65
- pmxt-1.3.4.dist-info/RECORD,,
68
+ pmxt-1.4.1.dist-info/METADATA,sha256=3y8vXwX2n2sDBosp4CCbL3YN7SVpsV7yVF2CHp5B5fw,6449
69
+ pmxt-1.4.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
70
+ pmxt-1.4.1.dist-info/top_level.txt,sha256=J_jrcouJ-x-5lpcXMxeW0GOSi1HsBVR5_PdSfvigVrw,19
71
+ pmxt-1.4.1.dist-info/RECORD,,
pmxt_internal/__init__.py CHANGED
@@ -14,7 +14,7 @@
14
14
  """ # noqa: E501
15
15
 
16
16
 
17
- __version__ = "1.3.4"
17
+ __version__ = "1.4.1"
18
18
 
19
19
  # Define package exports
20
20
  __all__ = [
@@ -38,6 +38,7 @@ __all__ = [
38
38
  "ErrorDetail",
39
39
  "ErrorResponse",
40
40
  "ExchangeCredentials",
41
+ "ExecutionPriceResult",
41
42
  "FetchBalance200Response",
42
43
  "FetchMarkets200Response",
43
44
  "FetchMarketsRequest",
@@ -52,6 +53,10 @@ __all__ = [
52
53
  "FetchPositionsRequest",
53
54
  "FetchTrades200Response",
54
55
  "FetchTradesRequest",
56
+ "GetExecutionPrice200Response",
57
+ "GetExecutionPriceDetailed200Response",
58
+ "GetExecutionPriceRequest",
59
+ "GetExecutionPriceRequestArgsInner",
55
60
  "GetMarketsBySlugRequest",
56
61
  "HealthCheck200Response",
57
62
  "HistoryFilterParams",
@@ -99,6 +104,7 @@ from pmxt_internal.models.create_order_request import CreateOrderRequest as Crea
99
104
  from pmxt_internal.models.error_detail import ErrorDetail as ErrorDetail
100
105
  from pmxt_internal.models.error_response import ErrorResponse as ErrorResponse
101
106
  from pmxt_internal.models.exchange_credentials import ExchangeCredentials as ExchangeCredentials
107
+ from pmxt_internal.models.execution_price_result import ExecutionPriceResult as ExecutionPriceResult
102
108
  from pmxt_internal.models.fetch_balance200_response import FetchBalance200Response as FetchBalance200Response
103
109
  from pmxt_internal.models.fetch_markets200_response import FetchMarkets200Response as FetchMarkets200Response
104
110
  from pmxt_internal.models.fetch_markets_request import FetchMarketsRequest as FetchMarketsRequest
@@ -113,6 +119,10 @@ from pmxt_internal.models.fetch_positions200_response import FetchPositions200Re
113
119
  from pmxt_internal.models.fetch_positions_request import FetchPositionsRequest as FetchPositionsRequest
114
120
  from pmxt_internal.models.fetch_trades200_response import FetchTrades200Response as FetchTrades200Response
115
121
  from pmxt_internal.models.fetch_trades_request import FetchTradesRequest as FetchTradesRequest
122
+ from pmxt_internal.models.get_execution_price200_response import GetExecutionPrice200Response as GetExecutionPrice200Response
123
+ from pmxt_internal.models.get_execution_price_detailed200_response import GetExecutionPriceDetailed200Response as GetExecutionPriceDetailed200Response
124
+ from pmxt_internal.models.get_execution_price_request import GetExecutionPriceRequest as GetExecutionPriceRequest
125
+ from pmxt_internal.models.get_execution_price_request_args_inner import GetExecutionPriceRequestArgsInner as GetExecutionPriceRequestArgsInner
116
126
  from pmxt_internal.models.get_markets_by_slug_request import GetMarketsBySlugRequest as GetMarketsBySlugRequest
117
127
  from pmxt_internal.models.health_check200_response import HealthCheck200Response as HealthCheck200Response
118
128
  from pmxt_internal.models.history_filter_params import HistoryFilterParams as HistoryFilterParams