Skip to content

Commit

Permalink
Fix issue with call stipend
Browse files Browse the repository at this point in the history
  • Loading branch information
sorpaas committed Nov 19, 2023
1 parent 9e55b21 commit f7ffe2c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
7 changes: 6 additions & 1 deletion src/gasometer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ pub trait Gasometer<S, H>: Sized {
}
fn record_codedeposit(&mut self, len: usize) -> Result<(), ExitError>;
fn gas(&self) -> U256;
fn submeter(&mut self, gas_limit: U256, code: &[u8]) -> Result<Self, ExitError>;
fn submeter(
&mut self,
gas_limit: U256,
call_has_value: bool,
code: &[u8],
) -> Result<Self, ExitError>;
fn merge(&mut self, other: Self, strategy: MergeStrategy);
}

Expand Down
14 changes: 12 additions & 2 deletions src/standard/gasometer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,14 +203,24 @@ impl<'config, S: AsRef<RuntimeState>, H: RuntimeBackend> GasometerT<S, H> for Ga
self.gas().into()
}

fn submeter(&mut self, gas_limit: U256, code: &[u8]) -> Result<Self, ExitError> {
let gas_limit = if gas_limit > U256::from(u64::MAX) {
fn submeter(
&mut self,
gas_limit: U256,
call_has_value: bool,
code: &[u8],
) -> Result<Self, ExitError> {
let mut gas_limit = if gas_limit > U256::from(u64::MAX) {
return Err(ExitException::OutOfGas.into());
} else {
gas_limit.as_u64()
};

self.record_cost(gas_limit)?;

if call_has_value {
gas_limit = gas_limit.saturating_add(self.config.call_stipend);
}

Ok(Self::new(gas_limit, code, self.config))
}

Expand Down
14 changes: 6 additions & 8 deletions src/standard/invoker/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,14 +356,12 @@ where
machine.gasometer.gas()
};
let target_gas = trap_data.target_gas().unwrap_or(after_gas);
let mut gas_limit = min(after_gas, target_gas);
let gas_limit = min(after_gas, target_gas);

match &trap_data {
CallCreateTrapData::Call(call) if call.has_value() => {
gas_limit = gas_limit.saturating_add(U256::from(self.config.call_stipend));
}
_ => (),
}
let call_has_value = match &trap_data {
CallCreateTrapData::Call(call) if call.has_value() => true,
_ => false,
};

let is_static = if machine.is_static {
true
Expand All @@ -377,7 +375,7 @@ where
let transaction_context = machine.machine.state.as_ref().transaction_context.clone();

let code = trap_data.code(handler);
let submeter = match machine.gasometer.submeter(gas_limit, &code) {
let submeter = match machine.gasometer.submeter(gas_limit, call_has_value, &code) {
Ok(submeter) => submeter,
Err(err) => return Capture::Exit(Err(err)),
};
Expand Down

0 comments on commit f7ffe2c

Please sign in to comment.