From c7ee9bc2fc33f3341d2ce8af9c7d86edc2405c2c Mon Sep 17 00:00:00 2001 From: zjb0807 Date: Tue, 14 Jan 2025 10:06:00 +0800 Subject: [PATCH 1/2] fix type conversion related to as_u* --- modules/evm-bridge/src/lib.rs | 12 ++++++++---- modules/evm/src/precompiles/modexp.rs | 8 ++++++-- modules/evm/src/runner/stack.rs | 8 ++++---- orml | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/modules/evm-bridge/src/lib.rs b/modules/evm-bridge/src/lib.rs index 339785a486..15524bc915 100644 --- a/modules/evm-bridge/src/lib.rs +++ b/modules/evm-bridge/src/lib.rs @@ -368,16 +368,20 @@ impl Pallet { Error::::InvalidReturnValue ); - let offset = U256::from_big_endian(&output[0..32]); - let length = U256::from_big_endian(&output[offset.as_usize()..offset.as_usize() + 32]); + let offset = U256::from_big_endian(&output.get(0..32).unwrap_or_default()); + let offset: usize = offset.try_into().map_err(|_| Error::::InvalidReturnValue)?; + let offset_end = offset.checked_add(32).ok_or(Error::::InvalidReturnValue)?; + let length = U256::from_big_endian(&output.get(offset..offset_end).unwrap_or_default()); + let length: usize = length.try_into().map_err(|_| Error::::InvalidReturnValue)?; + let length_end = offset_end.checked_add(length).ok_or(Error::::InvalidReturnValue)?; ensure!( // output is 32-byte aligned. ensure total_length >= offset + string length + string data length. - output.len() >= offset.as_usize() + 32 + length.as_usize(), + output.len() >= length_end, Error::::InvalidReturnValue ); let mut data = Vec::new(); - data.extend_from_slice(&output[offset.as_usize() + 32..offset.as_usize() + 32 + length.as_usize()]); + data.extend_from_slice(&output.get(offset_end..length_end).unwrap_or_default()); Ok(data.to_vec()) } diff --git a/modules/evm/src/precompiles/modexp.rs b/modules/evm/src/precompiles/modexp.rs index b1e7a29da4..027b1c9576 100644 --- a/modules/evm/src/precompiles/modexp.rs +++ b/modules/evm/src/precompiles/modexp.rs @@ -279,8 +279,12 @@ impl Precompile for IstanbulModexp { }); } let cost = ModexpPricer::cost(Self::DIVISOR, input); + let cost = TryInto::::try_into(cost).map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::OutOfGas, + })?; + if let Some(target_gas) = target_gas { - if cost > U256::from(u64::MAX) || target_gas < cost.as_u64() { + if target_gas < cost { return Err(PrecompileFailure::Error { exit_status: ExitError::OutOfGas, }); @@ -288,7 +292,7 @@ impl Precompile for IstanbulModexp { } let output = Self::execute_modexp(input); - handle.record_cost(cost.as_u64())?; + handle.record_cost(cost)?; Ok(PrecompileOutput { exit_status: ExitSucceed::Returned, diff --git a/modules/evm/src/runner/stack.rs b/modules/evm/src/runner/stack.rs index 11566857a5..8287e03ea0 100644 --- a/modules/evm/src/runner/stack.rs +++ b/modules/evm/src/runner/stack.rs @@ -633,11 +633,11 @@ impl<'vicinity, 'config, T: Config> BackendT for SubstrateStackState<'vicinity, } fn block_hash(&self, number: U256) -> H256 { - if number > U256::from(u32::MAX) { - H256::default() - } else { - let number = BlockNumberFor::::from(number.as_u32()); + if let Ok(number) = TryInto::::try_into(number) { + let number = BlockNumberFor::::from(number); H256::from_slice(frame_system::Pallet::::block_hash(number).as_ref()) + } else { + H256::default() } } diff --git a/orml b/orml index 8c332b1f02..fbfced8447 160000 --- a/orml +++ b/orml @@ -1 +1 @@ -Subproject commit 8c332b1f025558d198b90b3f4f3de14226fa1846 +Subproject commit fbfced844780f52520b0337bb9c80fb2a3508c54 From ed66d6a441bf05949925d3033afbbeb3338f1a3c Mon Sep 17 00:00:00 2001 From: zjb0807 Date: Tue, 14 Jan 2025 10:38:05 +0800 Subject: [PATCH 2/2] fix clippy --- modules/evm-bridge/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/evm-bridge/src/lib.rs b/modules/evm-bridge/src/lib.rs index 15524bc915..4253549c64 100644 --- a/modules/evm-bridge/src/lib.rs +++ b/modules/evm-bridge/src/lib.rs @@ -368,10 +368,10 @@ impl Pallet { Error::::InvalidReturnValue ); - let offset = U256::from_big_endian(&output.get(0..32).unwrap_or_default()); + let offset = U256::from_big_endian(output.get(0..32).unwrap_or_default()); let offset: usize = offset.try_into().map_err(|_| Error::::InvalidReturnValue)?; let offset_end = offset.checked_add(32).ok_or(Error::::InvalidReturnValue)?; - let length = U256::from_big_endian(&output.get(offset..offset_end).unwrap_or_default()); + let length = U256::from_big_endian(output.get(offset..offset_end).unwrap_or_default()); let length: usize = length.try_into().map_err(|_| Error::::InvalidReturnValue)?; let length_end = offset_end.checked_add(length).ok_or(Error::::InvalidReturnValue)?; ensure!( @@ -381,7 +381,7 @@ impl Pallet { ); let mut data = Vec::new(); - data.extend_from_slice(&output.get(offset_end..length_end).unwrap_or_default()); + data.extend_from_slice(output.get(offset_end..length_end).unwrap_or_default()); Ok(data.to_vec()) }