12345678910111213141516171819#[cfg(not(feature = "std"))]20use alloc::string::{String, ToString};21#[cfg(feature = "std")]22use std::string::{String, ToString};2324use evm_coder::ERC165Call;25use evm_core::{ExitError, ExitFatal};2627pub use frame_support::weights::Weight;28pub use evm_coder_substrate_procedural::PreDispatch;293031#[derive(Debug, Clone)]32pub enum Error {33 34 Revert(String),35 36 Fatal(ExitFatal),37 38 Error(ExitError),39}4041impl<E> From<E> for Error42where43 E: ToString,44{45 fn from(e: E) -> Self {46 Self::Revert(e.to_string())47 }48}495051pub type Result<T> = core::result::Result<T, Error>;5253pub type ResultWithPostInfo<T> =54 core::result::Result<WithPostDispatchInfo<T>, WithPostDispatchInfo<Error>>;5556pub trait PreDispatch {57 fn dispatch_info(&self) -> DispatchInfo;58}5960impl PreDispatch for ERC165Call {61 fn dispatch_info(&self) -> DispatchInfo {62 DispatchInfo {63 64 weight: Weight::from_ref_time(200),65 }66 }67}686970pub struct DispatchInfo {71 72 pub weight: Weight,73}7475impl From<Weight> for DispatchInfo {76 fn from(weight: Weight) -> Self {77 Self { weight }78 }79}80impl From<u64> for DispatchInfo {81 fn from(weight: u64) -> Self {82 Self {83 weight: Weight::from_ref_time(weight),84 }85 }86}87impl From<()> for DispatchInfo {88 fn from(_: ()) -> Self {89 Self {90 weight: Weight::zero(),91 }92 }93}94959697#[derive(Default, Clone)]98pub struct PostDispatchInfo {99 100 pub actual_weight: Option<Weight>,101}102103impl PostDispatchInfo {104 105 pub fn calc_unspent(&self, info: &DispatchInfo) -> Weight {106 info.weight - self.calc_actual_weight(info)107 }108109 110 111 pub fn calc_actual_weight(&self, info: &DispatchInfo) -> Weight {112 if let Some(actual_weight) = self.actual_weight {113 actual_weight.min(info.weight)114 } else {115 info.weight116 }117 }118}119120121#[derive(Clone)]122pub struct WithPostDispatchInfo<T> {123 124 pub data: T,125 126 pub post_info: PostDispatchInfo,127}128129impl<T> From<T> for WithPostDispatchInfo<T> {130 fn from(data: T) -> Self {131 Self {132 data,133 post_info: Default::default(),134 }135 }136}137#[allow(clippy::crate_in_macro_def)]138#[macro_export]139macro_rules! frontier_contract {140 (141 macro_rules! $res:ident {...}142 impl$(<$($gen:ident $(: $($(+)? $bound:ty)*)?),+ $(,)?>)? Contract for $ty:ty {...}143 ) => {144 145 macro_rules! $res {146 ($i:expr) => {{147 pallet_evm_coder_substrate::spez! {148 for res = $i;149 match<T> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> -> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> {150 res151 }152 match<T> ::pallet_evm_coder_substrate::execution::Result<T> -> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> {153 res154 .map(pallet_evm_coder_substrate::execution::WithPostDispatchInfo::from)155 .map_err(pallet_evm_coder_substrate::execution::WithPostDispatchInfo::from)156 }157 match<T> T -> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> {158 Ok(pallet_evm_coder_substrate::execution::WithPostDispatchInfo::from(res))159 }160 }161 }};162 }163 impl $(<$($gen),+>)? $crate::Contract for $ty where T: crate::Config {164 type Error = ::pallet_evm_coder_substrate::execution::Error;165 type WithPostInfo<R> = ::pallet_evm_coder_substrate::execution::WithPostDispatchInfo<R>;166 type Result<R, E> = core::result::Result<R, E>;167 fn map_post<I, O>(168 v: Self::WithPostInfo<I>,169 mapper: impl FnOnce(I) -> O,170 ) -> Self::WithPostInfo<O> {171 ::pallet_evm_coder_substrate::execution::WithPostDispatchInfo {172 data: mapper(v.data),173 post_info: v.post_info,174 }175 }176 fn with_default_post<V>(v: V) -> Self::WithPostInfo<V> {177 ::pallet_evm_coder_substrate::execution::WithPostDispatchInfo {178 data: v,179 post_info: ::pallet_evm_coder_substrate::execution::PostDispatchInfo {180 actual_weight: None,181 },182 }183 }184 }185 };186}