diff --git a/src/polymarket/rfq.py b/src/polymarket/rfq.py index 237c182..d94118c 100644 --- a/src/polymarket/rfq.py +++ b/src/polymarket/rfq.py @@ -50,6 +50,8 @@ class RfqExecutionStatus(StrEnum): class RfqErrorCode(StrEnum): ADDRESS_MISMATCH = "ADDRESS_MISMATCH" + ALLOWANCE_VALIDATION_FAILED = "ALLOWANCE_VALIDATION_FAILED" + BALANCE_VALIDATION_FAILED = "BALANCE_VALIDATION_FAILED" CONTRADICTORY_LEGS = "CONTRADICTORY_LEGS" EXPIRED_RFQ = "EXPIRED_RFQ" INVALID_ACCEPTANCE = "INVALID_ACCEPTANCE" @@ -64,6 +66,7 @@ class RfqErrorCode(StrEnum): LEG_METADATA_UNAVAILABLE = "LEG_METADATA_UNAVAILABLE" MAKER_ALREADY_RESPONDED = "MAKER_ALREADY_RESPONDED" MAKER_NOT_REQUIRED = "MAKER_NOT_REQUIRED" + PRE_EXECUTION_BALANCE_RESERVATION_FAILED = "PRE_EXECUTION_BALANCE_RESERVATION_FAILED" QUOTE_MISMATCH = "QUOTE_MISMATCH" QUOTE_UNAVAILABLE = "QUOTE_UNAVAILABLE" RATE_LIMITED = "RATE_LIMITED" diff --git a/tests/integration/test_rfq.py b/tests/integration/test_rfq.py index a462a9e..02af98d 100644 --- a/tests/integration/test_rfq.py +++ b/tests/integration/test_rfq.py @@ -14,6 +14,7 @@ from polymarket.errors import TransportError, UnexpectedResponseError from polymarket.rfq import ( RfqConfirmationRequestEvent, + RfqErrorCode, RfqExecutionStatus, RfqQuoteRejectedError, RfqQuoteRequestEvent, @@ -363,8 +364,17 @@ async def handler(ws: ServerConnection) -> None: @pytest.mark.integration +@pytest.mark.parametrize( + "code", + [ + RfqErrorCode.ALLOWANCE_VALIDATION_FAILED, + RfqErrorCode.BALANCE_VALIDATION_FAILED, + RfqErrorCode.PRE_EXECUTION_BALANCE_RESERVATION_FAILED, + ], +) async def test_rfq_session_quote_rejection_raises_typed_error( require_env: Callable[[str], str], + code: RfqErrorCode, ) -> None: async def handler(ws: ServerConnection) -> None: async for raw in ws: @@ -380,7 +390,7 @@ async def handler(ws: ServerConnection) -> None: "type": "RFQ_ERROR", "request_type": "RFQ_QUOTE", "rfq_id": RFQ_ID, - "code": "INVALID_QUOTE", + "code": code, "error": "quote rejected", } ) @@ -393,8 +403,9 @@ async def handler(ws: ServerConnection) -> None: ): async for event in session: assert isinstance(event, RfqQuoteRequestEvent) - with pytest.raises(RfqQuoteRejectedError, match="quote rejected"): + with pytest.raises(RfqQuoteRejectedError, match="quote rejected") as exc_info: await event.quote(price=Decimal("0.45")) + assert exc_info.value.code == code break