arbos/l2_pricing/
multi_gas_fees.rs

1use alloy_primitives::U256;
2use arb_primitives::multigas::{NUM_RESOURCE_KIND, ResourceKind};
3use arb_storage::{Storage, StorageBackedBigUint, StorageBackend, SystemStateBackend};
4
5use super::L2PricingError;
6
7// Storage layout: next=0, current=NUM_RESOURCE_KIND.
8const NEXT_BLOCK_FEES_OFFSET: u64 = 0;
9const CURRENT_BLOCK_FEES_OFFSET: u64 = NUM_RESOURCE_KIND as u64;
10
11/// Per-resource-kind base fee tracking for multi-dimensional gas pricing.
12///
13/// The `next` field stores fees computed during pricing model updates.
14/// The `current` field holds fees for the current block, rotated from
15/// `next` at block start via `commit_next_to_current`.
16pub struct MultiGasFees<'a, D> {
17    storage: Storage<'a, D>,
18}
19
20pub fn open_multi_gas_fees<D>(sto: Storage<'_, D>) -> MultiGasFees<'_, D> {
21    MultiGasFees { storage: sto }
22}
23
24impl<D> MultiGasFees<'_, D> {
25    pub fn get_current_block_fee<B: SystemStateBackend>(
26        &self,
27        backend: &mut B,
28        kind: ResourceKind,
29    ) -> Result<U256, L2PricingError> {
30        let sbu = StorageBackedBigUint::new(
31            self.storage.base_key(),
32            CURRENT_BLOCK_FEES_OFFSET + kind as u64,
33        );
34        Ok(sbu.get(backend)?)
35    }
36
37    pub fn get_next_block_fee<B: SystemStateBackend>(
38        &self,
39        backend: &mut B,
40        kind: ResourceKind,
41    ) -> Result<U256, L2PricingError> {
42        let sbu = StorageBackedBigUint::new(
43            self.storage.base_key(),
44            NEXT_BLOCK_FEES_OFFSET + kind as u64,
45        );
46        Ok(sbu.get(backend)?)
47    }
48
49    pub fn set_next_block_fee<B: StorageBackend>(
50        &self,
51        backend: &mut B,
52        kind: ResourceKind,
53        fee: U256,
54    ) -> Result<(), L2PricingError> {
55        let sbu = StorageBackedBigUint::new(
56            self.storage.base_key(),
57            NEXT_BLOCK_FEES_OFFSET + kind as u64,
58        );
59        Ok(sbu.set(backend, fee)?)
60    }
61
62    /// Copy next-block fees to current-block fees.
63    pub fn commit_next_to_current<B: StorageBackend>(
64        &self,
65        backend: &mut B,
66    ) -> Result<(), L2PricingError> {
67        for kind in ResourceKind::ALL {
68            let fee = self.get_next_block_fee(backend, kind)?;
69            let current = StorageBackedBigUint::new(
70                self.storage.base_key(),
71                CURRENT_BLOCK_FEES_OFFSET + kind as u64,
72            );
73            current.set(backend, fee)?;
74        }
75        Ok(())
76    }
77}