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