diff --git a/Cargo.lock b/Cargo.lock index 23d1d37ecd..09df8e54c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5890,6 +5890,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 634be1081d..5ffe6bddbe 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"] } @@ -44,6 +45,7 @@ fp-self-contained = { workspace = true, features = ["default"] } [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 703dc8c1c1..cb7388d093 100644 --- a/frame/ethereum/src/lib.rs +++ b/frame/ethereum/src/lib.rs @@ -25,11 +25,14 @@ #![allow(clippy::comparison_chain, clippy::large_enum_variant)] #![warn(unused_crate_dependencies)] +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; + pub use ethereum::{ AccessListItem, BlockV2 as Block, LegacyTransactionMessage, Log, ReceiptV3 as Receipt, TransactionAction, TransactionV2 as Transaction, @@ -572,6 +575,8 @@ impl Pallet { ) -> Result<(PostDispatchInfo, CallOrCreateInfo), DispatchErrorWithPostInfo> { 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;