difftreelog
refactor move abi result to execution
in: master
1 file changed
crates/evm-coder/src/abi.rsdiffbeforeafterboth8 string::{String, ToString},8 string::{String, ToString},9 vec::Vec,9 vec::Vec,10};10};11use evm_core::ExitError;11use primitive_types::{H160, U256};12use primitive_types::{H160, U256};121313use crate::types::string;14use crate::{execution::Error, types::string};15use crate::execution::Result;141615const ABI_ALIGNMENT: usize = 32;17const ABI_ALIGNMENT: usize = 32;1617pub type Result<T> = core::result::Result<T, &'static str>;181819#[derive(Clone)]19#[derive(Clone)]20pub struct AbiReader<'i> {20pub struct AbiReader<'i> {27 }27 }28 pub fn new_call(buf: &'i [u8]) -> Result<(u32, Self)> {28 pub fn new_call(buf: &'i [u8]) -> Result<(u32, Self)> {29 if buf.len() < 4 {29 if buf.len() < 4 {30 return Err("missing method id");30 return Err(Error::Error(ExitError::OutOfOffset));31 }31 }32 let mut method_id = [0; 4];32 let mut method_id = [0; 4];33 method_id.copy_from_slice(&buf[0..4]);33 method_id.copy_from_slice(&buf[0..4]);373738 fn read_padleft<const S: usize>(&mut self) -> Result<[u8; S]> {38 fn read_padleft<const S: usize>(&mut self) -> Result<[u8; S]> {39 if self.buf.len() - self.offset < 32 {39 if self.buf.len() - self.offset < 32 {40 return Err("missing padding");40 return Err(Error::Error(ExitError::OutOfOffset));41 }41 }42 let mut block = [0; S];42 let mut block = [0; S];43 // Verify padding is empty43 // Verify padding is empty44 if !self.buf[self.offset..self.offset + ABI_ALIGNMENT - S]44 if !self.buf[self.offset..self.offset + ABI_ALIGNMENT - S]45 .iter()45 .iter()46 .all(|&v| v == 0)46 .all(|&v| v == 0)47 {47 {48 return Err("non zero padding (wrong types?)");48 return Err(Error::Error(ExitError::InvalidRange));49 }49 }50 block.copy_from_slice(50 block.copy_from_slice(51 &self.buf[self.offset + ABI_ALIGNMENT - S..self.offset + ABI_ALIGNMENT],51 &self.buf[self.offset + ABI_ALIGNMENT - S..self.offset + ABI_ALIGNMENT],63 match data[0] {63 match data[0] {64 0 => Ok(false),64 0 => Ok(false),65 1 => Ok(true),65 1 => Ok(true),66 _ => Err("wrong bool value"),66 _ => Err(Error::Error(ExitError::InvalidRange)),67 }67 }68 }68 }696975 let mut subresult = self.subresult()?;75 let mut subresult = self.subresult()?;76 let length = subresult.read_usize()?;76 let length = subresult.read_usize()?;77 if subresult.buf.len() <= subresult.offset + length {77 if subresult.buf.len() <= subresult.offset + length {78 return Err("bytes out of bounds");78 return Err(Error::Error(ExitError::OutOfOffset));79 }79 }80 Ok(subresult.buf[subresult.offset..subresult.offset + length].into())80 Ok(subresult.buf[subresult.offset..subresult.offset + length].into())81 }81 }