From 379dfd1a522e50d1698ccf183a059c5d2d0d70b8 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com> Date: Fri, 28 Nov 2025 19:03:12 +0000 Subject: [PATCH 1/4] feat(precompiles): assert unique error selectors --- crates/precompiles/src/error.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/precompiles/src/error.rs b/crates/precompiles/src/error.rs index 8275277d4d..b9548c8923 100644 --- a/crates/precompiles/src/error.rs +++ b/crates/precompiles/src/error.rs @@ -95,7 +95,8 @@ pub fn add_errors_to_registry( let converter = Arc::new(converter); for selector in T::selectors() { let converter = Arc::clone(&converter); - registry.insert( + + let old_selector = registry.insert( selector.into(), Box::new(move |data: &[u8]| { T::abi_decode(data) @@ -106,6 +107,7 @@ pub fn add_errors_to_registry( }) }), ); + assert!(old_selector.is_none(), "Duplicate selector {selector:?}"); } } From 6eb344b373b4519be1458596e6637f433b7deff5 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com> Date: Fri, 28 Nov 2025 19:09:50 +0000 Subject: [PATCH 2/4] add test --- crates/precompiles/src/error.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/precompiles/src/error.rs b/crates/precompiles/src/error.rs index b9548c8923..c2d139cf33 100644 --- a/crates/precompiles/src/error.rs +++ b/crates/precompiles/src/error.rs @@ -256,3 +256,14 @@ impl IntoPrecompileResult for TempoPrecompileError { Ok(PrecompileOutput::new_reverted(gas, bytes)) } } + +#[cfg(test)] +mod tests { + use crate::error::error_decoder_registry; + + // Test that initializes the error decoder registry and fails if there are any duplicates. + #[test] + fn test_error_decoder_registry_init() { + error_decoder_registry(); + } +} From 42f519c4ab3a0c888148f842c444562ffc26118f Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com> Date: Fri, 28 Nov 2025 19:30:58 +0000 Subject: [PATCH 3/4] assertion message with hex selector --- crates/precompiles/src/error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/precompiles/src/error.rs b/crates/precompiles/src/error.rs index c2d139cf33..bfb03829c5 100644 --- a/crates/precompiles/src/error.rs +++ b/crates/precompiles/src/error.rs @@ -107,7 +107,7 @@ pub fn add_errors_to_registry( }) }), ); - assert!(old_selector.is_none(), "Duplicate selector {selector:?}"); + assert!(old_selector.is_none(), "Duplicate selector {selector:x?}"); } } From 882424f78e779897de0f0ec005a3051876851517 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin <5773434+shekhirin@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:07:40 +0000 Subject: [PATCH 4/4] assert -> debug_assert, so it fails only in tests and never in runtime --- crates/precompiles/src/error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/precompiles/src/error.rs b/crates/precompiles/src/error.rs index bfb03829c5..737a8ae2ea 100644 --- a/crates/precompiles/src/error.rs +++ b/crates/precompiles/src/error.rs @@ -107,7 +107,7 @@ pub fn add_errors_to_registry( }) }), ); - assert!(old_selector.is_none(), "Duplicate selector {selector:x?}"); + debug_assert!(old_selector.is_none(), "Duplicate selector {selector:x?}"); } }