git.delta.rocks / unique-network / refs/commits / 895a035cdc96

difftreelog

source

crates/evm-coder/src/execution.rs3.1 KiBsourcehistory
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617//! Contract execution related types1819#[cfg(not(feature = "std"))]20use alloc::string::{String, ToString};21use evm_core::{ExitError, ExitFatal};22#[cfg(feature = "std")]23use std::string::{String, ToString};2425use crate::Weight;2627/// Execution error, should be convertible between EVM and Substrate.28#[derive(Debug, Clone)]29pub enum Error {30	/// Non-fatal contract error occured31	Revert(String),32	/// EVM fatal error33	Fatal(ExitFatal),34	/// EVM normal error35	Error(ExitError),36}3738impl<E> From<E> for Error39where40	E: ToString,41{42	fn from(e: E) -> Self {43		Self::Revert(e.to_string())44	}45}4647/// To be used in [`crate::solidity_interface`] implementation.48pub type Result<T> = core::result::Result<T, Error>;4950/// Static information collected from [`crate::weight`].51pub struct DispatchInfo {52	/// Statically predicted call weight53	pub weight: Weight,54}5556impl From<Weight> for DispatchInfo {57	fn from(weight: Weight) -> Self {58		Self { weight }59	}60}61impl From<u64> for DispatchInfo {62	fn from(weight: u64) -> Self {63		Self {64			weight: Weight::from_ref_time(weight),65		}66	}67}68impl From<()> for DispatchInfo {69	fn from(_: ()) -> Self {70		Self {71			weight: Weight::zero(),72		}73	}74}7576/// Weight information that is only available post dispatch.77/// Note: This can only be used to reduce the weight or fee, not increase it.78#[derive(Default, Clone)]79pub struct PostDispatchInfo {80	/// Actual weight consumed by call81	actual_weight: Option<Weight>,82}8384impl PostDispatchInfo {85	/// Calculate amount to be returned back to user86	pub fn calc_unspent(&self, info: &DispatchInfo) -> Weight {87		info.weight - self.calc_actual_weight(info)88	}8990	/// Calculate actual consumed weight, saturating to weight reported91	/// pre-dispatch92	pub fn calc_actual_weight(&self, info: &DispatchInfo) -> Weight {93		if let Some(actual_weight) = self.actual_weight {94			actual_weight.min(info.weight)95		} else {96			info.weight97		}98	}99}100101/// Wrapper for PostDispatchInfo and any user-provided data102#[derive(Clone)]103pub struct WithPostDispatchInfo<T> {104	/// User provided data105	pub data: T,106	/// Info known after dispatch107	pub post_info: PostDispatchInfo,108}109110impl<T> From<T> for WithPostDispatchInfo<T> {111	fn from(data: T) -> Self {112		Self {113			data,114			post_info: Default::default(),115		}116	}117}118119/// Return type of items in [`crate::solidity_interface`] definition120pub type ResultWithPostInfo<T> =121	core::result::Result<WithPostDispatchInfo<T>, WithPostDispatchInfo<Error>>;