Skip to content

Commit

Permalink
catch ethereum execution info
Browse files Browse the repository at this point in the history
  • Loading branch information
tgmichel committed Mar 1, 2023
1 parent abf1751 commit a78776b
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions frame/ethereum/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"] }
Expand Down Expand Up @@ -45,6 +46,7 @@ sp-core = { workspace = true }
[features]
default = ["std"]
std = [
"environmental/std",
"ethereum/std",
"evm/std",
"ethereum-types/std",
Expand Down
32 changes: 32 additions & 0 deletions frame/ethereum/src/catch_exec_info.rs
Original file line number Diff line number Diff line change
@@ -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<CallOrCreateInfo>);

// Allow to catch informations of an ethereum execution inside the provided closure.
pub fn catch_exec_info<R, F: FnOnce() -> R>(
execution_info: &mut Option<CallOrCreateInfo>,
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()));
}
5 changes: 5 additions & 0 deletions frame/ethereum/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -517,6 +520,8 @@ impl<T: Config> Pallet<T> {
) -> DispatchResultWithPostInfo {
let (to, _, info) = Self::execute(source, &transaction, None)?;

catch_exec_info::fill_exec_info(&info);

let pending = Pending::<T>::get();
let transaction_hash = transaction.hash();
let transaction_index = pending.len() as u32;
Expand Down

0 comments on commit a78776b

Please sign in to comment.