arbos/l2_pricing/
multi_gas_fees.rs

1use alloy_primitives::U256;
2use revm::Database;
3
4use arb_primitives::multigas::{ResourceKind, NUM_RESOURCE_KIND};
5use arb_storage::{Storage, StorageBackedBigUint};
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<D> {
17    storage: Storage<D>,
18}
19
20pub fn open_multi_gas_fees<D: Database>(sto: Storage<D>) -> MultiGasFees<D> {
21    MultiGasFees { storage: sto }
22}
23
24impl<D: Database> MultiGasFees<D> {
25    pub fn get_current_block_fee(&self, kind: ResourceKind) -> Result<U256, ()> {
26        let sbu = StorageBackedBigUint::new(
27            self.storage.state_ptr(),
28            self.storage.base_key(),
29            CURRENT_BLOCK_FEES_OFFSET + kind as u64,
30        );
31        sbu.get()
32    }
33
34    pub fn get_next_block_fee(&self, kind: ResourceKind) -> Result<U256, ()> {
35        let sbu = StorageBackedBigUint::new(
36            self.storage.state_ptr(),
37            self.storage.base_key(),
38            NEXT_BLOCK_FEES_OFFSET + kind as u64,
39        );
40        sbu.get()
41    }
42
43    pub fn set_next_block_fee(&self, kind: ResourceKind, fee: U256) -> Result<(), ()> {
44        let sbu = StorageBackedBigUint::new(
45            self.storage.state_ptr(),
46            self.storage.base_key(),
47            NEXT_BLOCK_FEES_OFFSET + kind as u64,
48        );
49        sbu.set(fee)
50    }
51
52    /// Copy next-block fees to current-block fees.
53    pub fn commit_next_to_current(&self) -> Result<(), ()> {
54        for kind in ResourceKind::ALL {
55            let fee = self.get_next_block_fee(kind)?;
56            let current = StorageBackedBigUint::new(
57                self.storage.state_ptr(),
58                self.storage.base_key(),
59                CURRENT_BLOCK_FEES_OFFSET + kind as u64,
60            );
61            current.set(fee)?;
62        }
63        Ok(())
64    }
65}