fuel-core-upgradable-executor 0.48.0

Fuel Block Upgradable Executor
Documentation
use fuel_core_storage::{
    Result as StorageResult,
    kv_store::{
        KeyValueInspect,
        StorageColumn,
        Value,
    },
};
use fuel_core_types::services::executor::StorageReadReplayEvent;
use parking_lot::Mutex;
use std::sync::Arc;

pub struct StorageAccessRecorder<S>
where
    S: KeyValueInspect,
{
    pub storage: S,
    pub record: Arc<Mutex<Vec<StorageReadReplayEvent>>>,
}

impl<S> StorageAccessRecorder<S>
where
    S: KeyValueInspect,
{
    pub fn new(storage: S) -> Self {
        Self {
            storage,
            record: Default::default(),
        }
    }
}

impl<S> KeyValueInspect for StorageAccessRecorder<S>
where
    S: KeyValueInspect,
{
    type Column = S::Column;

    fn get(&self, key: &[u8], column: Self::Column) -> StorageResult<Option<Value>> {
        let value = self.storage.get(key, column)?;
        self.record.lock().push(StorageReadReplayEvent {
            column: column.id(),
            key: key.to_vec(),
            value: value.as_ref().map(|v| v.to_vec()),
        });
        Ok(value)
    }
}