From 172171f1f2a3756c349d1a8ba2734771883b8df0 Mon Sep 17 00:00:00 2001 From: Tommy Verrall Date: Wed, 22 Apr 2026 16:45:41 +0100 Subject: [PATCH] fix(ip-packet-requests): accept v8 IPR replies from v9 clients v9 reuses v8 bincode types; strict version check dropped connect responses from older exit gateways and caused TimeoutWaitingForConnectResponse. --- .../src/response_helpers.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/common/ip-packet-requests/src/response_helpers.rs b/common/ip-packet-requests/src/response_helpers.rs index 5caa81ab0d..2d21893f27 100644 --- a/common/ip-packet-requests/src/response_helpers.rs +++ b/common/ip-packet-requests/src/response_helpers.rs @@ -37,15 +37,22 @@ pub enum MixnetMessageOutcome { // nym-ip-packet-client/src/helpers.rs — check_ipr_message_version() // sdk/rust/nym-sdk/src/ip_packet_client/listener.rs — check_ipr_message_version() /// Check that the first byte of an IPR message matches the expected protocol version. +/// +/// v9 reuses the v8 bincode layout (`nym_ip_packet_requests::v9` re-exports v8 types). Until all +/// exit gateways run a release that tags IPR traffic as v9, a v9 client may still receive v8 +/// replies; treat those as compatible for deserialization and handling. pub fn check_ipr_message_version(data: &[u8], expected: u8) -> Result<(), IprResponseError> { let version = data.first().ok_or(IprResponseError::NoVersionByte)?; - if *version != expected { - return Err(IprResponseError::VersionMismatch { - expected, - received: *version, - }); + if *version == expected { + return Ok(()); } - Ok(()) + if expected == 9 && *version == 8 { + return Ok(()); + } + Err(IprResponseError::VersionMismatch { + expected, + received: *version, + }) } // Extracted from: