Skip to content

Commit cbe5087

Browse files
CalldataReader argotorg#900
Implement CallDataReader, as per the tasks of issue argotorg#900
1 parent c92ff1b commit cbe5087

2 files changed

Lines changed: 81 additions & 5 deletions

File tree

crates/library/std/src/buf.fe

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,85 @@ pub struct RawCallBuffer {
309309
return self.buf.offset()
310310
}
311311

312-
pub fn reader(self) -> MemoryBufferReader {
313-
return self.buf.reader()
312+
pub fn reader(self) -> RawCallBufferReader {
313+
return RawCallBufferReader::new(buf: self)
314314
}
315315

316316
pub fn writer(mut self) -> MemoryBufferWriter {
317317
return self.buf.writer()
318318
}
319319
}
320+
321+
pub struct RawCallBufferReader {
322+
buf: RawCallBuffer
323+
/// Returns a new reader for the given buffer.
324+
pub fn new(buf: RawCallBuffer) -> Self {
325+
return RawCallBufferReader(buf)
326+
}
327+
328+
fn read_offset(mut self, len: u256) -> u256 {
329+
return self.buf.offset()
330+
}
331+
332+
fn read_n(mut self, len: u256) -> u256 {
333+
let offset: u256 = self.read_offset(len)
334+
unsafe {
335+
let value: u256 = evm::mload(offset)
336+
return evm::shr(bits: 256 - len * 8, value)
337+
}
338+
}
339+
340+
pub fn read_u8(mut self) -> u8 {
341+
return u8(self.read_n(len: 1))
342+
}
343+
344+
pub fn read_u16(mut self) -> u16 {
345+
return u16(self.read_n(len: 2))
346+
}
347+
348+
pub fn read_u32(mut self) -> u32 {
349+
return u32(self.read_n(len: 4))
350+
}
351+
352+
pub fn read_u64(mut self) -> u64 {
353+
return u64(self.read_n(len: 8))
354+
}
355+
356+
pub fn read_u128(mut self) -> u128 {
357+
return u128(self.read_n(len: 16))
358+
}
359+
360+
pub fn read_u256(mut self) -> u256 {
361+
let offset: u256 = self.read_offset(len: 32)
362+
unsafe {
363+
let value: u256 = evm::mload(offset)
364+
return value
365+
}
366+
}
367+
368+
// pub fn read_buf(mut self, len: u256) -> RawCallBuffer {
369+
// let mut buf: RawCallBuffer = RawCallBuffer::new(len)
370+
// let mut writer: MemoryBufferWriter = buf.writer()
371+
//
372+
// while true {
373+
// let bytes_remaining: u256 = writer.remainder()
374+
//
375+
// if bytes_remaining >= 32 {
376+
// writer.write(value: self.read_u256())
377+
// } else if bytes_remaining == 0 {
378+
// break
379+
// } else {
380+
// writer.write(value: self.read_u8())
381+
// }
382+
// }
383+
//
384+
// return buf
385+
// }
386+
387+
// `T` has not been defined
388+
// pub fn read<T: MemoryBufferRead>(mut self) -> T {
389+
// T::read_buf(writer: self)
390+
// }
391+
392+
393+
}

crates/tests/fixtures/files/raw_call.fe

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::buf::{
22
RawCallBuffer,
3-
MemoryBufferReader,
43
MemoryBufferWriter,
5-
MemoryBuffer
4+
MemoryBuffer,
5+
RawCallBufferReader
66
}
77
use std::evm
88

@@ -34,7 +34,9 @@ fn test_raw_call(mut ctx: Context) {
3434

3535
writer.write(value: 42)
3636
assert ctx.raw_call(addr: address(foo), value: 0, buf)
37-
let mut reader: MemoryBufferReader = buf.reader()
37+
let mut reader: RawCallBufferReader = RawCallBufferReader::new(
38+
buf
39+
)
3840
assert reader.read_u256() == 26
3941

4042
assert not ctx.raw_call(addr: address(foo), value: 0, buf)

0 commit comments

Comments
 (0)