Skip to content

Commit 08d7ec7

Browse files
authored
Fix Polymarket ws user message (#2963)
The ws message can contain a single message (which is not wrapped in a list). See https://docs.polymarket.com/developers/CLOB/websocket/user-channel
1 parent efeee3a commit 08d7ec7

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

nautilus_trader/adapters/polymarket/execution.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,8 @@ def _handle_ws_message(self, raw: bytes) -> None:
961961
)
962962

963963
ws_message = self._decoder_user_msg.decode(raw)
964+
if not isinstance(ws_message, list):
965+
ws_message = [ws_message]
964966
for msg in ws_message:
965967
if isinstance(msg, PolymarketUserOrder):
966968
self._handle_ws_order_msg(msg, wait_for_ack=True)

nautilus_trader/adapters/polymarket/websocket/types.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,6 @@
3030
| PolymarketTrade
3131
| PolymarketTickSizeChange
3232
]
33-
USER_WS_MESSAGE: Final = list[PolymarketUserOrder | PolymarketUserTrade]
33+
USER_WS_MESSAGE: Final = (
34+
list[PolymarketUserOrder | PolymarketUserTrade] | PolymarketUserOrder | PolymarketUserTrade
35+
)

tests/integration_tests/adapters/polymarket/test_parsing.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from nautilus_trader.adapters.polymarket.schemas.book import PolymarketTrade
2929
from nautilus_trader.adapters.polymarket.schemas.user import PolymarketUserOrder
3030
from nautilus_trader.adapters.polymarket.schemas.user import PolymarketUserTrade
31+
from nautilus_trader.adapters.polymarket.websocket.types import USER_WS_MESSAGE
3132
from nautilus_trader.model.data import OrderBookDeltas
3233
from nautilus_trader.model.data import TradeTick
3334
from nautilus_trader.model.enums import AggressorSide
@@ -184,6 +185,31 @@ def test_parse_order_placement() -> None:
184185
assert isinstance(msg, PolymarketUserOrder)
185186

186187

188+
@pytest.mark.parametrize("wrap_list", [False, True])
189+
def test_parse_user_ws_message(wrap_list: bool) -> None:
190+
# Arrange
191+
data = pkgutil.get_data(
192+
"tests.integration_tests.adapters.polymarket.resources.ws_messages",
193+
"order_placement.json",
194+
)
195+
assert data
196+
197+
decoder = msgspec.json.Decoder(USER_WS_MESSAGE)
198+
199+
if wrap_list:
200+
data = b"[" + data + b"]"
201+
202+
# Act
203+
msg = decoder.decode(data)
204+
205+
# Assert
206+
if wrap_list:
207+
assert isinstance(msg, list)
208+
assert isinstance(msg[0], PolymarketUserOrder)
209+
else:
210+
assert isinstance(msg, PolymarketUserOrder)
211+
212+
187213
def test_parse_order_cancel() -> None:
188214
# Arrange
189215
data = pkgutil.get_data(

0 commit comments

Comments
 (0)