1use crate::errors::InvokeError;
2use crate::internal_prelude::*;
3use crate::vm::wasm::errors::*;
4use radix_engine_interface::api::actor_api::EventFlags;
5use radix_engine_interface::api::ActorRefHandle;
6use radix_engine_interface::blueprints::package::CodeHash;
7use sbor::rust::boxed::Box;
8use sbor::rust::vec::Vec;
9
10pub trait WasmRuntime {
12 fn allocate_buffer(&mut self, buffer: Vec<u8>)
13 -> Result<Buffer, InvokeError<WasmRuntimeError>>;
14
15 fn buffer_consume(
16 &mut self,
17 buffer_id: BufferId,
18 ) -> Result<Vec<u8>, InvokeError<WasmRuntimeError>>;
19
20 fn object_call(
21 &mut self,
22 receiver: Vec<u8>,
23 ident: Vec<u8>,
24 args: Vec<u8>,
25 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
26
27 fn object_call_module(
28 &mut self,
29 receiver: Vec<u8>,
30 module_id: u32,
31 ident: Vec<u8>,
32 args: Vec<u8>,
33 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
34
35 fn object_call_direct(
36 &mut self,
37 receiver: Vec<u8>,
38 ident: Vec<u8>,
39 args: Vec<u8>,
40 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
41
42 fn blueprint_call(
43 &mut self,
44 package_address: Vec<u8>,
45 blueprint_name: Vec<u8>,
46 ident: Vec<u8>,
47 args: Vec<u8>,
48 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
49
50 fn object_new(
51 &mut self,
52 blueprint_name: Vec<u8>,
53 object_states: Vec<u8>,
54 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
55
56 fn address_allocate(
57 &mut self,
58 package_address: Vec<u8>,
59 blueprint_name: Vec<u8>,
60 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
61
62 fn address_get_reservation_address(
63 &mut self,
64 node_id: Vec<u8>,
65 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
66
67 fn globalize_object(
68 &mut self,
69 node_id: Vec<u8>,
70 modules: Vec<u8>,
71 address: Vec<u8>,
72 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
73
74 fn key_value_store_new(
75 &mut self,
76 schema: Vec<u8>,
77 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
78
79 fn key_value_store_open_entry(
80 &mut self,
81 node_id: Vec<u8>,
82 key: Vec<u8>,
83 flags: u32,
84 ) -> Result<SubstateHandle, InvokeError<WasmRuntimeError>>;
85
86 fn key_value_entry_get(&mut self, handle: u32)
87 -> Result<Buffer, InvokeError<WasmRuntimeError>>;
88
89 fn key_value_entry_set(
90 &mut self,
91 handle: u32,
92 data: Vec<u8>,
93 ) -> Result<(), InvokeError<WasmRuntimeError>>;
94
95 fn key_value_entry_remove(
96 &mut self,
97 handle: u32,
98 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
99
100 fn key_value_entry_close(&mut self, handle: u32) -> Result<(), InvokeError<WasmRuntimeError>>;
101
102 fn key_value_store_remove_entry(
103 &mut self,
104 node_id: Vec<u8>,
105 key: Vec<u8>,
106 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
107
108 fn instance_of(
109 &mut self,
110 object_id: Vec<u8>,
111 package_address: Vec<u8>,
112 blueprint_name: Vec<u8>,
113 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
114
115 fn blueprint_id(&mut self, object_id: Vec<u8>)
116 -> Result<Buffer, InvokeError<WasmRuntimeError>>;
117
118 fn get_outer_object(
119 &mut self,
120 component_id: Vec<u8>,
121 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
122
123 fn actor_open_field(
124 &mut self,
125 object_handle: u32,
126 field: u8,
127 flags: u32,
128 ) -> Result<SubstateHandle, InvokeError<WasmRuntimeError>>;
129
130 fn field_entry_read(
131 &mut self,
132 handle: SubstateHandle,
133 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
134
135 fn field_entry_write(
136 &mut self,
137 handle: SubstateHandle,
138 data: Vec<u8>,
139 ) -> Result<(), InvokeError<WasmRuntimeError>>;
140
141 fn field_entry_close(
142 &mut self,
143 handle: SubstateHandle,
144 ) -> Result<(), InvokeError<WasmRuntimeError>>;
145
146 fn actor_get_node_id(
147 &mut self,
148 actor_ref_handle: ActorRefHandle,
149 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
150
151 fn actor_get_package_address(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
152
153 fn actor_get_blueprint_name(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
154
155 fn consume_wasm_execution_units(&mut self, n: u32)
156 -> Result<(), InvokeError<WasmRuntimeError>>;
157
158 fn costing_get_execution_cost_unit_limit(
159 &mut self,
160 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
161
162 fn costing_get_execution_cost_unit_price(
163 &mut self,
164 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
165
166 fn costing_get_finalization_cost_unit_limit(
167 &mut self,
168 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
169
170 fn costing_get_finalization_cost_unit_price(
171 &mut self,
172 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
173
174 fn costing_get_usd_price(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
175
176 fn costing_get_tip_percentage(&mut self) -> Result<u32, InvokeError<WasmRuntimeError>>;
177
178 fn costing_get_fee_balance(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
179
180 fn actor_emit_event(
181 &mut self,
182 event_name: Vec<u8>,
183 event_payload: Vec<u8>,
184 event_flags: EventFlags,
185 ) -> Result<(), InvokeError<WasmRuntimeError>>;
186
187 fn sys_log(
188 &mut self,
189 level: Vec<u8>,
190 message: Vec<u8>,
191 ) -> Result<(), InvokeError<WasmRuntimeError>>;
192
193 fn sys_bech32_encode_address(
194 &mut self,
195 address: Vec<u8>,
196 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
197
198 fn sys_get_transaction_hash(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
199
200 fn sys_generate_ruid(&mut self) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
201
202 fn sys_panic(&mut self, message: Vec<u8>) -> Result<(), InvokeError<WasmRuntimeError>>;
203
204 fn crypto_utils_bls12381_v1_verify(
205 &mut self,
206 message: Vec<u8>,
207 public_key: Vec<u8>,
208 signature: Vec<u8>,
209 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
210
211 fn crypto_utils_bls12381_v1_aggregate_verify(
212 &mut self,
213 pub_keys_and_msgs: Vec<u8>,
214 signatures: Vec<u8>,
215 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
216
217 fn crypto_utils_bls12381_v1_fast_aggregate_verify(
218 &mut self,
219 message: Vec<u8>,
220 public_keys: Vec<u8>,
221 signatures: Vec<u8>,
222 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
223
224 fn crypto_utils_bls12381_g2_signature_aggregate(
225 &mut self,
226 signatures: Vec<u8>,
227 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
228
229 fn crypto_utils_keccak256_hash(
230 &mut self,
231 data: Vec<u8>,
232 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
233
234 fn crypto_utils_blake2b_256_hash(
235 &mut self,
236 data: Vec<u8>,
237 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
238
239 fn crypto_utils_ed25519_verify(
240 &mut self,
241 message: Vec<u8>,
242 public_key: Vec<u8>,
243 signature: Vec<u8>,
244 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
245
246 fn crypto_utils_secp256k1_ecdsa_verify(
247 &mut self,
248 message: Vec<u8>,
249 public_key: Vec<u8>,
250 signature: Vec<u8>,
251 ) -> Result<u32, InvokeError<WasmRuntimeError>>;
252
253 fn crypto_utils_secp256k1_ecdsa_verify_and_key_recover(
254 &mut self,
255 message: Vec<u8>,
256 signature: Vec<u8>,
257 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
258
259 fn crypto_utils_secp256k1_ecdsa_verify_and_key_recover_uncompressed(
260 &mut self,
261 message: Vec<u8>,
262 signature: Vec<u8>,
263 ) -> Result<Buffer, InvokeError<WasmRuntimeError>>;
264}
265
266pub trait WasmInstance {
268 fn invoke_export<'r>(
276 &mut self,
277 func_name: &str,
278 args: Vec<Buffer>,
279 runtime: &mut Box<dyn WasmRuntime + 'r>,
280 ) -> Result<Vec<u8>, InvokeError<WasmRuntimeError>>;
281}
282
283pub trait WasmEngine {
285 type WasmInstance: WasmInstance;
286
287 fn instantiate(&self, code_hash: CodeHash, instrumented_code: &[u8]) -> Self::WasmInstance;
291}