use alloc::vec::Vec;
use crate::Word;
use crate::account::{StorageSlot, StorageSlotName};
use crate::utils::sync::LazyLock;
static ON_BEFORE_ASSET_ADDED_TO_ACCOUNT_SLOT_NAME: LazyLock<StorageSlotName> =
LazyLock::new(|| {
StorageSlotName::new("miden::protocol::faucet::callback::on_before_asset_added_to_account")
.expect("storage slot name should be valid")
});
static ON_BEFORE_ASSET_ADDED_TO_NOTE_SLOT_NAME: LazyLock<StorageSlotName> = LazyLock::new(|| {
StorageSlotName::new("miden::protocol::faucet::callback::on_before_asset_added_to_note")
.expect("storage slot name should be valid")
});
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AssetCallbacks {
on_before_asset_added_to_account: Word,
on_before_asset_added_to_note: Word,
}
impl AssetCallbacks {
pub fn new() -> Self {
Self::default()
}
pub fn on_before_asset_added_to_account(mut self, proc_root: Word) -> Self {
self.on_before_asset_added_to_account = proc_root;
self
}
pub fn on_before_asset_added_to_note(mut self, proc_root: Word) -> Self {
self.on_before_asset_added_to_note = proc_root;
self
}
pub fn on_before_asset_added_to_account_slot() -> &'static StorageSlotName {
&ON_BEFORE_ASSET_ADDED_TO_ACCOUNT_SLOT_NAME
}
pub fn on_before_asset_added_to_note_slot() -> &'static StorageSlotName {
&ON_BEFORE_ASSET_ADDED_TO_NOTE_SLOT_NAME
}
pub fn on_before_asset_added_to_account_proc_root(&self) -> Word {
self.on_before_asset_added_to_account
}
pub fn on_before_asset_added_to_note_proc_root(&self) -> Word {
self.on_before_asset_added_to_note
}
pub fn into_storage_slots(self) -> Vec<StorageSlot> {
let mut slots = Vec::new();
if !self.on_before_asset_added_to_account.is_empty() {
slots.push(StorageSlot::with_value(
AssetCallbacks::on_before_asset_added_to_account_slot().clone(),
self.on_before_asset_added_to_account,
));
}
if !self.on_before_asset_added_to_note.is_empty() {
slots.push(StorageSlot::with_value(
AssetCallbacks::on_before_asset_added_to_note_slot().clone(),
self.on_before_asset_added_to_note,
));
}
slots
}
}