use jam_types::{CoreIndex, Hash, ServiceId, Slot, WorkOutput, WorkPackageHash, WorkPayload};
#[macro_export]
macro_rules! declare_service {
($service_impl: ty) => {
#[polkavm_derive::polkavm_export]
extern "C" fn refine_ext(ptr: u32, size: u32) -> (u64, u64) {
$crate::startup::load_protocol_parameters();
let $crate::jam_types::RefineParams {
core_index,
item_index,
service_id,
payload,
package_hash,
} = $crate::mem::decode_buf(ptr, size);
let result = <$service_impl as $crate::Service>::refine(
core_index,
item_index as _,
service_id,
payload,
package_hash,
);
let result = result.leak();
(result.as_ptr() as u64, result.len() as u64)
}
#[polkavm_derive::polkavm_export]
extern "C" fn accumulate_ext(ptr: u32, size: u32) -> (u64, u64) {
$crate::startup::load_protocol_parameters();
let $crate::jam_types::AccumulateParams { slot, service_id, item_count } =
$crate::mem::decode_buf(ptr, size);
let maybe_hash =
<$service_impl as $crate::Service>::accumulate(slot, service_id, item_count as _);
if let Some(hash) = maybe_hash {
let hash = ::alloc::boxed::Box::leak(::alloc::boxed::Box::new(hash));
(hash.as_ptr() as u64, hash.len() as u64)
} else {
(0, 0)
}
}
};
}
pub trait Service {
fn refine(
core_index: CoreIndex,
item_index: usize,
service_id: ServiceId,
payload: WorkPayload,
package_hash: WorkPackageHash,
) -> WorkOutput;
fn accumulate(slot: Slot, service_id: ServiceId, item_count: usize) -> Option<Hash>;
}