jam_pvm_common/
service.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use 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>);
}