use alloc::boxed::Box;
use codec::Encode;
use pezframe_support::pezpallet_prelude::*;
use pezframe_system::pezpallet_prelude::*;
use pezkuwi_primitives::Id as ParaId;
use pezkuwi_runtime_teyrchains::{
configuration, dmp, hrmp,
paras::{self, AssignCoretime, ParaGenesisArgs, ParaKind},
ParaLifecycle,
};
pub use pezpallet::*;
#[pezframe_support::pezpallet]
pub mod pezpallet {
use super::*;
#[pezpallet::pezpallet]
pub struct Pezpallet<T>(_);
#[pezpallet::config]
#[pezpallet::disable_pezframe_system_supertrait_check]
pub trait Config: configuration::Config + paras::Config + dmp::Config + hrmp::Config {}
#[pezpallet::error]
pub enum Error<T> {
ParaDoesntExist,
ParaAlreadyExists,
ExceedsMaxMessageSize,
Unroutable,
CouldntCleanup,
NotParathread,
NotTeyrchain,
CannotUpgrade,
CannotDowngrade,
TooManyCores,
}
#[pezpallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pezpallet<T> {}
#[pezpallet::call]
impl<T: Config> Pezpallet<T> {
#[pezpallet::call_index(0)]
#[pezpallet::weight((1_000, DispatchClass::Operational))]
pub fn sudo_schedule_para_initialize(
origin: OriginFor<T>,
id: ParaId,
genesis: ParaGenesisArgs,
) -> DispatchResult {
ensure_root(origin)?;
let assign_coretime = genesis.para_kind == ParaKind::Teyrchain;
pezkuwi_runtime_teyrchains::schedule_para_initialize::<T>(id, genesis)
.map_err(|_| Error::<T>::ParaAlreadyExists)?;
if assign_coretime {
T::AssignCoretime::assign_coretime(id)?;
}
Ok(())
}
#[pezpallet::call_index(1)]
#[pezpallet::weight((1_000, DispatchClass::Operational))]
pub fn sudo_schedule_para_cleanup(origin: OriginFor<T>, id: ParaId) -> DispatchResult {
ensure_root(origin)?;
pezkuwi_runtime_teyrchains::schedule_para_cleanup::<T>(id)
.map_err(|_| Error::<T>::CouldntCleanup)?;
Ok(())
}
#[pezpallet::call_index(2)]
#[pezpallet::weight((1_000, DispatchClass::Operational))]
pub fn sudo_schedule_parathread_upgrade(
origin: OriginFor<T>,
id: ParaId,
) -> DispatchResult {
ensure_root(origin)?;
ensure!(
paras::Pezpallet::<T>::lifecycle(id) == Some(ParaLifecycle::Parathread),
Error::<T>::NotParathread,
);
pezkuwi_runtime_teyrchains::schedule_parathread_upgrade::<T>(id)
.map_err(|_| Error::<T>::CannotUpgrade)?;
Ok(())
}
#[pezpallet::call_index(3)]
#[pezpallet::weight((1_000, DispatchClass::Operational))]
pub fn sudo_schedule_teyrchain_downgrade(
origin: OriginFor<T>,
id: ParaId,
) -> DispatchResult {
ensure_root(origin)?;
ensure!(
paras::Pezpallet::<T>::lifecycle(id) == Some(ParaLifecycle::Teyrchain),
Error::<T>::NotTeyrchain,
);
pezkuwi_runtime_teyrchains::schedule_teyrchain_downgrade::<T>(id)
.map_err(|_| Error::<T>::CannotDowngrade)?;
Ok(())
}
#[pezpallet::call_index(4)]
#[pezpallet::weight((1_000, DispatchClass::Operational))]
pub fn sudo_queue_downward_xcm(
origin: OriginFor<T>,
id: ParaId,
xcm: Box<xcm::opaque::VersionedXcm>,
) -> DispatchResult {
ensure_root(origin)?;
ensure!(paras::Pezpallet::<T>::is_valid_para(id), Error::<T>::ParaDoesntExist);
let config = configuration::ActiveConfig::<T>::get();
dmp::Pezpallet::<T>::queue_downward_message(&config, id, xcm.encode()).map_err(|e| {
match e {
dmp::QueueDownwardMessageError::ExceedsMaxMessageSize => {
Error::<T>::ExceedsMaxMessageSize.into()
},
dmp::QueueDownwardMessageError::Unroutable => Error::<T>::Unroutable.into(),
}
})
}
#[pezpallet::call_index(5)]
#[pezpallet::weight((1_000, DispatchClass::Operational))]
pub fn sudo_establish_hrmp_channel(
origin: OriginFor<T>,
sender: ParaId,
recipient: ParaId,
max_capacity: u32,
max_message_size: u32,
) -> DispatchResult {
ensure_root(origin)?;
hrmp::Pezpallet::<T>::init_open_channel(
sender,
recipient,
max_capacity,
max_message_size,
)?;
hrmp::Pezpallet::<T>::accept_open_channel(recipient, sender)?;
Ok(())
}
}
}