Skip to main content

tempo_precompiles/nonce/
dispatch.rs

1//! ABI dispatch for the [`NonceManager`] precompile.
2
3use 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}