tempo_precompiles/nonce/
dispatch.rs1use crate::{Precompile, dispatch_call, input_cost, nonce::NonceManager, view};
4use alloy::{primitives::Address, sol_types::SolInterface};
5use revm::precompile::{PrecompileError, PrecompileResult};
6use tempo_contracts::precompiles::INonce::INonceCalls;
7
8impl Precompile for NonceManager {
9 fn call(&mut self, calldata: &[u8], _msg_sender: Address) -> PrecompileResult {
10 self.storage
11 .deduct_gas(input_cost(calldata.len()))
12 .map_err(|_| PrecompileError::OutOfGas)?;
13
14 dispatch_call(calldata, INonceCalls::abi_decode, |call| match call {
15 INonceCalls::getNonce(call) => view(call, |c| self.get_nonce(c)),
16 })
17 }
18}
19
20#[cfg(test)]
21mod tests {
22 use super::*;
23 use crate::{
24 storage::{StorageCtx, hashmap::HashMapStorageProvider},
25 test_util::{assert_full_coverage, check_selector_coverage},
26 };
27 use tempo_contracts::precompiles::INonce::INonceCalls;
28
29 #[test]
30 fn test_nonce_selector_coverage() -> eyre::Result<()> {
31 let mut storage = HashMapStorageProvider::new(1);
32 StorageCtx::enter(&mut storage, || {
33 let mut nonce_manager = NonceManager::new();
34
35 let unsupported = check_selector_coverage(
36 &mut nonce_manager,
37 INonceCalls::SELECTORS,
38 "INonce",
39 INonceCalls::name_by_selector,
40 );
41
42 assert_full_coverage([unsupported]);
43 Ok(())
44 })
45 }
46}