Skip to main content

foundry_cheatcodes/
tempo.rs

1//! Cheatcodes that delegate to the imported Tempo precompile crates.
2
3use std::str::FromStr;
4
5use alloy_sol_types::SolValue;
6use foundry_evm_core::evm::FoundryEvmNetwork;
7use spec::Vm::{assumeImplicitApprovalCall, isImplicitlyApprovedCall};
8use tempo_hardfork::TempoHardfork;
9use tempo_precompiles::address_registry;
10
11use crate::{Cheatcode, CheatsCtxt, Error, Result};
12use foundry_config::ExecutionSpec;
13use foundry_evm_core::constants::MAGIC_ASSUME;
14
15impl Cheatcode for isImplicitlyApprovedCall {
16    fn apply_stateful<FEN: FoundryEvmNetwork>(&self, ccx: &mut CheatsCtxt<'_, '_, FEN>) -> Result {
17        let Self { spender } = *self;
18        let approved = match active_tempo_hardfork(ccx) {
19            Some(hardfork) => address_registry::is_implicitly_approved(spender, hardfork),
20            None => false,
21        };
22        Ok(approved.abi_encode())
23    }
24}
25
26impl Cheatcode for assumeImplicitApprovalCall {
27    fn apply_stateful<FEN: FoundryEvmNetwork>(&self, ccx: &mut CheatsCtxt<'_, '_, FEN>) -> Result {
28        let Self { spender } = *self;
29        let approved = match active_tempo_hardfork(ccx) {
30            Some(hardfork) => address_registry::is_implicitly_approved(spender, hardfork),
31            None => false,
32        };
33        if approved { Ok(Default::default()) } else { Err(Error::from(MAGIC_ASSUME)) }
34    }
35}
36
37/// Resolves the active Tempo hardfork from the cheatcode-visible spec, or `None` on non-Tempo
38/// networks. Goes through the spec's stable string name because the context is generic over
39/// the network type.
40fn active_tempo_hardfork<FEN: FoundryEvmNetwork>(
41    ccx: &CheatsCtxt<'_, '_, FEN>,
42) -> Option<TempoHardfork> {
43    let spec = ccx.spec();
44    TempoHardfork::from_str(&spec.evm_version_name()).ok()
45}