Skip to content

Commit

Permalink
Rework ResourceBounds struct (#2075)
Browse files Browse the repository at this point in the history
<!-- Reference any GitHub issues resolved by this PR -->

## Introduced changes

<!-- A brief description of the changes -->

- Rework `ResourceBounds` to make it more readable
  • Loading branch information
Draggu authored Apr 26, 2024
1 parent 7451cca commit 6c11c8f
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use cairo_vm::{
types::relocatable::{MaybeRelocatable, Relocatable},
vm::vm_core::VirtualMachine,
};
use conversions::{FromConv, IntoConv};
use conversions::{felt252::SerializeAsFelt252Vec, FromConv, IntoConv};

use crate::{
runtime_extensions::forge_runtime_extension::cheatcodes::spoof::TxInfoMock, state::CheatedData,
Expand Down Expand Up @@ -91,7 +91,7 @@ fn get_cheated_tx_info_ptr(
};
if let Some(resource_bounds) = resource_bounds {
let (resource_bounds_start_ptr, resource_bounds_end_ptr) =
add_vec_memory_segment(&resource_bounds, vm);
add_vec_memory_segment(&resource_bounds.serialize_as_felt252_vec(), vm);
new_tx_info[8] = resource_bounds_start_ptr.into();
new_tx_info[9] = resource_bounds_end_ptr.into();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,21 @@
use crate::state::{start_cheat, stop_cheat, CheatSpan, CheatTarget};
use crate::CheatnetState;
use cairo_felt::Felt252;
use num_traits::ToPrimitive;
use runtime::utils::buffer_reader::{BufferReadError, BufferReadResult, BufferReader};
use runtime::utils::from_reader::FromReader;
use conversions::felt252::SerializeAsFelt252Vec;
use runtime::FromReader;
use std::ops::Deref;

#[derive(Clone, Default, Debug, PartialEq)]
pub struct ResourceBounds(pub Vec<Felt252>);

impl Deref for ResourceBounds {
type Target = Vec<Felt252>;

fn deref(&self) -> &Self::Target {
&self.0
}
#[derive(FromReader, Clone, Default, Debug, PartialEq)]
pub struct ResourceBounds {
pub resource: Felt252,
pub max_amount: u64,
pub max_price_per_unit: u128,
}

impl FromReader for ResourceBounds {
fn from_reader(reader: &mut BufferReader<'_>) -> BufferReadResult<Self> {
let count: Felt252 = reader.read()?;

let count = count.to_usize().ok_or(BufferReadError::ParseFailed)?;
let result = reader.read_slice(count * 3)?; // ResourceBounds struct has 3 fields

Ok(ResourceBounds(result.to_owned()))
impl SerializeAsFelt252Vec for ResourceBounds {
fn serialize_into_felt252_vec(self, output: &mut Vec<Felt252>) {
output.push(self.resource);
output.push(self.max_amount.into());
output.push(self.max_price_per_unit.into());
}
}

Expand All @@ -38,7 +28,7 @@ pub struct TxInfoMock {
pub transaction_hash: Option<Felt252>,
pub chain_id: Option<Felt252>,
pub nonce: Option<Felt252>,
pub resource_bounds: Option<ResourceBounds>,
pub resource_bounds: Option<Vec<ResourceBounds>>,
pub tip: Option<Felt252>,
pub paymaster_data: Option<Vec<Felt252>>,
pub nonce_data_availability_mode: Option<Felt252>,
Expand Down
22 changes: 13 additions & 9 deletions crates/cheatnet/tests/cheatcodes/spoof.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ struct TxInfo {
pub transaction_hash: Felt252,
pub chain_id: Felt252,
pub nonce: Felt252,
pub resource_bounds: ResourceBounds,
pub resource_bounds: Vec<ResourceBounds>,
pub tip: Felt252,
pub paymaster_data: Vec<Felt252>,
pub nonce_data_availability_mode: Felt252,
Expand Down Expand Up @@ -135,14 +135,18 @@ fn start_spoof_multiple_times() {
transaction_hash: Some(Felt252::from(123)),
chain_id: Some(Felt252::from(22)),
nonce: Some(Felt252::from(33)),
resource_bounds: Some(ResourceBounds(vec![
Felt252::from(111),
Felt252::from(222),
Felt252::from(333),
Felt252::from(444),
Felt252::from(555),
Felt252::from(666),
])),
resource_bounds: Some(vec![
ResourceBounds {
resource: Felt252::from(111),
max_amount: 222,
max_price_per_unit: 333,
},
ResourceBounds {
resource: Felt252::from(444),
max_amount: 555,
max_price_per_unit: 666,
},
]),
tip: Some(Felt252::from(777)),
paymaster_data: Some(vec![
Felt252::from(11),
Expand Down
13 changes: 7 additions & 6 deletions crates/conversions/src/felt252.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,14 @@ pub trait SerializeAsFelt252Vec: Sized {
}
}

impl SerializeAsFelt252Vec for Vec<Felt252> {
impl<T> SerializeAsFelt252Vec for Vec<T>
where
T: SerializeAsFelt252Vec,
{
fn serialize_into_felt252_vec(self, output: &mut Vec<Felt252>) {
output.extend(self);
}

fn serialize_as_felt252_vec(self) -> Vec<Felt252> {
self
for e in self {
e.serialize_into_felt252_vec(output);
}
}
}

Expand Down
10 changes: 0 additions & 10 deletions crates/runtime/src/utils/buffer_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,6 @@ impl<'b> BufferReader<'b> {
BufferReader::<'a> { buffer, idx: 0 }
}

pub fn read_slice(&mut self, length: usize) -> BufferReadResult<&'b [Felt252]> {
let start = self.idx;

self.idx += length;

self.buffer
.get(start..self.idx)
.ok_or(BufferReadError::EndOfBuffer)
}

pub fn read<T>(&mut self) -> BufferReadResult<T>
where
T: FromReader,
Expand Down
16 changes: 9 additions & 7 deletions crates/runtime/src/utils/from_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use super::buffer_reader::{BufferReadError, BufferReadResult, BufferReader};
use cairo_felt::{felt_str, Felt252};
use cairo_lang_runner::short_string::as_cairo_short_string_ex;
use cairo_lang_utils::byte_array::{BYTES_IN_WORD, BYTE_ARRAY_MAGIC};
use conversions::{FromConv, IntoConv};
use conversions::IntoConv;
use num_traits::cast::ToPrimitive;
use num_traits::One;
use starknet::core::types::FieldElement;
Expand Down Expand Up @@ -65,17 +65,19 @@ impl FromReader for Felt252 {

impl<T> FromReader for Vec<T>
where
T: FromConv<Felt252>,
T: FromReader,
{
fn from_reader(reader: &mut BufferReader<'_>) -> BufferReadResult<Self> {
let length: Felt252 = reader.read()?;
let length = length.to_usize().ok_or(BufferReadError::ParseFailed)?;

Ok(reader
.read_slice(length)?
.iter()
.map(|felt| felt.clone().into_())
.collect::<Vec<_>>())
let mut result = Vec::with_capacity(length);

for _ in 0..length {
result.push(reader.read()?);
}

Ok(result)
}
}

Expand Down

0 comments on commit 6c11c8f

Please sign in to comment.