arbos/l2_pricing/
gas_constraint.rs

1use revm::Database;
2
3use arb_storage::{Storage, StorageBackedUint64};
4
5const TARGET_OFFSET: u64 = 0;
6const ADJUSTMENT_WINDOW_OFFSET: u64 = 1;
7const BACKLOG_OFFSET: u64 = 2;
8
9/// A single-dimensional gas constraint with target, adjustment window, and backlog.
10pub struct GasConstraint<D> {
11    target: StorageBackedUint64<D>,
12    adjustment_window: StorageBackedUint64<D>,
13    backlog: StorageBackedUint64<D>,
14}
15
16pub fn open_gas_constraint<D: Database>(sto: Storage<D>) -> GasConstraint<D> {
17    let state = sto.state_ptr();
18    let base_key = sto.base_key();
19    GasConstraint {
20        target: StorageBackedUint64::new(state, base_key, TARGET_OFFSET),
21        adjustment_window: StorageBackedUint64::new(state, base_key, ADJUSTMENT_WINDOW_OFFSET),
22        backlog: StorageBackedUint64::new(state, base_key, BACKLOG_OFFSET),
23    }
24}
25
26impl<D: Database> GasConstraint<D> {
27    pub fn target(&self) -> Result<u64, ()> {
28        self.target.get()
29    }
30
31    pub fn set_target(&self, val: u64) -> Result<(), ()> {
32        self.target.set(val)
33    }
34
35    pub fn adjustment_window(&self) -> Result<u64, ()> {
36        self.adjustment_window.get()
37    }
38
39    pub fn set_adjustment_window(&self, val: u64) -> Result<(), ()> {
40        self.adjustment_window.set(val)
41    }
42
43    pub fn backlog(&self) -> Result<u64, ()> {
44        self.backlog.get()
45    }
46
47    pub fn set_backlog(&self, val: u64) -> Result<(), ()> {
48        self.backlog.set(val)
49    }
50
51    pub fn clear(&self) -> Result<(), ()> {
52        self.target.set(0)?;
53        self.adjustment_window.set(0)?;
54        self.backlog.set(0)
55    }
56}