From 84bc698ac2d6ef58ec95b3dbeb91b3d272f4cbaf Mon Sep 17 00:00:00 2001 From: Guido Vranken Date: Tue, 9 Jan 2024 18:40:23 +0100 Subject: [PATCH] Fix balance and gas overflows in CrossContractCall --- engine-precompiles/src/xcc.rs | 2 +- engine-types/src/parameters/promise.rs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/engine-precompiles/src/xcc.rs b/engine-precompiles/src/xcc.rs index 8bfa7e660..de8d865de 100644 --- a/engine-precompiles/src/xcc.rs +++ b/engine-precompiles/src/xcc.rs @@ -148,7 +148,7 @@ impl HandleBasedPrecompile for CrossContractCall { .try_to_vec() .map_err(|_| ExitError::Other(Cow::from(consts::ERR_SERIALIZE)))?, attached_balance: ZERO_YOCTO, - attached_gas: router_exec_cost + call_gas, + attached_gas: router_exec_cost.saturating_add(call_gas), }; (promise, attached_near) } diff --git a/engine-types/src/parameters/promise.rs b/engine-types/src/parameters/promise.rs index 1ec0c2c20..a857247c9 100644 --- a/engine-types/src/parameters/promise.rs +++ b/engine-types/src/parameters/promise.rs @@ -122,7 +122,7 @@ impl NearPromise { pub fn total_gas(&self) -> NearGas { match self { Self::Simple(x) => x.total_gas(), - Self::Then { base, callback } => base.total_gas() + callback.total_gas(), + Self::Then { base, callback } => base.total_gas().saturating_add(callback.total_gas()), Self::And(promises) => { let total = promises.iter().map(|p| p.total_gas().as_u64()).sum(); NearGas::new(total) @@ -134,7 +134,9 @@ impl NearPromise { pub fn total_near(&self) -> Yocto { match self { Self::Simple(x) => x.total_near(), - Self::Then { base, callback } => base.total_near() + callback.total_near(), + Self::Then { base, callback } => { + base.total_near().saturating_add(callback.total_near()) + } Self::And(promises) => { let total = promises.iter().map(|p| p.total_near().as_u128()).sum(); Yocto::new(total)