12345678910111213141516171819#[cfg(not(feature = "std"))]20use alloc::string::{String, ToString};21#[cfg(feature = "std")]22use std::string::{String, ToString};2324use evm_coder::ERC165Call;25pub use evm_coder_substrate_procedural::PreDispatch;26use evm_core::{ExitError, ExitFatal};27pub use frame_support::weights::Weight;282930#[derive(Debug, Clone)]31pub enum Error {32 33 Revert(String),34 35 Fatal(ExitFatal),36 37 Error(ExitError),38}3940impl<E> From<E> for Error41where42 E: ToString,43{44 fn from(e: E) -> Self {45 Self::Revert(e.to_string())46 }47}484950pub type Result<T> = core::result::Result<T, Error>;5152pub type ResultWithPostInfo<T> =53 core::result::Result<WithPostDispatchInfo<T>, WithPostDispatchInfo<Error>>;5455pub trait PreDispatch {56 fn dispatch_info(&self) -> DispatchInfo;57}5859impl PreDispatch for ERC165Call {60 fn dispatch_info(&self) -> DispatchInfo {61 DispatchInfo {62 63 weight: Weight::from_parts(200, 0),64 }65 }66}676869pub struct DispatchInfo {70 71 pub weight: Weight,72}7374impl From<Weight> for DispatchInfo {75 fn from(weight: Weight) -> Self {76 Self { weight }77 }78}7980impl From<u64> for DispatchInfo {81 fn from(weight: u64) -> Self {82 Self {83 weight: Weight::from_parts(weight, 0),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}