diff --git a/Cargo.lock b/Cargo.lock index 97b3d45f6f..b18ccfcde8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4787,6 +4787,7 @@ dependencies = [ name = "pallet-ethereum" version = "4.0.0-dev" dependencies = [ + "environmental", "ethereum", "ethereum-types", "evm", diff --git a/frame/ethereum/Cargo.toml b/frame/ethereum/Cargo.toml index e6c6f3c836..f173fe089b 100644 --- a/frame/ethereum/Cargo.toml +++ b/frame/ethereum/Cargo.toml @@ -11,6 +11,7 @@ repository = { workspace = true } targets = ["x86_64-unknown-linux-gnu"] [dependencies] +environmental = { workspace = true } ethereum = { workspace = true, features = ["with-codec"] } ethereum-types = { workspace = true } evm = { workspace = true, features = ["with-codec"] } @@ -45,6 +46,7 @@ sp-core = { workspace = true } [features] default = ["std"] std = [ + "environmental/std", "ethereum/std", "evm/std", "ethereum-types/std", diff --git a/frame/ethereum/src/catch_exec_info.rs b/frame/ethereum/src/catch_exec_info.rs new file mode 100644 index 0000000000..a1aa652459 --- /dev/null +++ b/frame/ethereum/src/catch_exec_info.rs @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: Apache-2.0 +// This file is part of Frontier. +// +// Copyright (c) 2020-2022 Parity Technologies (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use fp_evm::CallOrCreateInfo; + +environmental::environmental!(GLOBAL: Option); + +// Allow to catch informations of an ethereum execution inside the provided closure. +pub fn catch_exec_info R>( + execution_info: &mut Option, + f: F, +) -> R { + GLOBAL::using(execution_info, f) +} + +pub(super) fn fill_exec_info(execution_info: &CallOrCreateInfo) { + GLOBAL::with(|exec_info| exec_info.replace(execution_info.clone())); +} diff --git a/frame/ethereum/src/lib.rs b/frame/ethereum/src/lib.rs index f351101510..ee9f4060a3 100644 --- a/frame/ethereum/src/lib.rs +++ b/frame/ethereum/src/lib.rs @@ -24,11 +24,14 @@ #![cfg_attr(not(feature = "std"), no_std)] #![allow(clippy::comparison_chain, clippy::large_enum_variant)] +mod catch_exec_info; #[cfg(all(feature = "std", test))] mod mock; #[cfg(all(feature = "std", test))] mod tests; +pub use catch_exec_info::catch_exec_info; + use ethereum_types::{Bloom, BloomInput, H160, H256, H64, U256}; use evm::ExitReason; use fp_consensus::{PostLog, PreLog, FRONTIER_ENGINE_ID}; @@ -517,6 +520,8 @@ impl Pallet { ) -> DispatchResultWithPostInfo { let (to, _, info) = Self::execute(source, &transaction, None)?; + catch_exec_info::fill_exec_info(&info); + let pending = Pending::::get(); let transaction_hash = transaction.hash(); let transaction_index = pending.len() as u32;