diff --git a/python/x402_a2a/src/x402_a2a/core/merchant.py b/python/x402_a2a/src/x402_a2a/core/merchant.py index a41af5f2..0972372c 100644 --- a/python/x402_a2a/src/x402_a2a/core/merchant.py +++ b/python/x402_a2a/src/x402_a2a/core/merchant.py @@ -51,6 +51,13 @@ def create_payment_requirements( PaymentRequirements object ready for x402PaymentRequiredResponse """ + if not isinstance(max_timeout_seconds, int) or isinstance( + max_timeout_seconds, bool + ): + raise ValueError("max_timeout_seconds must be an integer") + if max_timeout_seconds <= 0: + raise ValueError("max_timeout_seconds must be positive") + max_amount_required, asset_address, eip712_domain = process_price_to_atomic_amount( price, network ) diff --git a/python/x402_a2a/tests/test_core.py b/python/x402_a2a/tests/test_core.py index 16001db6..917c3c6d 100644 --- a/python/x402_a2a/tests/test_core.py +++ b/python/x402_a2a/tests/test_core.py @@ -26,6 +26,7 @@ SettleResponse, ) from x402_a2a.core.utils import x402Utils +from x402_a2a.core.merchant import create_payment_requirements # --- Fixtures --- @@ -129,6 +130,40 @@ def test_get_payment_payload_from_message(utils, sample_payment_payload): assert extracted_payload.payload.signature == "0xabc" +def test_create_payment_requirements_rejects_invalid_timeouts(monkeypatch): + """Payment requirements should not include invalid timeout values.""" + + monkeypatch.setattr( + "x402_a2a.core.merchant.process_price_to_atomic_amount", + lambda price, network: ("100", "0x456", {}), + ) + + for timeout in (0, -1, 1.5, True): + with pytest.raises(ValueError): + create_payment_requirements( + price="$1.00", + pay_to_address="0x123", + resource="/test", + max_timeout_seconds=timeout, + ) + + +def test_create_payment_requirements_accepts_positive_integer_timeout(monkeypatch): + monkeypatch.setattr( + "x402_a2a.core.merchant.process_price_to_atomic_amount", + lambda price, network: ("100", "0x456", {}), + ) + + requirements = create_payment_requirements( + price="$1.00", + pay_to_address="0x123", + resource="/test", + max_timeout_seconds=60, + ) + + assert requirements.max_timeout_seconds == 60 + + # --- Tests for x402ServerExecutor ---