git.delta.rocks / unique-network / refs/commits / 5262156db57a

difftreelog

refactor move abi result to execution

Yaroslav Bolyukin2021-07-20parent: #f3ac592.patch.diff
in: master

1 file changed

modifiedcrates/evm-coder/src/abi.rsdiffbeforeafterboth
8 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};
1213
13use crate::types::string;14use crate::{execution::Error, types::string};
15use crate::execution::Result;
1416
15const ABI_ALIGNMENT: usize = 32;17const ABI_ALIGNMENT: usize = 32;
16
17pub type Result<T> = core::result::Result<T, &'static str>;
1818
19#[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]);
3737
38 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 empty
44 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 }
6969
75 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 }