jam_pvm_common/
service.rs1use jam_types::{
2 AccumulateItem, Hash, PackageInfo, ServiceId, Slot, TransferRecord, Vec, WorkOutput,
3 WorkPayload,
4};
5
6#[macro_export]
11macro_rules! declare_service {
12 ($service_impl: ty) => {
13 #[polkavm_derive::polkavm_export]
14 extern "C" fn refine_ext(ptr: u32, size: u32) -> (u64, u64) {
15 let $crate::jam_types::RefineParams { id, payload, package_info, extrinsics } =
16 $crate::mem::decode_buf(ptr, size);
17 let result =
18 <$service_impl as $crate::Service>::refine(id, payload, package_info, extrinsics);
19 ((&result).as_ptr() as u64, result.len() as u64)
20 }
21 #[polkavm_derive::polkavm_export]
22 extern "C" fn accumulate_ext(ptr: u32, size: u32) -> (u64, u64) {
23 let $crate::jam_types::AccumulateParams { slot, id, results } =
24 $crate::mem::decode_buf(ptr, size);
25 let maybe_hash = <$service_impl as $crate::Service>::accumulate(slot, id, results);
26 if let Some(hash) = maybe_hash {
27 ((&hash).as_ptr() as u64, 32u64)
28 } else {
29 (0, 0)
30 }
31 }
32 #[polkavm_derive::polkavm_export]
33 extern "C" fn on_transfer_ext(ptr: u32, size: u32) -> (u64, u64) {
34 let $crate::jam_types::OnTransferParams { slot, id, transfers } =
35 $crate::mem::decode_buf(ptr, size);
36 <$service_impl as $crate::Service>::on_transfer(slot, id, transfers);
37 (0, 0)
38 }
39 };
40}
41
42pub trait Service {
46 fn refine(
56 id: ServiceId,
57 payload: WorkPayload,
58 package_info: PackageInfo,
59 extrinsics: Vec<Vec<u8>>,
60 ) -> WorkOutput;
61
62 fn accumulate(slot: Slot, id: ServiceId, results: Vec<AccumulateItem>) -> Option<Hash>;
70
71 fn on_transfer(slot: Slot, id: ServiceId, transfers: Vec<TransferRecord>);
77}