1use crate::{
22 buffer::PayloadSlice,
23 env_vars::EnvVars,
24 ids::{ActorId, MessageId, ReservationId},
25 memory::Memory,
26 message::{DispatchKind, HandlePacket, InitPacket, MessageContext, ReplyPacket},
27 pages::WasmPage,
28};
29use alloc::{collections::BTreeSet, string::String};
30use core::fmt::Display;
31use gear_core_errors::{ReplyCode, SignalCode};
32use gear_wasm_instrument::syscalls::SyscallName;
33use parity_scale_codec::{Decode, Encode};
34use scale_info::TypeInfo;
35
36pub trait Externalities {
40 type UnrecoverableError;
42
43 type FallibleError;
45
46 type AllocError: Display;
48
49 fn alloc<Context>(
53 &mut self,
54 ctx: &mut Context,
55 mem: &mut impl Memory<Context>,
56 pages_num: u32,
57 ) -> Result<WasmPage, Self::AllocError>;
58
59 fn free(&mut self, page: WasmPage) -> Result<(), Self::AllocError>;
61
62 fn free_range(&mut self, start: WasmPage, end: WasmPage) -> Result<(), Self::AllocError>;
64
65 fn env_vars(&self, version: u32) -> Result<EnvVars, Self::UnrecoverableError>;
68
69 fn block_height(&self) -> Result<u32, Self::UnrecoverableError>;
71
72 fn block_timestamp(&self) -> Result<u64, Self::UnrecoverableError>;
74
75 fn send_init(&mut self) -> Result<u32, Self::FallibleError>;
77
78 fn send_push(&mut self, handle: u32, buffer: &[u8]) -> Result<(), Self::FallibleError>;
80
81 fn send_commit(
83 &mut self,
84 handle: u32,
85 msg: HandlePacket,
86 delay: u32,
87 ) -> Result<MessageId, Self::FallibleError>;
88
89 fn send(&mut self, msg: HandlePacket, delay: u32) -> Result<MessageId, Self::FallibleError> {
91 let handle = self.send_init()?;
92 self.send_commit(handle, msg, delay)
93 }
94
95 fn send_push_input(
97 &mut self,
98 handle: u32,
99 offset: u32,
100 len: u32,
101 ) -> Result<(), Self::FallibleError>;
102
103 fn reservation_send_commit(
105 &mut self,
106 id: ReservationId,
107 handle: u32,
108 msg: HandlePacket,
109 delay: u32,
110 ) -> Result<MessageId, Self::FallibleError>;
111
112 fn reservation_send(
114 &mut self,
115 id: ReservationId,
116 msg: HandlePacket,
117 delay: u32,
118 ) -> Result<MessageId, Self::FallibleError> {
119 let handle = self.send_init()?;
120 self.reservation_send_commit(id, handle, msg, delay)
121 }
122
123 fn reply_push(&mut self, buffer: &[u8]) -> Result<(), Self::FallibleError>;
125
126 fn reply_commit(&mut self, msg: ReplyPacket) -> Result<MessageId, Self::FallibleError>;
128
129 fn reservation_reply_commit(
131 &mut self,
132 id: ReservationId,
133 msg: ReplyPacket,
134 ) -> Result<MessageId, Self::FallibleError>;
135
136 fn reply(&mut self, msg: ReplyPacket) -> Result<MessageId, Self::FallibleError> {
138 self.reply_commit(msg)
139 }
140
141 fn reservation_reply(
143 &mut self,
144 id: ReservationId,
145 msg: ReplyPacket,
146 ) -> Result<MessageId, Self::FallibleError> {
147 self.reservation_reply_commit(id, msg)
148 }
149
150 fn reply_to(&self) -> Result<MessageId, Self::FallibleError>;
152
153 fn signal_from(&self) -> Result<MessageId, Self::FallibleError>;
155
156 fn reply_push_input(&mut self, offset: u32, len: u32) -> Result<(), Self::FallibleError>;
158
159 fn source(&self) -> Result<ActorId, Self::UnrecoverableError>;
161
162 fn reply_code(&self) -> Result<ReplyCode, Self::FallibleError>;
164
165 fn signal_code(&self) -> Result<SignalCode, Self::FallibleError>;
167
168 fn message_id(&self) -> Result<MessageId, Self::UnrecoverableError>;
170
171 fn program_id(&self) -> Result<ActorId, Self::UnrecoverableError>;
173
174 fn debug(&self, data: &str) -> Result<(), Self::UnrecoverableError>;
178
179 fn payload_slice(&mut self, at: u32, len: u32) -> Result<PayloadSlice, Self::FallibleError>;
181
182 fn size(&self) -> Result<usize, Self::UnrecoverableError>;
184
185 fn random(&self) -> Result<(&[u8], u32), Self::UnrecoverableError>;
187
188 fn reserve_gas(
190 &mut self,
191 amount: u64,
192 duration: u32,
193 ) -> Result<ReservationId, Self::FallibleError>;
194
195 fn unreserve_gas(&mut self, id: ReservationId) -> Result<u64, Self::FallibleError>;
197
198 fn system_reserve_gas(&mut self, amount: u64) -> Result<(), Self::FallibleError>;
200
201 fn gas_available(&self) -> Result<u64, Self::UnrecoverableError>;
203
204 fn value(&self) -> Result<u128, Self::UnrecoverableError>;
206
207 fn value_available(&self) -> Result<u128, Self::UnrecoverableError>;
209
210 fn wait(&mut self) -> Result<(), Self::UnrecoverableError>;
212
213 fn wait_for(&mut self, duration: u32) -> Result<(), Self::UnrecoverableError>;
215
216 fn wait_up_to(&mut self, duration: u32) -> Result<bool, Self::UnrecoverableError>;
219
220 fn wake(&mut self, waker_id: MessageId, delay: u32) -> Result<(), Self::FallibleError>;
222
223 fn create_program(
225 &mut self,
226 packet: InitPacket,
227 delay: u32,
228 ) -> Result<(MessageId, ActorId), Self::FallibleError>;
229
230 fn reply_deposit(
232 &mut self,
233 message_id: MessageId,
234 amount: u64,
235 ) -> Result<(), Self::FallibleError>;
236
237 fn forbidden_funcs(&self) -> &BTreeSet<SyscallName>;
239
240 fn msg_ctx(&self) -> &MessageContext;
242}
243
244#[derive(Debug, Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord, TypeInfo)]
246pub enum MessageWaitedType {
247 Wait,
249 WaitFor,
251 WaitUpTo,
254 WaitUpToFull,
257}
258
259pub trait WasmEntryPoint: Sized {
261 fn as_entry(&self) -> &str;
263
264 fn try_from_entry(entry: &str) -> Option<Self>;
266
267 fn try_into_kind(&self) -> Option<DispatchKind> {
269 <DispatchKind as WasmEntryPoint>::try_from_entry(self.as_entry())
270 }
271}
272
273impl WasmEntryPoint for String {
274 fn as_entry(&self) -> &str {
275 self
276 }
277
278 fn try_from_entry(entry: &str) -> Option<Self> {
279 Some(entry.into())
280 }
281}
282
283impl WasmEntryPoint for DispatchKind {
284 fn as_entry(&self) -> &str {
285 match self {
286 Self::Init => "init",
287 Self::Handle => "handle",
288 Self::Reply => "handle_reply",
289 Self::Signal => "handle_signal",
290 }
291 }
292
293 fn try_from_entry(entry: &str) -> Option<Self> {
294 let kind = match entry {
295 "init" => Self::Init,
296 "handle" => Self::Handle,
297 "handle_reply" => Self::Reply,
298 "handle_signal" => Self::Signal,
299 _ => return None,
300 };
301
302 Some(kind)
303 }
304}