Skip to main content

tempo_precompiles/tip1060_storage_credits/
dispatch.rs

1//! ABI dispatch for the storage credits precompile.
2
3use crate::{
4    Precompile, charge_input_cost, dispatch_call, mutate_void,
5    tip1060_storage_credits::TIP1060StorageCredits, view,
6};
7use alloy::{primitives::Address, sol_types::SolInterface};
8use revm::precompile::PrecompileResult;
9use tempo_contracts::precompiles::ITIP1060StorageCredits::ITIP1060StorageCreditsCalls;
10
11impl Precompile for TIP1060StorageCredits {
12    fn call(&mut self, calldata: &[u8], msg_sender: Address) -> PrecompileResult {
13        if let Some(err) = charge_input_cost(&mut self.storage, calldata) {
14            return err;
15        }
16
17        dispatch_call(
18            calldata,
19            &[],
20            ITIP1060StorageCreditsCalls::abi_decode,
21            |call| match call {
22                ITIP1060StorageCreditsCalls::balanceOf(call) => {
23                    view(call, |c| self.balance_of(c.account))
24                }
25                ITIP1060StorageCreditsCalls::modeOf(call) => {
26                    view(call, |c| self.mode_of(c.account).map(Into::into))
27                }
28                ITIP1060StorageCreditsCalls::budgetOf(call) => {
29                    view(call, |c| self.budget_of(c.account))
30                }
31                ITIP1060StorageCreditsCalls::setMode(call) => {
32                    mutate_void(call, msg_sender, |sender, c| {
33                        self.set_mode(sender, c.newMode)
34                    })
35                }
36                ITIP1060StorageCreditsCalls::setBudget(call) => {
37                    mutate_void(call, msg_sender, |sender, c| {
38                        self.set_budget(sender, c.creditBudget)
39                    })
40                }
41            },
42        )
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use crate::{
50        storage::{StorageCtx, hashmap::HashMapStorageProvider},
51        test_util::{assert_full_coverage, check_selector_coverage},
52    };
53
54    #[test]
55    fn test_storage_credits_selector_coverage() -> eyre::Result<()> {
56        let mut storage = HashMapStorageProvider::new(1);
57        StorageCtx::enter(&mut storage, || {
58            let mut storage_credits_precompile = TIP1060StorageCredits::new();
59
60            let unsupported = check_selector_coverage(
61                &mut storage_credits_precompile,
62                ITIP1060StorageCreditsCalls::SELECTORS,
63                "ITIP1060StorageCredits",
64                ITIP1060StorageCreditsCalls::name_by_selector,
65            );
66
67            assert_full_coverage([unsupported]);
68            Ok(())
69        })
70    }
71}