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_parts(200, 0),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}8081impl From<u64> for DispatchInfo {82 fn from(weight: u64) -> Self {83 Self {84 weight: Weight::from_parts(weight, 0),85 }86 }87}88impl From<()> for DispatchInfo {89 fn from(_: ()) -> Self {90 Self {91 weight: Weight::zero(),92 }93 }94}95969798#[derive(Default, Clone)]99pub struct PostDispatchInfo {100 101 pub actual_weight: Option<Weight>,102}103104impl PostDispatchInfo {105 106 pub fn calc_unspent(&self, info: &DispatchInfo) -> Weight {107 info.weight - self.calc_actual_weight(info)108 }109110 111 112 pub fn calc_actual_weight(&self, info: &DispatchInfo) -> Weight {113 if let Some(actual_weight) = self.actual_weight {114 actual_weight.min(info.weight)115 } else {116 info.weight117 }118 }119}120121122#[derive(Clone)]123pub struct WithPostDispatchInfo<T> {124 125 pub data: T,126 127 pub post_info: PostDispatchInfo,128}129130impl<T> From<T> for WithPostDispatchInfo<T> {131 fn from(data: T) -> Self {132 Self {133 data,134 post_info: Default::default(),135 }136 }137}138#[allow(clippy::crate_in_macro_def)]139#[macro_export]140macro_rules! frontier_contract {141 (142 macro_rules! $res:ident {...}143 impl$(<$($gen:ident $(: $($(+)? $bound:ty)*)?),+ $(,)?>)? Contract for $ty:ty {...}144 ) => {145 146 macro_rules! $res {147 ($i:expr) => {{148 pallet_evm_coder_substrate::spez! {149 for res = $i;150 match<T> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> -> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> {151 res152 }153 match<T> ::pallet_evm_coder_substrate::execution::Result<T> -> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> {154 res155 .map(pallet_evm_coder_substrate::execution::WithPostDispatchInfo::from)156 .map_err(pallet_evm_coder_substrate::execution::WithPostDispatchInfo::from)157 }158 match<T> T -> ::pallet_evm_coder_substrate::execution::ResultWithPostInfo<T> {159 Ok(pallet_evm_coder_substrate::execution::WithPostDispatchInfo::from(res))160 }161 }162 }};163 }164 impl $(<$($gen),+>)? $crate::Contract for $ty where T: crate::Config {165 type Error = ::pallet_evm_coder_substrate::execution::Error;166 type WithPostInfo<R> = ::pallet_evm_coder_substrate::execution::WithPostDispatchInfo<R>;167 type Result<R, E> = core::result::Result<R, E>;168 fn map_post<I, O>(169 v: Self::WithPostInfo<I>,170 mapper: impl FnOnce(I) -> O,171 ) -> Self::WithPostInfo<O> {172 ::pallet_evm_coder_substrate::execution::WithPostDispatchInfo {173 data: mapper(v.data),174 post_info: v.post_info,175 }176 }177 fn with_default_post<V>(v: V) -> Self::WithPostInfo<V> {178 ::pallet_evm_coder_substrate::execution::WithPostDispatchInfo {179 data: v,180 post_info: ::pallet_evm_coder_substrate::execution::PostDispatchInfo {181 actual_weight: None,182 },183 }184 }185 }186 };187}