@@ -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+ }
0 commit comments