massa_deferred_calls/
slot_changes.rs

1use std::collections::BTreeMap;
2
3use crate::{
4    DeferredCall, DeferredRegistryBaseFeeChange, DeferredRegistryCallChange,
5    DeferredRegistryGasChange,
6};
7use massa_models::{amount::Amount, deferred_calls::DeferredCallId};
8use serde::{Deserialize, Serialize};
9
10#[derive(Default, Debug, Clone, Serialize, Deserialize)]
11pub struct DeferredRegistrySlotChanges {
12    pub calls: BTreeMap<DeferredCallId, DeferredRegistryCallChange>,
13    pub effective_slot_gas: DeferredRegistryGasChange<u64>,
14    pub base_fee: DeferredRegistryBaseFeeChange,
15}
16
17impl DeferredRegistrySlotChanges {
18    pub fn calls_len(&self) -> usize {
19        self.calls.len()
20    }
21
22    /// add Delete changes will delete the call from the db registry when the slot is finalized
23    pub fn delete_call(&mut self, id: &DeferredCallId) {
24        match self.calls.entry(id.clone()) {
25            std::collections::btree_map::Entry::Occupied(mut v) => {
26                *v.get_mut() = DeferredRegistryCallChange::Delete;
27            }
28            std::collections::btree_map::Entry::Vacant(v) => {
29                v.insert(DeferredRegistryCallChange::Delete);
30            }
31        }
32    }
33
34    pub fn set_call(&mut self, id: DeferredCallId, call: DeferredCall) {
35        self.calls.insert(id, DeferredRegistryCallChange::Set(call));
36    }
37
38    /// Returns the raw change entry for `id` so that callers can distinguish
39    /// `Set` (present), `Delete` (tombstoned), and `None` (no change recorded
40    /// in this layer). Required to stop speculative lookup cascades when a
41    /// deferred call has been deleted in a newer layer.
42    pub fn get_call_change(&self, id: &DeferredCallId) -> Option<&DeferredRegistryCallChange> {
43        self.calls.get(id)
44    }
45
46    pub fn set_effective_slot_gas(&mut self, gas: u64) {
47        self.effective_slot_gas = DeferredRegistryGasChange::Set(gas);
48    }
49
50    pub fn get_effective_slot_gas(&self) -> Option<u64> {
51        match self.effective_slot_gas {
52            DeferredRegistryGasChange::Set(v) => Some(v),
53            DeferredRegistryGasChange::Keep => None,
54        }
55    }
56
57    pub fn get_base_fee(&self) -> Option<Amount> {
58        match self.base_fee {
59            DeferredRegistryGasChange::Set(v) => Some(v),
60            DeferredRegistryGasChange::Keep => None,
61        }
62    }
63
64    pub fn set_base_fee(&mut self, base_fee: Amount) {
65        self.base_fee = DeferredRegistryGasChange::Set(base_fee);
66    }
67}