@@ -118,15 +118,27 @@ pub fn adjust_signed_value(number: I256, bits: usize) -> Result<U256, SignerErro
118118 return SignerError :: invalid_input_err ( format ! ( "Value out of range for signed integer with {bits} bits" ) ) ;
119119 }
120120
121- if bits == MAX_WORD_BYTES * 8 {
122- return Ok ( number. into_raw ( ) ) ;
123- }
121+ Ok ( number. into_raw ( ) )
122+ }
123+
124+ #[ cfg( test) ]
125+ mod tests {
126+ use alloy_primitives:: I256 ;
127+
128+ use super :: { MAX_WORD_BYTES , adjust_signed_value} ;
129+
130+ #[ test]
131+ fn test_adjust_signed_value ( ) {
132+ let negative = adjust_signed_value ( I256 :: try_from ( -42 ) . unwrap ( ) , 32 ) . unwrap ( ) . to_be_bytes :: < MAX_WORD_BYTES > ( ) ;
133+ assert_eq ! ( negative[ ..31 ] , [ 0xff ; 31 ] ) ;
134+ assert_eq ! ( negative[ 31 ] , 0xd6 ) ;
135+
136+ let positive = adjust_signed_value ( I256 :: try_from ( 42 ) . unwrap ( ) , 32 ) . unwrap ( ) . to_be_bytes :: < MAX_WORD_BYTES > ( ) ;
137+ assert_eq ! ( positive[ ..31 ] , [ 0 ; 31 ] ) ;
138+ assert_eq ! ( positive[ 31 ] , 42 ) ;
124139
125- if number. is_negative ( ) {
126- let abs = number. unsigned_abs ( ) ;
127- let modulus = U256 :: from ( 1u64 ) << bits;
128- modulus. checked_sub ( abs) . ok_or_else ( || SignerError :: invalid_input ( "Failed to encode signed integer" ) )
129- } else {
130- Ok ( number. unsigned_abs ( ) )
140+ assert ! ( adjust_signed_value( I256 :: try_from( -( 1i128 << 31 ) ) . unwrap( ) , 32 ) . is_ok( ) ) ;
141+ assert ! ( adjust_signed_value( I256 :: try_from( 1i128 << 31 ) . unwrap( ) , 32 ) . is_err( ) ) ;
142+ assert ! ( adjust_signed_value( I256 :: try_from( -( 1i128 << 31 ) - 1 ) . unwrap( ) , 32 ) . is_err( ) ) ;
131143 }
132144}
0 commit comments