use miden_protocol::account::component::{AccountComponentCode, AccountComponentMetadata};
use miden_protocol::account::{AccountComponent, AccountComponentName, AccountProcedureRoot};
use crate::account::account_component_code;
use crate::procedure_root;
account_component_code!(UPGRADE_MANAGER_CODE, "miden-standards-upgrade-manager.masp");
const UPGRADE_MANAGER_LIBRARY_PATH: &str = "miden::standards::components::upgrade::manager";
procedure_root!(
UPGRADE_MANAGER_UPGRADE,
UPGRADE_MANAGER_LIBRARY_PATH,
UpgradeManager::UPGRADE_PROC_NAME,
UpgradeManager::code()
);
#[derive(Debug, Clone, Copy, Default)]
pub struct UpgradeManager;
impl UpgradeManager {
const NAME: &'static str = "miden::standards::upgrade::manager";
const UPGRADE_PROC_NAME: &'static str = "upgrade";
pub const fn name() -> AccountComponentName {
AccountComponentName::from_static_str(Self::NAME)
}
pub fn code() -> &'static AccountComponentCode {
&UPGRADE_MANAGER_CODE
}
pub fn upgrade_root() -> AccountProcedureRoot {
*UPGRADE_MANAGER_UPGRADE
}
}
impl From<UpgradeManager> for AccountComponent {
fn from(_: UpgradeManager) -> Self {
let metadata = AccountComponentMetadata::new(UpgradeManager::NAME)
.with_description("Code and storage upgrades for accounts.");
AccountComponent::new(UpgradeManager::code().clone(), vec![], metadata).expect(
"upgrade manager component should satisfy the requirements of a valid account component",
)
}
}