foundry_cheatcodes/
tempo.rs1use 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
37fn 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}