Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions binaries/cairo-native-bin-utils/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ pub fn run_tests(
.or_else(|| {
gas_metadata
.initial_required_gas(&func.id)
.unwrap()
.map(|gas| gas.try_into().unwrap())
});

Expand Down
9 changes: 3 additions & 6 deletions src/executor/aot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,7 @@ impl AotNativeExecutor {
) -> Result<ExecutionResult, Error> {
let available_gas = self
.gas_metadata
.get_initial_available_gas(function_id, gas)
.map_err(crate::error::Error::GasMetadataError)?;
.get_initial_available_gas(function_id, gas)?;

super::invoke_dynamic(
&self.registry,
Expand All @@ -121,8 +120,7 @@ impl AotNativeExecutor {
) -> Result<ExecutionResult, Error> {
let available_gas = self
.gas_metadata
.get_initial_available_gas(function_id, gas)
.map_err(crate::error::Error::GasMetadataError)?;
.get_initial_available_gas(function_id, gas)?;

super::invoke_dynamic(
&self.registry,
Expand All @@ -144,8 +142,7 @@ impl AotNativeExecutor {
) -> Result<ContractExecutionResult, Error> {
let available_gas = self
.gas_metadata
.get_initial_available_gas(function_id, gas)
.map_err(crate::error::Error::GasMetadataError)?;
.get_initial_available_gas(function_id, gas)?;

ContractExecutionResult::from_execution_result(super::invoke_dynamic(
&self.registry,
Expand Down
9 changes: 3 additions & 6 deletions src/executor/jit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,7 @@ impl<'m> JitNativeExecutor<'m> {
) -> Result<ExecutionResult, Error> {
let available_gas = self
.gas_metadata
.get_initial_available_gas(function_id, gas)
.map_err(crate::error::Error::GasMetadataError)?;
.get_initial_available_gas(function_id, gas)?;

super::invoke_dynamic(
&self.registry,
Expand All @@ -118,8 +117,7 @@ impl<'m> JitNativeExecutor<'m> {
) -> Result<ExecutionResult, Error> {
let available_gas = self
.gas_metadata
.get_initial_available_gas(function_id, gas)
.map_err(crate::error::Error::GasMetadataError)?;
.get_initial_available_gas(function_id, gas)?;

super::invoke_dynamic(
&self.registry,
Expand All @@ -141,8 +139,7 @@ impl<'m> JitNativeExecutor<'m> {
) -> Result<ContractExecutionResult, Error> {
let available_gas = self
.gas_metadata
.get_initial_available_gas(function_id, gas)
.map_err(crate::error::Error::GasMetadataError)?;
.get_initial_available_gas(function_id, gas)?;

ContractExecutionResult::from_execution_result(super::invoke_dynamic(
&self.registry,
Expand Down
31 changes: 19 additions & 12 deletions src/metadata/gas.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ use cairo_lang_sierra_to_casm::metadata::{
MetadataComputationConfig, MetadataError as CairoGasMetadataError,
};

use crate::{error::Result as NativeResult, native_panic};
use crate::{
error::{Error, Result as NativeResult},
native_panic,
};

use std::{collections::BTreeMap, fmt, ops::Deref};

Expand Down Expand Up @@ -69,39 +72,43 @@ impl GasMetadata {
&self,
func: &FunctionId,
available_gas: Option<u64>,
) -> Result<u64, GasMetadataError> {
) -> Result<u64, Error> {
let Some(available_gas) = available_gas else {
return Ok(0);
};

// In case we don't have any costs - it means no gas equations were solved (and we are in
// the case of no gas checking enabled) - so the gas builtin is irrelevant, and we
// can return any value.
let Some(required_gas) = self.initial_required_gas(func) else {
let Some(required_gas) = self.initial_required_gas(func)? else {
return Ok(0);
};

available_gas
.checked_sub(required_gas)
.ok_or(GasMetadataError::NotEnoughGas {
.ok_or(Error::GasMetadataError(GasMetadataError::NotEnoughGas {
gas: Box::new((required_gas, available_gas)),
})
}))
}

pub fn initial_required_gas(&self, func: &FunctionId) -> Option<u64> {
pub fn initial_required_gas(&self, func: &FunctionId) -> Result<Option<u64>, Error> {
if self.gas_info.function_costs.is_empty() {
return None;
return Ok(None);
}
Some(
Ok(Some(
self.gas_info.function_costs[func]
.iter()
.map(|(token_type, val)| {
TryInto::<usize>::try_into(*val)
.expect("could not cast gas cost from i64 to usize")
* token_gas_cost(*token_type)
let Ok(val) = TryInto::<usize>::try_into(*val) else {
native_panic!("could not cast gas cost from i64 to usize");
};

Ok(val * token_gas_cost(*token_type))
})
.collect::<Result<Vec<_>, _>>()?
.iter()
.sum::<usize>() as u64,
)
))
}

pub fn initial_required_gas_for_entry_points(
Expand Down
Loading