arbos/l2_pricing/
multi_gas_fees.rs1use alloy_primitives::U256;
2use arb_primitives::multigas::{NUM_RESOURCE_KIND, ResourceKind};
3use arb_storage::{Storage, StorageBackedBigUint, StorageBackend, SystemStateBackend};
4
5use super::L2PricingError;
6
7const NEXT_BLOCK_FEES_OFFSET: u64 = 0;
9const CURRENT_BLOCK_FEES_OFFSET: u64 = NUM_RESOURCE_KIND as u64;
10
11pub 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 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}