jam_pvm_common/
service.rs1use jam_types::{
2 AccumulateItem, CodeHash, Hash, RefineContext, ServiceId, Slot, TransferRecord, Vec,
3 WorkOutput, WorkPackageHash, 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 {
16 id,
17 payload,
18 package_hash,
19 context,
20 auth_code_hash,
21 } = $crate::mem::decode_buf(ptr, size);
22 let result = <$service_impl as $crate::Service>::refine(
23 id,
24 payload,
25 package_hash,
26 context,
27 auth_code_hash,
28 );
29 ((&result).as_ptr() as u64, result.len() as u64)
30 }
31 #[polkavm_derive::polkavm_export]
32 extern "C" fn accumulate_ext(ptr: u32, size: u32) -> (u64, u64) {
33 let $crate::jam_types::AccumulateParams { slot, id, results } =
34 $crate::mem::decode_buf(ptr, size);
35 let maybe_hash = <$service_impl as $crate::Service>::accumulate(slot, id, results);
36 if let Some(hash) = maybe_hash {
37 ((&hash).as_ptr() as u64, 32u64)
38 } else {
39 (0, 0)
40 }
41 }
42 #[polkavm_derive::polkavm_export]
43 extern "C" fn on_transfer_ext(ptr: u32, size: u32) -> (u64, u64) {
44 let $crate::jam_types::OnTransferParams { slot, id, transfers } =
45 $crate::mem::decode_buf(ptr, size);
46 <$service_impl as $crate::Service>::on_transfer(slot, id, transfers);
47 (0, 0)
48 }
49 };
50}
51
52pub trait Service {
56 fn refine(
68 id: ServiceId,
69 payload: WorkPayload,
70 package_hash: WorkPackageHash,
71 context: RefineContext,
72 auth_code_hash: CodeHash,
73 ) -> WorkOutput;
74
75 fn accumulate(slot: Slot, id: ServiceId, results: Vec<AccumulateItem>) -> Option<Hash>;
83
84 fn on_transfer(slot: Slot, id: ServiceId, transfers: Vec<TransferRecord>);
90}