jam_pvm_common/
service.rsuse jam_types::{
AccumulateItem, OnChainContext, PackageInfo, ServiceId, TransferRecord, Vec, WorkOutput,
WorkPayload,
};
#[macro_export]
macro_rules! declare_service {
($t: ty) => {
#[polkavm_derive::polkavm_export]
extern "C" fn refine_ext(ptr: u32, size: u32) -> u64 {
let RefineParams { id, payload, package_info, extrinsics } =
$crate::decode_buf(ptr, size);
let result = <$t as $crate::Service>::refine(id, payload, package_info, extrinsics);
((&result).as_ptr() as u64) << 32 | (result.len() as u64)
}
#[polkavm_derive::polkavm_export]
extern "C" fn accumulate_ext(ptr: u32, size: u32) -> u64 {
let AccumulateParams { context, results } = decode_buf(ptr, size);
<$t as $crate::Service>::accumulate(context, results);
0
}
#[polkavm_derive::polkavm_export]
extern "C" fn on_transfer_ext(ptr: u32, size: u32) -> u64 {
let OnTransferParams { context, transfers } = decode_buf(ptr, size);
<$t as $crate::Service>::on_transfer(context, transfers);
0
}
};
}
pub trait Service {
fn refine(
id: ServiceId,
payload: WorkPayload,
package_info: PackageInfo,
extrinsics: Vec<Vec<u8>>,
) -> WorkOutput;
fn accumulate(context: OnChainContext, results: Vec<AccumulateItem>);
fn on_transfer(context: OnChainContext, transfers: Vec<TransferRecord>);
}