git.delta.rocks / unique-network / refs/commits / b5d28e55f936

difftreelog

fix dynamic part offset should not include selector

Yaroslav Bolyukin2022-07-13parent: #12c8c8f.patch.diff
in: master

1 file changed

modifiedcrates/evm-coder/src/abi.rsdiffbeforeafterboth
184pub struct AbiWriter {184pub struct AbiWriter {
185 static_part: Vec<u8>,185 static_part: Vec<u8>,
186 dynamic_part: Vec<(usize, AbiWriter)>,186 dynamic_part: Vec<(usize, AbiWriter)>,
187 had_call: bool,
187}188}
188impl AbiWriter {189impl AbiWriter {
189 pub fn new() -> Self {190 pub fn new() -> Self {
192 pub fn new_call(method_id: u32) -> Self {193 pub fn new_call(method_id: u32) -> Self {
193 let mut val = Self::new();194 let mut val = Self::new();
194 val.static_part.extend(&method_id.to_be_bytes());195 val.static_part.extend(&method_id.to_be_bytes());
196 val.had_call = true;
195 val197 val
196 }198 }
197199
264266
265 pub fn finish(mut self) -> Vec<u8> {267 pub fn finish(mut self) -> Vec<u8> {
266 for (static_offset, part) in self.dynamic_part {268 for (static_offset, part) in self.dynamic_part {
267 let part_offset = self.static_part.len();269 let part_offset = self.static_part.len() - self.had_call.then(|| 4).unwrap_or(0);
268270
269 let encoded_dynamic_offset = usize::to_be_bytes(part_offset);271 let encoded_dynamic_offset = usize::to_be_bytes(part_offset);
270 self.static_part[static_offset + ABI_ALIGNMENT - encoded_dynamic_offset.len()272 self.static_part[static_offset + ABI_ALIGNMENT - encoded_dynamic_offset.len()