multiversx_chain_vm/vm_hooks/
vh_dispatcher.rs

1use std::ffi::c_void;
2
3use multiversx_chain_vm_executor::{MemLength, MemPtr, VMHooks};
4
5use crate::mem_conv;
6
7use super::VMHooksHandler;
8
9/// Dispatches messages coming via VMHooks to the underlying implementation (the VMHooksHandler).
10#[derive(Debug)]
11pub struct VMHooksDispatcher {
12    handler: Box<dyn VMHooksHandler>,
13}
14
15impl VMHooksDispatcher {
16    pub fn new(handler: Box<dyn VMHooksHandler>) -> Self {
17        VMHooksDispatcher { handler }
18    }
19}
20
21fn bool_to_i32(b: bool) -> i32 {
22    if b {
23        1
24    } else {
25        0
26    }
27}
28
29#[allow(unused)]
30impl VMHooks for VMHooksDispatcher {
31    fn set_vm_hooks_ptr(&mut self, _vm_hooks_ptr: *mut c_void) {}
32
33    fn get_gas_left(&self) -> i64 {
34        self.handler.get_gas_left() as i64
35    }
36
37    fn get_sc_address(&self, result_offset: MemPtr) {
38        panic!("Unavailable: get_sc_address");
39    }
40
41    fn get_owner_address(&self, result_offset: MemPtr) {
42        panic!("Unavailable: get_owner_address");
43    }
44
45    fn get_shard_of_address(&self, address_offset: MemPtr) -> i32 {
46        unsafe {
47            mem_conv::with_bytes(address_offset, 32, |address_bytes| {
48                self.handler.get_shard_of_address(address_bytes)
49            })
50        }
51    }
52
53    fn is_smart_contract(&self, address_offset: MemPtr) -> i32 {
54        unsafe {
55            bool_to_i32(mem_conv::with_bytes(address_offset, 32, |address_bytes| {
56                self.handler.is_smart_contract(address_bytes)
57            }))
58        }
59    }
60
61    fn signal_error(&self, message_offset: MemPtr, message_length: MemLength) {
62        unsafe {
63            mem_conv::with_bytes(message_offset, message_length, |message| {
64                self.handler.signal_error(message);
65            });
66        }
67    }
68
69    fn get_external_balance(&self, address_offset: MemPtr, result_offset: MemPtr) {
70        panic!("Unavailable: get_external_balance");
71    }
72
73    fn get_block_hash(&self, nonce: i64, result_offset: MemPtr) -> i32 {
74        panic!("Unavailable: get_block_hash")
75    }
76
77    fn get_esdt_balance(
78        &self,
79        address_offset: MemPtr,
80        token_id_offset: MemPtr,
81        token_id_len: MemLength,
82        nonce: i64,
83        result_offset: MemPtr,
84    ) -> i32 {
85        panic!("Unavailable: get_esdt_balance")
86    }
87
88    fn get_esdt_nft_name_length(
89        &self,
90        address_offset: MemPtr,
91        token_id_offset: MemPtr,
92        token_id_len: MemLength,
93        nonce: i64,
94    ) -> i32 {
95        panic!("Unavailable: get_esdt_nft_name_length")
96    }
97
98    fn get_esdt_nft_attribute_length(
99        &self,
100        address_offset: MemPtr,
101        token_id_offset: MemPtr,
102        token_id_len: MemLength,
103        nonce: i64,
104    ) -> i32 {
105        panic!("Unavailable: get_esdt_nft_attribute_length")
106    }
107
108    fn get_esdt_nft_uri_length(
109        &self,
110        address_offset: MemPtr,
111        token_id_offset: MemPtr,
112        token_id_len: MemLength,
113        nonce: i64,
114    ) -> i32 {
115        panic!("Unavailable: get_esdt_nft_uri_length")
116    }
117
118    fn get_esdt_token_data(
119        &self,
120        address_offset: MemPtr,
121        token_id_offset: MemPtr,
122        token_id_len: MemLength,
123        nonce: i64,
124        value_handle: i32,
125        properties_offset: MemPtr,
126        hash_offset: MemPtr,
127        name_offset: MemPtr,
128        attributes_offset: MemPtr,
129        creator_offset: MemPtr,
130        royalties_handle: i32,
131        uris_offset: MemPtr,
132    ) -> i32 {
133        panic!("Unavailable: get_esdt_token_data")
134    }
135
136    fn get_esdt_local_roles(&self, token_id_handle: i32) -> i64 {
137        self.handler.get_esdt_local_roles_bits(token_id_handle) as i64
138    }
139
140    fn validate_token_identifier(&self, token_id_handle: i32) -> i32 {
141        panic!("Unavailable: validate_token_identifier")
142    }
143
144    fn transfer_value(
145        &self,
146        dest_offset: MemPtr,
147        value_offset: MemPtr,
148        data_offset: MemPtr,
149        length: MemLength,
150    ) -> i32 {
151        panic!("Unavailable: transfer_value")
152    }
153
154    fn transfer_value_execute(
155        &self,
156        dest_offset: MemPtr,
157        value_offset: MemPtr,
158        gas_limit: i64,
159        function_offset: MemPtr,
160        function_length: MemLength,
161        num_arguments: i32,
162        arguments_length_offset: MemPtr,
163        data_offset: MemPtr,
164    ) -> i32 {
165        panic!("Unavailable: transfer_value_execute")
166    }
167
168    fn transfer_esdt_execute(
169        &self,
170        dest_offset: MemPtr,
171        token_id_offset: MemPtr,
172        token_id_len: MemLength,
173        value_offset: MemPtr,
174        gas_limit: i64,
175        function_offset: MemPtr,
176        function_length: MemLength,
177        num_arguments: i32,
178        arguments_length_offset: MemPtr,
179        data_offset: MemPtr,
180    ) -> i32 {
181        panic!("Unavailable: transfer_esdt_execute")
182    }
183
184    fn transfer_esdt_nft_execute(
185        &self,
186        dest_offset: MemPtr,
187        token_id_offset: MemPtr,
188        token_id_len: MemLength,
189        value_offset: MemPtr,
190        nonce: i64,
191        gas_limit: i64,
192        function_offset: MemPtr,
193        function_length: MemLength,
194        num_arguments: i32,
195        arguments_length_offset: MemPtr,
196        data_offset: MemPtr,
197    ) -> i32 {
198        panic!("Unavailable: transfer_esdt_nft_execute")
199    }
200
201    fn multi_transfer_esdt_nft_execute(
202        &self,
203        dest_offset: MemPtr,
204        num_token_transfers: i32,
205        token_transfers_args_length_offset: MemPtr,
206        token_transfer_data_offset: MemPtr,
207        gas_limit: i64,
208        function_offset: MemPtr,
209        function_length: MemLength,
210        num_arguments: i32,
211        arguments_length_offset: MemPtr,
212        data_offset: MemPtr,
213    ) -> i32 {
214        panic!("Unavailable: multi_transfer_esdt_nft_execute")
215    }
216
217    fn create_async_call(
218        &self,
219        dest_offset: MemPtr,
220        value_offset: MemPtr,
221        data_offset: MemPtr,
222        data_length: MemLength,
223        success_offset: MemPtr,
224        success_length: MemLength,
225        error_offset: MemPtr,
226        error_length: MemLength,
227        gas: i64,
228        extra_gas_for_callback: i64,
229    ) -> i32 {
230        panic!("Unavailable: create_async_call")
231    }
232
233    fn set_async_context_callback(
234        &self,
235        callback: MemPtr,
236        callback_length: MemLength,
237        data: MemPtr,
238        data_length: MemLength,
239        gas: i64,
240    ) -> i32 {
241        panic!("Unavailable: set_async_context_callback")
242    }
243
244    fn upgrade_contract(
245        &self,
246        dest_offset: MemPtr,
247        gas_limit: i64,
248        value_offset: MemPtr,
249        code_offset: MemPtr,
250        code_metadata_offset: MemPtr,
251        length: MemLength,
252        num_arguments: i32,
253        arguments_length_offset: MemPtr,
254        data_offset: MemPtr,
255    ) {
256        panic!("Unavailable: upgrade_contract");
257    }
258
259    fn upgrade_from_source_contract(
260        &self,
261        dest_offset: MemPtr,
262        gas_limit: i64,
263        value_offset: MemPtr,
264        source_contract_address_offset: MemPtr,
265        code_metadata_offset: MemPtr,
266        num_arguments: i32,
267        arguments_length_offset: MemPtr,
268        data_offset: MemPtr,
269    ) {
270        panic!("Unavailable: upgrade_from_source_contract");
271    }
272
273    fn delete_contract(
274        &self,
275        dest_offset: MemPtr,
276        gas_limit: i64,
277        num_arguments: i32,
278        arguments_length_offset: MemPtr,
279        data_offset: MemPtr,
280    ) {
281        panic!("Unavailable: delete_contract");
282    }
283
284    fn async_call(
285        &self,
286        dest_offset: MemPtr,
287        value_offset: MemPtr,
288        data_offset: MemPtr,
289        length: MemLength,
290    ) {
291        panic!("Unavailable: async_call");
292    }
293
294    fn get_argument_length(&self, id: i32) -> i32 {
295        panic!("Unavailable: get_argument_length")
296    }
297
298    fn get_argument(&self, id: i32, arg_offset: MemPtr) -> i32 {
299        panic!("Unavailable: get_argument")
300    }
301
302    fn get_function(&self, function_offset: MemPtr) -> i32 {
303        panic!("Unavailable: get_function")
304    }
305
306    fn get_num_arguments(&self) -> i32 {
307        self.handler.get_num_arguments()
308    }
309
310    fn storage_store(
311        &self,
312        key_offset: MemPtr,
313        key_length: MemLength,
314        data_offset: MemPtr,
315        data_length: MemLength,
316    ) -> i32 {
317        panic!("Unavailable: storage_store")
318    }
319
320    fn storage_load_length(&self, key_offset: MemPtr, key_length: MemLength) -> i32 {
321        panic!("Unavailable: storage_load_length")
322    }
323
324    fn storage_load_from_address(
325        &self,
326        address_offset: MemPtr,
327        key_offset: MemPtr,
328        key_length: MemLength,
329        data_offset: MemPtr,
330    ) -> i32 {
331        panic!("Unavailable: storage_load_from_address")
332    }
333
334    fn storage_load(&self, key_offset: MemPtr, key_length: MemLength, data_offset: MemPtr) -> i32 {
335        panic!("Unavailable: storage_load")
336    }
337
338    fn set_storage_lock(
339        &self,
340        key_offset: MemPtr,
341        key_length: MemLength,
342        lock_timestamp: i64,
343    ) -> i32 {
344        panic!("Unavailable: set_storage_lock")
345    }
346
347    fn get_storage_lock(&self, key_offset: MemPtr, key_length: MemLength) -> i64 {
348        panic!("Unavailable: get_storage_lock")
349    }
350
351    fn is_storage_locked(&self, key_offset: MemPtr, key_length: MemLength) -> i32 {
352        panic!("Unavailable: is_storage_locked")
353    }
354
355    fn clear_storage_lock(&self, key_offset: MemPtr, key_length: MemLength) -> i32 {
356        panic!("Unavailable: clear_storage_lock")
357    }
358
359    fn get_caller(&self, result_offset: MemPtr) {
360        panic!("Unavailable: get_caller");
361    }
362
363    fn check_no_payment(&self) {
364        self.handler.check_not_payable();
365    }
366
367    fn get_call_value(&self, result_offset: MemPtr) -> i32 {
368        panic!("Unavailable: get_call_value")
369    }
370
371    fn get_esdt_value(&self, result_offset: MemPtr) -> i32 {
372        panic!("Unavailable: get_esdt_value")
373    }
374
375    fn get_esdt_value_by_index(&self, result_offset: MemPtr, index: i32) -> i32 {
376        panic!("Unavailable: get_esdt_value_by_index")
377    }
378
379    fn get_esdt_token_name(&self, result_offset: MemPtr) -> i32 {
380        panic!("Unavailable: get_esdt_token_name")
381    }
382
383    fn get_esdt_token_name_by_index(&self, result_offset: MemPtr, index: i32) -> i32 {
384        panic!("Unavailable: get_esdt_token_name_by_index")
385    }
386
387    fn get_esdt_token_nonce(&self) -> i64 {
388        panic!("Unavailable: get_esdt_token_nonce")
389    }
390
391    fn get_esdt_token_nonce_by_index(&self, index: i32) -> i64 {
392        panic!("Unavailable: get_esdt_token_nonce_by_index")
393    }
394
395    fn get_current_esdt_nft_nonce(
396        &self,
397        address_offset: MemPtr,
398        token_id_offset: MemPtr,
399        token_id_len: MemLength,
400    ) -> i64 {
401        unsafe {
402            mem_conv::with_bytes(address_offset, 32, |address_bytes| {
403                mem_conv::with_bytes(token_id_offset, token_id_len, |token_id_bytes| {
404                    self.handler
405                        .get_current_esdt_nft_nonce(address_bytes, token_id_bytes)
406                        as i64
407                })
408            })
409        }
410    }
411
412    fn get_esdt_token_type(&self) -> i32 {
413        panic!("Unavailable: get_esdt_token_type")
414    }
415
416    fn get_esdt_token_type_by_index(&self, index: i32) -> i32 {
417        panic!("Unavailable: get_esdt_token_type_by_index")
418    }
419
420    fn get_num_esdt_transfers(&self) -> i32 {
421        self.handler.esdt_num_transfers() as i32
422    }
423
424    fn get_call_value_token_name(
425        &self,
426        call_value_offset: MemPtr,
427        token_name_offset: MemPtr,
428    ) -> i32 {
429        panic!("Unavailable: get_call_value_token_name")
430    }
431
432    fn get_call_value_token_name_by_index(
433        &self,
434        call_value_offset: MemPtr,
435        token_name_offset: MemPtr,
436        index: i32,
437    ) -> i32 {
438        panic!("Unavailable: get_call_value_token_name_by_index")
439    }
440
441    fn write_log(
442        &self,
443        data_pointer: MemPtr,
444        data_length: MemLength,
445        topic_ptr: MemPtr,
446        num_topics: i32,
447    ) {
448        panic!("Unavailable: write_log");
449    }
450
451    fn write_event_log(
452        &self,
453        num_topics: i32,
454        topic_lengths_offset: MemPtr,
455        topic_offset: MemPtr,
456        data_offset: MemPtr,
457        data_length: MemLength,
458    ) {
459        panic!("Unavailable: write_event_log");
460    }
461
462    fn get_block_timestamp(&self) -> i64 {
463        self.handler.get_block_timestamp() as i64
464    }
465
466    fn get_block_nonce(&self) -> i64 {
467        self.handler.get_block_nonce() as i64
468    }
469
470    fn get_block_round(&self) -> i64 {
471        self.handler.get_block_round() as i64
472    }
473
474    fn get_block_epoch(&self) -> i64 {
475        self.handler.get_block_epoch() as i64
476    }
477
478    fn get_block_random_seed(&self, pointer: MemPtr) {
479        panic!("Unavailable: get_block_random_seed");
480    }
481
482    fn get_state_root_hash(&self, pointer: MemPtr) {
483        panic!("Unavailable: get_state_root_hash");
484    }
485
486    fn get_prev_block_timestamp(&self) -> i64 {
487        self.handler.get_prev_block_timestamp() as i64
488    }
489
490    fn get_prev_block_nonce(&self) -> i64 {
491        self.handler.get_prev_block_nonce() as i64
492    }
493
494    fn get_prev_block_round(&self) -> i64 {
495        self.handler.get_prev_block_round() as i64
496    }
497
498    fn get_prev_block_epoch(&self) -> i64 {
499        self.handler.get_prev_block_epoch() as i64
500    }
501
502    fn get_prev_block_random_seed(&self, pointer: MemPtr) {
503        panic!("Unavailable: get_prev_block_random_seed");
504    }
505
506    fn finish(&self, pointer: MemPtr, length: MemLength) {
507        unsafe {
508            mem_conv::with_bytes(pointer, length, |bytes| {
509                self.handler.finish_slice_u8(bytes);
510            })
511        }
512    }
513
514    fn execute_on_same_context(
515        &self,
516        gas_limit: i64,
517        address_offset: MemPtr,
518        value_offset: MemPtr,
519        function_offset: MemPtr,
520        function_length: MemLength,
521        num_arguments: i32,
522        arguments_length_offset: MemPtr,
523        data_offset: MemPtr,
524    ) -> i32 {
525        panic!("Unavailable: execute_on_same_context")
526    }
527
528    fn execute_on_dest_context(
529        &self,
530        gas_limit: i64,
531        address_offset: MemPtr,
532        value_offset: MemPtr,
533        function_offset: MemPtr,
534        function_length: MemLength,
535        num_arguments: i32,
536        arguments_length_offset: MemPtr,
537        data_offset: MemPtr,
538    ) -> i32 {
539        panic!("Unavailable: execute_on_dest_context")
540    }
541
542    fn execute_read_only(
543        &self,
544        gas_limit: i64,
545        address_offset: MemPtr,
546        function_offset: MemPtr,
547        function_length: MemLength,
548        num_arguments: i32,
549        arguments_length_offset: MemPtr,
550        data_offset: MemPtr,
551    ) -> i32 {
552        panic!("Unavailable: execute_read_only")
553    }
554
555    fn create_contract(
556        &self,
557        gas_limit: i64,
558        value_offset: MemPtr,
559        code_offset: MemPtr,
560        code_metadata_offset: MemPtr,
561        length: MemLength,
562        result_offset: MemPtr,
563        num_arguments: i32,
564        arguments_length_offset: MemPtr,
565        data_offset: MemPtr,
566    ) -> i32 {
567        panic!("Unavailable: create_contract")
568    }
569
570    fn deploy_from_source_contract(
571        &self,
572        gas_limit: i64,
573        value_offset: MemPtr,
574        source_contract_address_offset: MemPtr,
575        code_metadata_offset: MemPtr,
576        result_address_offset: MemPtr,
577        num_arguments: i32,
578        arguments_length_offset: MemPtr,
579        data_offset: MemPtr,
580    ) -> i32 {
581        panic!("Unavailable: deploy_from_source_contract")
582    }
583
584    fn get_num_return_data(&self) -> i32 {
585        panic!("Unavailable: get_num_return_data")
586    }
587
588    fn get_return_data_size(&self, result_id: i32) -> i32 {
589        panic!("Unavailable: get_return_data_size")
590    }
591
592    fn get_return_data(&self, result_id: i32, data_offset: MemPtr) -> i32 {
593        panic!("Unavailable: get_return_data")
594    }
595
596    fn clean_return_data(&self) {
597        self.handler.clean_return_data();
598    }
599
600    fn delete_from_return_data(&self, result_id: i32) {
601        self.handler.delete_from_return_data(result_id as usize);
602    }
603
604    fn get_original_tx_hash(&self, data_offset: MemPtr) {
605        panic!("Unavailable: get_original_tx_hash");
606    }
607
608    fn get_current_tx_hash(&self, data_offset: MemPtr) {
609        panic!("Unavailable: get_current_tx_hash");
610    }
611
612    fn get_prev_tx_hash(&self, data_offset: MemPtr) {
613        panic!("Unavailable: get_prev_tx_hash");
614    }
615
616    fn managed_sc_address(&self, destination_handle: i32) {
617        self.handler.managed_sc_address(destination_handle);
618    }
619
620    fn managed_owner_address(&self, destination_handle: i32) {
621        self.handler.managed_owner_address(destination_handle);
622    }
623
624    fn managed_caller(&self, destination_handle: i32) {
625        self.handler.managed_caller(destination_handle);
626    }
627
628    fn managed_signal_error(&self, err_handle: i32) {
629        self.handler.signal_error_from_buffer(err_handle);
630    }
631
632    fn managed_write_log(&self, topics_handle: i32, data_handle: i32) {
633        self.handler.managed_write_log(topics_handle, data_handle);
634    }
635
636    fn managed_get_original_tx_hash(&self, result_handle: i32) {
637        self.handler.get_tx_hash(result_handle);
638    }
639
640    fn managed_get_state_root_hash(&self, result_handle: i32) {
641        panic!("Unavailable: managed_get_state_root_hash");
642    }
643
644    fn managed_get_block_random_seed(&self, result_handle: i32) {
645        self.handler.get_block_random_seed(result_handle);
646    }
647
648    fn managed_get_prev_block_random_seed(&self, result_handle: i32) {
649        self.handler.get_prev_block_random_seed(result_handle);
650    }
651
652    fn managed_get_return_data(&self, result_id: i32, result_handle: i32) {
653        panic!("Unavailable: managed_get_return_data");
654    }
655
656    fn managed_get_multi_esdt_call_value(&self, multi_call_value_handle: i32) {
657        self.handler
658            .load_all_esdt_transfers(multi_call_value_handle)
659    }
660
661    fn managed_get_esdt_balance(
662        &self,
663        address_handle: i32,
664        token_id_handle: i32,
665        nonce: i64,
666        value_handle: i32,
667    ) {
668        panic!("Unavailable: managed_get_esdt_balance");
669    }
670
671    fn managed_get_esdt_token_data(
672        &self,
673        address_handle: i32,
674        token_id_handle: i32,
675        nonce: i64,
676        value_handle: i32,
677        properties_handle: i32,
678        hash_handle: i32,
679        name_handle: i32,
680        attributes_handle: i32,
681        creator_handle: i32,
682        royalties_handle: i32,
683        uris_handle: i32,
684    ) {
685        self.handler.managed_get_esdt_token_data(
686            address_handle,
687            token_id_handle,
688            nonce as u64,
689            value_handle,
690            properties_handle,
691            hash_handle,
692            name_handle,
693            attributes_handle,
694            creator_handle,
695            royalties_handle,
696            uris_handle,
697        );
698    }
699
700    fn managed_get_back_transfers(&self, esdt_transfer_value_handle: i32, call_value_handle: i32) {
701        self.handler
702            .managed_get_back_transfers(esdt_transfer_value_handle, call_value_handle);
703    }
704
705    fn managed_async_call(
706        &self,
707        dest_handle: i32,
708        value_handle: i32,
709        function_handle: i32,
710        arguments_handle: i32,
711    ) {
712        self.handler
713            .async_call_raw(dest_handle, value_handle, function_handle, arguments_handle)
714    }
715
716    fn managed_create_async_call(
717        &self,
718        dest_handle: i32,
719        value_handle: i32,
720        function_handle: i32,
721        arguments_handle: i32,
722        success_offset: MemPtr,
723        success_length: MemLength,
724        error_offset: MemPtr,
725        error_length: MemLength,
726        gas: i64,
727        extra_gas_for_callback: i64,
728        callback_closure_handle: i32,
729    ) -> i32 {
730        unsafe {
731            mem_conv::with_bytes(success_offset, success_length, |success_callback| {
732                mem_conv::with_bytes(error_offset, error_length, |error_callback| {
733                    self.handler.create_async_call_raw(
734                        dest_handle,
735                        value_handle,
736                        function_handle,
737                        arguments_handle,
738                        success_callback,
739                        error_callback,
740                        gas as u64,
741                        extra_gas_for_callback as u64,
742                        callback_closure_handle,
743                    );
744                })
745            })
746        }
747        0
748    }
749
750    fn managed_get_callback_closure(&self, callback_closure_handle: i32) {
751        self.handler
752            .load_callback_closure_buffer(callback_closure_handle)
753    }
754
755    fn managed_upgrade_from_source_contract(
756        &self,
757        dest_handle: i32,
758        gas: i64,
759        value_handle: i32,
760        address_handle: i32,
761        code_metadata_handle: i32,
762        arguments_handle: i32,
763        _result_handle: i32,
764    ) {
765        self.handler.upgrade_from_source_contract(
766            dest_handle,
767            gas as u64,
768            value_handle,
769            address_handle,
770            code_metadata_handle,
771            arguments_handle,
772        );
773    }
774
775    fn managed_upgrade_contract(
776        &self,
777        dest_handle: i32,
778        gas: i64,
779        value_handle: i32,
780        code_handle: i32,
781        code_metadata_handle: i32,
782        arguments_handle: i32,
783        _result_handle: i32,
784    ) {
785        self.handler.upgrade_contract(
786            dest_handle,
787            gas as u64,
788            value_handle,
789            code_handle,
790            code_metadata_handle,
791            arguments_handle,
792        )
793    }
794
795    fn managed_delete_contract(&self, dest_handle: i32, gas_limit: i64, arguments_handle: i32) {
796        panic!("Unavailable: managed_delete_contract");
797    }
798
799    fn managed_deploy_from_source_contract(
800        &self,
801        gas: i64,
802        value_handle: i32,
803        address_handle: i32,
804        code_metadata_handle: i32,
805        arguments_handle: i32,
806        result_address_handle: i32,
807        result_handle: i32,
808    ) -> i32 {
809        self.handler.deploy_from_source_contract(
810            gas as u64,
811            value_handle,
812            address_handle,
813            code_metadata_handle,
814            arguments_handle,
815            result_address_handle,
816            result_handle,
817        );
818        0
819    }
820
821    fn managed_create_contract(
822        &self,
823        gas: i64,
824        value_handle: i32,
825        code_handle: i32,
826        code_metadata_handle: i32,
827        arguments_handle: i32,
828        result_address_handle: i32,
829        result_handle: i32,
830    ) -> i32 {
831        self.handler.deploy_contract(
832            gas as u64,
833            value_handle,
834            code_handle,
835            code_metadata_handle,
836            arguments_handle,
837            result_address_handle,
838            result_handle,
839        );
840        0
841    }
842
843    fn managed_execute_read_only(
844        &self,
845        gas: i64,
846        address_handle: i32,
847        function_handle: i32,
848        arguments_handle: i32,
849        result_handle: i32,
850    ) -> i32 {
851        self.handler.execute_on_dest_context_readonly_raw(
852            gas as u64,
853            address_handle,
854            function_handle,
855            arguments_handle,
856            result_handle,
857        );
858        0
859    }
860
861    fn managed_execute_on_same_context(
862        &self,
863        gas: i64,
864        address_handle: i32,
865        value_handle: i32,
866        function_handle: i32,
867        arguments_handle: i32,
868        result_handle: i32,
869    ) -> i32 {
870        panic!("Unavailable: managed_execute_on_same_context")
871    }
872
873    fn managed_execute_on_dest_context(
874        &self,
875        gas: i64,
876        address_handle: i32,
877        value_handle: i32,
878        function_handle: i32,
879        arguments_handle: i32,
880        result_handle: i32,
881    ) -> i32 {
882        self.handler.execute_on_dest_context_raw(
883            gas as u64,
884            address_handle,
885            value_handle,
886            function_handle,
887            arguments_handle,
888            result_handle,
889        );
890        0
891    }
892
893    fn managed_multi_transfer_esdt_nft_execute(
894        &self,
895        dst_handle: i32,
896        token_transfers_handle: i32,
897        gas_limit: i64,
898        function_handle: i32,
899        arguments_handle: i32,
900    ) -> i32 {
901        self.handler.multi_transfer_esdt_nft_execute(
902            dst_handle,
903            token_transfers_handle,
904            gas_limit as u64,
905            function_handle,
906            arguments_handle,
907        );
908        0
909    }
910
911    fn managed_transfer_value_execute(
912        &self,
913        dst_handle: i32,
914        value_handle: i32,
915        gas_limit: i64,
916        function_handle: i32,
917        arguments_handle: i32,
918    ) -> i32 {
919        self.handler.transfer_value_execute(
920            dst_handle,
921            value_handle,
922            gas_limit as u64,
923            function_handle,
924            arguments_handle,
925        );
926        0
927    }
928
929    fn managed_is_esdt_frozen(&self, address_handle: i32, token_id_handle: i32, nonce: i64) -> i32 {
930        bool_to_i32(
931            self.handler
932                .check_esdt_frozen(address_handle, token_id_handle, nonce as u64),
933        )
934    }
935
936    fn managed_is_esdt_limited_transfer(&self, _token_id_handle: i32) -> i32 {
937        bool_to_i32(false)
938    }
939
940    fn managed_is_esdt_paused(&self, _token_id_handle: i32) -> i32 {
941        bool_to_i32(false)
942    }
943
944    fn managed_buffer_to_hex(&self, source_handle: i32, dest_handle: i32) {
945        self.handler.mb_to_hex(source_handle, dest_handle);
946    }
947
948    fn managed_get_code_metadata(&self, address_handle: i32, response_handle: i32) {
949        self.handler
950            .managed_get_code_metadata(address_handle, response_handle);
951    }
952
953    fn managed_is_builtin_function(&self, function_name_handle: i32) -> i32 {
954        bool_to_i32(
955            self.handler
956                .managed_is_builtin_function(function_name_handle),
957        )
958    }
959
960    fn big_float_new_from_parts(
961        &self,
962        integral_part: i32,
963        fractional_part: i32,
964        exponent: i32,
965    ) -> i32 {
966        self.handler
967            .bf_from_parts(integral_part, fractional_part, exponent)
968    }
969
970    fn big_float_new_from_frac(&self, numerator: i64, denominator: i64) -> i32 {
971        self.handler.bf_from_frac(numerator, denominator)
972    }
973
974    fn big_float_new_from_sci(&self, significand: i64, exponent: i64) -> i32 {
975        self.handler.bf_from_sci(significand, exponent)
976    }
977
978    fn big_float_add(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
979        self.handler
980            .bf_add(destination_handle, op1_handle, op2_handle);
981    }
982
983    fn big_float_sub(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
984        self.handler
985            .bf_sub(destination_handle, op1_handle, op2_handle);
986    }
987
988    fn big_float_mul(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
989        self.handler
990            .bf_mul(destination_handle, op1_handle, op2_handle);
991    }
992
993    fn big_float_div(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
994        self.handler
995            .bf_div(destination_handle, op1_handle, op2_handle);
996    }
997
998    fn big_float_neg(&self, destination_handle: i32, op_handle: i32) {
999        self.handler.bf_neg(destination_handle, op_handle);
1000    }
1001
1002    fn big_float_clone(&self, destination_handle: i32, op_handle: i32) {
1003        self.handler.bf_clone(destination_handle, op_handle);
1004    }
1005
1006    fn big_float_cmp(&self, op1_handle: i32, op2_handle: i32) -> i32 {
1007        self.handler.bf_cmp(op1_handle, op2_handle)
1008    }
1009
1010    fn big_float_abs(&self, destination_handle: i32, op_handle: i32) {
1011        self.handler.bf_abs(destination_handle, op_handle);
1012    }
1013
1014    fn big_float_sign(&self, op_handle: i32) -> i32 {
1015        self.handler.bf_sign(op_handle)
1016    }
1017
1018    fn big_float_sqrt(&self, destination_handle: i32, op_handle: i32) {
1019        self.handler.bf_sqrt(destination_handle, op_handle);
1020    }
1021
1022    fn big_float_pow(&self, destination_handle: i32, op_handle: i32, exponent: i32) {
1023        self.handler.bf_pow(destination_handle, op_handle, exponent);
1024    }
1025
1026    fn big_float_floor(&self, dest_big_int_handle: i32, op_handle: i32) {
1027        self.handler.bf_floor(dest_big_int_handle, op_handle);
1028    }
1029
1030    fn big_float_ceil(&self, dest_big_int_handle: i32, op_handle: i32) {
1031        self.handler.bf_ceil(dest_big_int_handle, op_handle);
1032    }
1033
1034    fn big_float_truncate(&self, dest_big_int_handle: i32, op_handle: i32) {
1035        self.handler.bf_trunc(dest_big_int_handle, op_handle);
1036    }
1037
1038    fn big_float_set_int64(&self, destination_handle: i32, value: i64) {
1039        self.handler.bf_set_i64(destination_handle, value);
1040    }
1041
1042    fn big_float_is_int(&self, op_handle: i32) -> i32 {
1043        bool_to_i32(self.handler.bf_is_bi(op_handle))
1044    }
1045
1046    fn big_float_set_big_int(&self, destination_handle: i32, big_int_handle: i32) {
1047        self.handler.bf_set_bi(destination_handle, big_int_handle);
1048    }
1049
1050    fn big_float_get_const_pi(&self, destination_handle: i32) {
1051        self.handler.bf_get_const_pi(destination_handle);
1052    }
1053
1054    fn big_float_get_const_e(&self, destination_handle: i32) {
1055        self.handler.bf_get_const_e(destination_handle);
1056    }
1057
1058    fn big_int_get_unsigned_argument(&self, id: i32, destination_handle: i32) {
1059        panic!("Unavailable: big_int_get_unsigned_argument");
1060    }
1061
1062    fn big_int_get_signed_argument(&self, id: i32, destination_handle: i32) {
1063        panic!("Unavailable: big_int_get_signed_argument");
1064    }
1065
1066    fn big_int_storage_store_unsigned(
1067        &self,
1068        key_offset: MemPtr,
1069        key_length: MemLength,
1070        source_handle: i32,
1071    ) -> i32 {
1072        panic!("Unavailable: big_int_storage_store_unsigned")
1073    }
1074
1075    fn big_int_storage_load_unsigned(
1076        &self,
1077        key_offset: MemPtr,
1078        key_length: MemLength,
1079        destination_handle: i32,
1080    ) -> i32 {
1081        panic!("Unavailable: big_int_storage_load_unsigned")
1082    }
1083
1084    fn big_int_get_call_value(&self, destination_handle: i32) {
1085        self.handler.load_egld_value(destination_handle);
1086    }
1087
1088    fn big_int_get_esdt_call_value(&self, destination: i32) {
1089        panic!("Unavailable: big_int_get_esdt_call_value");
1090    }
1091
1092    fn big_int_get_esdt_call_value_by_index(&self, destination_handle: i32, index: i32) {
1093        panic!("Unavailable: big_int_get_esdt_call_value_by_index");
1094    }
1095
1096    fn big_int_get_external_balance(&self, address_offset: MemPtr, result: i32) {
1097        unsafe {
1098            mem_conv::with_bytes(address_offset, 32, |address_bytes| {
1099                self.handler.load_balance(address_bytes, result);
1100            })
1101        }
1102    }
1103
1104    fn big_int_get_esdt_external_balance(
1105        &self,
1106        address_offset: MemPtr,
1107        token_id_offset: MemPtr,
1108        token_id_len: MemLength,
1109        nonce: i64,
1110        result_handle: i32,
1111    ) {
1112        unsafe {
1113            mem_conv::with_bytes(address_offset, 32, |address_bytes| {
1114                mem_conv::with_bytes(token_id_offset, token_id_len, |token_id_bytes| {
1115                    self.handler.big_int_get_esdt_external_balance(
1116                        address_bytes,
1117                        token_id_bytes,
1118                        nonce as u64,
1119                        result_handle,
1120                    );
1121                })
1122            })
1123        }
1124    }
1125
1126    fn big_int_new(&self, small_value: i64) -> i32 {
1127        self.handler.bi_new(small_value)
1128    }
1129
1130    fn big_int_unsigned_byte_length(&self, reference_handle: i32) -> i32 {
1131        panic!("Unavailable: big_int_unsigned_byte_length")
1132    }
1133
1134    fn big_int_signed_byte_length(&self, reference_handle: i32) -> i32 {
1135        panic!("Unavailable: big_int_signed_byte_length")
1136    }
1137
1138    fn big_int_get_unsigned_bytes(&self, reference_handle: i32, byte_offset: MemPtr) -> i32 {
1139        panic!("Unavailable: big_int_get_unsigned_bytes")
1140    }
1141
1142    fn big_int_get_signed_bytes(&self, reference_handle: i32, byte_offset: MemPtr) -> i32 {
1143        panic!("Unavailable: big_int_get_signed_bytes")
1144    }
1145
1146    fn big_int_set_unsigned_bytes(
1147        &self,
1148        destination_handle: i32,
1149        byte_offset: MemPtr,
1150        byte_length: MemLength,
1151    ) {
1152        unsafe {
1153            mem_conv::with_bytes_mut(byte_offset, byte_length, |bytes| {
1154                self.handler
1155                    .bi_set_unsigned_bytes(destination_handle, bytes);
1156            })
1157        }
1158    }
1159
1160    fn big_int_set_signed_bytes(
1161        &self,
1162        destination_handle: i32,
1163        byte_offset: MemPtr,
1164        byte_length: MemLength,
1165    ) {
1166        unsafe {
1167            mem_conv::with_bytes_mut(byte_offset, byte_length, |bytes| {
1168                self.handler.bi_set_signed_bytes(destination_handle, bytes);
1169            })
1170        }
1171    }
1172
1173    fn big_int_is_int64(&self, destination_handle: i32) -> i32 {
1174        self.handler.bi_is_int64(destination_handle)
1175    }
1176
1177    fn big_int_get_int64(&self, destination_handle: i32) -> i64 {
1178        self.handler.bi_get_int64(destination_handle)
1179    }
1180
1181    fn big_int_set_int64(&self, destination_handle: i32, value: i64) {
1182        self.handler.bi_set_int64(destination_handle, value);
1183    }
1184
1185    fn big_int_add(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1186        self.handler
1187            .bi_add(destination_handle, op1_handle, op2_handle);
1188    }
1189
1190    fn big_int_sub(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1191        self.handler
1192            .bi_sub(destination_handle, op1_handle, op2_handle);
1193    }
1194
1195    fn big_int_mul(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1196        self.handler
1197            .bi_mul(destination_handle, op1_handle, op2_handle);
1198    }
1199
1200    fn big_int_tdiv(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1201        self.handler
1202            .bi_t_div(destination_handle, op1_handle, op2_handle);
1203    }
1204
1205    fn big_int_tmod(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1206        self.handler
1207            .bi_t_mod(destination_handle, op1_handle, op2_handle);
1208    }
1209
1210    fn big_int_ediv(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1211        panic!("Not supported: big_int_ediv");
1212    }
1213
1214    fn big_int_emod(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1215        panic!("Not supported: big_int_emod");
1216    }
1217
1218    fn big_int_sqrt(&self, destination_handle: i32, op_handle: i32) {
1219        self.handler.bi_sqrt(destination_handle, op_handle);
1220    }
1221
1222    fn big_int_pow(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1223        self.handler
1224            .bi_pow(destination_handle, op1_handle, op2_handle);
1225    }
1226
1227    fn big_int_log2(&self, op_handle: i32) -> i32 {
1228        self.handler.bi_log2(op_handle)
1229    }
1230
1231    fn big_int_abs(&self, destination_handle: i32, op_handle: i32) {
1232        self.handler.bi_abs(destination_handle, op_handle);
1233    }
1234
1235    fn big_int_neg(&self, destination_handle: i32, op_handle: i32) {
1236        self.handler.bi_neg(destination_handle, op_handle);
1237    }
1238
1239    fn big_int_sign(&self, op_handle: i32) -> i32 {
1240        self.handler.bi_sign(op_handle)
1241    }
1242
1243    fn big_int_cmp(&self, op1_handle: i32, op2_handle: i32) -> i32 {
1244        self.handler.bi_cmp(op1_handle, op2_handle)
1245    }
1246
1247    fn big_int_not(&self, destination_handle: i32, op_handle: i32) {
1248        panic!("Unavailable: big_int_not");
1249    }
1250
1251    fn big_int_and(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1252        self.handler
1253            .bi_and(destination_handle, op1_handle, op2_handle);
1254    }
1255
1256    fn big_int_or(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1257        self.handler
1258            .bi_or(destination_handle, op1_handle, op2_handle);
1259    }
1260
1261    fn big_int_xor(&self, destination_handle: i32, op1_handle: i32, op2_handle: i32) {
1262        self.handler
1263            .bi_xor(destination_handle, op1_handle, op2_handle);
1264    }
1265
1266    fn big_int_shr(&self, destination_handle: i32, op_handle: i32, bits: i32) {
1267        self.handler
1268            .bi_shr(destination_handle, op_handle, bits as usize);
1269    }
1270
1271    fn big_int_shl(&self, destination_handle: i32, op_handle: i32, bits: i32) {
1272        self.handler
1273            .bi_shl(destination_handle, op_handle, bits as usize);
1274    }
1275
1276    fn big_int_finish_unsigned(&self, reference_handle: i32) {
1277        self.handler.finish_big_uint_raw(reference_handle);
1278    }
1279
1280    fn big_int_finish_signed(&self, reference_handle: i32) {
1281        self.handler.finish_big_int_raw(reference_handle);
1282    }
1283
1284    fn big_int_to_string(&self, big_int_handle: i32, destination_handle: i32) {
1285        self.handler
1286            .bi_to_string(big_int_handle, destination_handle);
1287    }
1288
1289    fn mbuffer_new(&self) -> i32 {
1290        self.handler.mb_new_empty()
1291    }
1292
1293    fn mbuffer_new_from_bytes(&self, data_offset: MemPtr, data_length: MemLength) -> i32 {
1294        unsafe {
1295            mem_conv::with_bytes_mut(data_offset, data_length, |bytes| {
1296                self.handler.mb_new_from_bytes(bytes)
1297            })
1298        }
1299    }
1300
1301    fn mbuffer_get_length(&self, m_buffer_handle: i32) -> i32 {
1302        self.handler.mb_len(m_buffer_handle) as i32
1303    }
1304
1305    fn mbuffer_get_bytes(&self, m_buffer_handle: i32, result_offset: MemPtr) -> i32 {
1306        unsafe {
1307            self.handler
1308                .mb_copy_bytes(m_buffer_handle, result_offset as *mut u8) as i32
1309        }
1310    }
1311
1312    fn mbuffer_get_byte_slice(
1313        &self,
1314        source_handle: i32,
1315        starting_position: i32,
1316        slice_length: i32,
1317        result_offset: MemPtr,
1318    ) -> i32 {
1319        unsafe {
1320            mem_conv::with_bytes_mut(result_offset, slice_length as isize, |bytes| {
1321                self.handler
1322                    .mb_load_slice(source_handle, starting_position as usize, bytes)
1323            })
1324        }
1325    }
1326
1327    fn mbuffer_copy_byte_slice(
1328        &self,
1329        source_handle: i32,
1330        starting_position: i32,
1331        slice_length: i32,
1332        destination_handle: i32,
1333    ) -> i32 {
1334        self.handler.mb_copy_slice(
1335            source_handle,
1336            starting_position as usize,
1337            slice_length as usize,
1338            destination_handle,
1339        )
1340    }
1341
1342    fn mbuffer_eq(&self, m_buffer_handle1: i32, m_buffer_handle2: i32) -> i32 {
1343        self.handler.mb_eq(m_buffer_handle1, m_buffer_handle2)
1344    }
1345
1346    fn mbuffer_set_bytes(
1347        &self,
1348        m_buffer_handle: i32,
1349        data_offset: MemPtr,
1350        data_length: MemLength,
1351    ) -> i32 {
1352        unsafe {
1353            mem_conv::with_bytes(data_offset, data_length, |bytes| {
1354                self.handler.mb_set(m_buffer_handle, bytes);
1355            });
1356        }
1357        0
1358    }
1359
1360    fn mbuffer_set_byte_slice(
1361        &self,
1362        m_buffer_handle: i32,
1363        starting_position: i32,
1364        data_length: MemLength,
1365        data_offset: MemPtr,
1366    ) -> i32 {
1367        unsafe {
1368            mem_conv::with_bytes(data_offset, data_length, |bytes| {
1369                self.handler
1370                    .mb_set_slice(m_buffer_handle, starting_position as usize, bytes)
1371            })
1372        }
1373    }
1374
1375    fn mbuffer_append(&self, accumulator_handle: i32, data_handle: i32) -> i32 {
1376        self.handler.mb_append(accumulator_handle, data_handle);
1377        0
1378    }
1379
1380    fn mbuffer_append_bytes(
1381        &self,
1382        accumulator_handle: i32,
1383        data_offset: MemPtr,
1384        data_length: MemLength,
1385    ) -> i32 {
1386        unsafe {
1387            mem_conv::with_bytes(data_offset, data_length, |bytes| {
1388                self.handler.mb_append_bytes(accumulator_handle, bytes);
1389            });
1390        }
1391        0
1392    }
1393
1394    fn mbuffer_to_big_int_unsigned(&self, m_buffer_handle: i32, big_int_handle: i32) -> i32 {
1395        self.handler
1396            .mb_to_big_int_unsigned(m_buffer_handle, big_int_handle);
1397        0
1398    }
1399
1400    fn mbuffer_to_big_int_signed(&self, m_buffer_handle: i32, big_int_handle: i32) -> i32 {
1401        self.handler
1402            .mb_to_big_int_signed(m_buffer_handle, big_int_handle);
1403        0
1404    }
1405
1406    fn mbuffer_from_big_int_unsigned(&self, m_buffer_handle: i32, big_int_handle: i32) -> i32 {
1407        self.handler
1408            .mb_from_big_int_unsigned(m_buffer_handle, big_int_handle);
1409        0
1410    }
1411
1412    fn mbuffer_from_big_int_signed(&self, m_buffer_handle: i32, big_int_handle: i32) -> i32 {
1413        self.handler
1414            .mb_from_big_int_signed(m_buffer_handle, big_int_handle);
1415        0
1416    }
1417
1418    fn mbuffer_to_big_float(&self, m_buffer_handle: i32, big_float_handle: i32) -> i32 {
1419        panic!("Unavailable: mbuffer_to_big_float")
1420    }
1421
1422    fn mbuffer_from_big_float(&self, m_buffer_handle: i32, big_float_handle: i32) -> i32 {
1423        panic!("Unavailable: mbuffer_from_big_float")
1424    }
1425
1426    fn mbuffer_storage_store(&self, key_handle: i32, source_handle: i32) -> i32 {
1427        self.handler
1428            .storage_store_managed_buffer_raw(key_handle, source_handle);
1429        0
1430    }
1431
1432    fn mbuffer_storage_load(&self, key_handle: i32, destination_handle: i32) -> i32 {
1433        self.handler
1434            .storage_load_managed_buffer_raw(key_handle, destination_handle);
1435        0
1436    }
1437
1438    fn mbuffer_storage_load_from_address(
1439        &self,
1440        address_handle: i32,
1441        key_handle: i32,
1442        destination_handle: i32,
1443    ) {
1444        self.handler
1445            .storage_load_from_address(address_handle, key_handle, destination_handle);
1446    }
1447
1448    fn mbuffer_get_argument(&self, id: i32, destination_handle: i32) -> i32 {
1449        self.handler
1450            .load_argument_managed_buffer(id, destination_handle);
1451        0
1452    }
1453
1454    fn mbuffer_finish(&self, source_handle: i32) -> i32 {
1455        self.handler.finish_managed_buffer_raw(source_handle);
1456        0
1457    }
1458
1459    fn mbuffer_set_random(&self, destination_handle: i32, length: i32) -> i32 {
1460        self.handler
1461            .mb_set_random(destination_handle, length as usize);
1462        0
1463    }
1464
1465    fn managed_map_new(&self) -> i32 {
1466        self.handler.mm_new()
1467    }
1468
1469    fn managed_map_put(&self, map_handle: i32, key_handle: i32, value_handle: i32) -> i32 {
1470        self.handler.mm_put(map_handle, key_handle, value_handle);
1471        0
1472    }
1473
1474    fn managed_map_get(&self, map_handle: i32, key_handle: i32, out_value_handle: i32) -> i32 {
1475        self.handler
1476            .mm_get(map_handle, key_handle, out_value_handle);
1477        0
1478    }
1479
1480    fn managed_map_remove(&self, map_handle: i32, key_handle: i32, out_value_handle: i32) -> i32 {
1481        self.handler
1482            .mm_remove(map_handle, key_handle, out_value_handle);
1483        0
1484    }
1485
1486    fn managed_map_contains(&self, map_handle: i32, key_handle: i32) -> i32 {
1487        bool_to_i32(self.handler.mm_contains(map_handle, key_handle))
1488    }
1489
1490    fn small_int_get_unsigned_argument(&self, id: i32) -> i64 {
1491        self.handler.get_argument_u64(id) as i64
1492    }
1493
1494    fn small_int_get_signed_argument(&self, id: i32) -> i64 {
1495        self.handler.get_argument_i64(id)
1496    }
1497
1498    fn small_int_finish_unsigned(&self, value: i64) {
1499        self.handler.finish_u64(value as u64);
1500    }
1501
1502    fn small_int_finish_signed(&self, value: i64) {
1503        self.handler.finish_i64(value);
1504    }
1505
1506    fn small_int_storage_store_unsigned(
1507        &self,
1508        key_offset: MemPtr,
1509        key_length: MemLength,
1510        value: i64,
1511    ) -> i32 {
1512        panic!("Unavailable: small_int_storage_store_unsigned")
1513    }
1514
1515    fn small_int_storage_store_signed(
1516        &self,
1517        key_offset: MemPtr,
1518        key_length: MemLength,
1519        value: i64,
1520    ) -> i32 {
1521        panic!("Unavailable: small_int_storage_store_signed")
1522    }
1523
1524    fn small_int_storage_load_unsigned(&self, key_offset: MemPtr, key_length: MemLength) -> i64 {
1525        panic!("Unavailable: small_int_storage_load_unsigned")
1526    }
1527
1528    fn small_int_storage_load_signed(&self, key_offset: MemPtr, key_length: MemLength) -> i64 {
1529        panic!("Unavailable: small_int_storage_load_signed")
1530    }
1531
1532    fn int64get_argument(&self, id: i32) -> i64 {
1533        panic!("Unavailable: int64get_argument")
1534    }
1535
1536    fn int64finish(&self, value: i64) {
1537        panic!("Unavailable: int64finish");
1538    }
1539
1540    fn int64storage_store(&self, key_offset: MemPtr, key_length: MemLength, value: i64) -> i32 {
1541        panic!("Unavailable: int64storage_store")
1542    }
1543
1544    fn int64storage_load(&self, key_offset: MemPtr, key_length: MemLength) -> i64 {
1545        panic!("Unavailable: int64storage_load")
1546    }
1547
1548    fn sha256(&self, data_offset: MemPtr, length: MemLength, result_offset: MemPtr) -> i32 {
1549        panic!("Unavailable: sha256")
1550    }
1551
1552    fn managed_sha256(&self, input_handle: i32, output_handle: i32) -> i32 {
1553        self.handler.sha256_managed(output_handle, input_handle);
1554        0
1555    }
1556
1557    fn keccak256(&self, data_offset: MemPtr, length: MemLength, result_offset: MemPtr) -> i32 {
1558        panic!("Unavailable: keccak256")
1559    }
1560
1561    fn managed_keccak256(&self, input_handle: i32, output_handle: i32) -> i32 {
1562        self.handler.keccak256_managed(output_handle, input_handle);
1563        0
1564    }
1565
1566    fn ripemd160(&self, data_offset: MemPtr, length: MemLength, result_offset: MemPtr) -> i32 {
1567        panic!("Unavailable: ripemd160")
1568    }
1569
1570    fn managed_ripemd160(&self, input_handle: i32, output_handle: i32) -> i32 {
1571        panic!("Unavailable: managed_ripemd160")
1572    }
1573
1574    fn verify_bls(
1575        &self,
1576        key_offset: MemPtr,
1577        message_offset: MemPtr,
1578        message_length: MemLength,
1579        sig_offset: MemPtr,
1580    ) -> i32 {
1581        panic!("Unavailable: verify_bls")
1582    }
1583
1584    fn managed_verify_bls(&self, key_handle: i32, message_handle: i32, sig_handle: i32) -> i32 {
1585        panic!("Unavailable: managed_verify_bls")
1586    }
1587
1588    fn verify_ed25519(
1589        &self,
1590        key_offset: MemPtr,
1591        message_offset: MemPtr,
1592        message_length: MemLength,
1593        sig_offset: MemPtr,
1594    ) -> i32 {
1595        panic!("Unavailable: verify_ed25519")
1596    }
1597
1598    fn managed_verify_ed25519(&self, key_handle: i32, message_handle: i32, sig_handle: i32) -> i32 {
1599        self.handler
1600            .verify_ed25519_managed(key_handle, message_handle, sig_handle);
1601        0
1602    }
1603
1604    fn verify_custom_secp256k1(
1605        &self,
1606        key_offset: MemPtr,
1607        key_length: MemLength,
1608        message_offset: MemPtr,
1609        message_length: MemLength,
1610        sig_offset: MemPtr,
1611        hash_type: i32,
1612    ) -> i32 {
1613        panic!("Unavailable: verify_custom_secp256k1")
1614    }
1615
1616    fn managed_verify_custom_secp256k1(
1617        &self,
1618        key_handle: i32,
1619        message_handle: i32,
1620        sig_handle: i32,
1621        hash_type: i32,
1622    ) -> i32 {
1623        panic!("Unavailable: managed_verify_custom_secp256k1")
1624    }
1625
1626    fn verify_secp256k1(
1627        &self,
1628        key_offset: MemPtr,
1629        key_length: MemLength,
1630        message_offset: MemPtr,
1631        message_length: MemLength,
1632        sig_offset: MemPtr,
1633    ) -> i32 {
1634        panic!("Unavailable: verify_secp256k1")
1635    }
1636
1637    fn managed_verify_secp256k1(
1638        &self,
1639        key_handle: i32,
1640        message_handle: i32,
1641        sig_handle: i32,
1642    ) -> i32 {
1643        panic!("Unavailable: managed_verify_secp256k1")
1644    }
1645
1646    fn encode_secp256k1_der_signature(
1647        &self,
1648        r_offset: MemPtr,
1649        r_length: MemLength,
1650        s_offset: MemPtr,
1651        s_length: MemLength,
1652        sig_offset: MemPtr,
1653    ) -> i32 {
1654        panic!("Unavailable: encode_secp256k1_der_signature")
1655    }
1656
1657    fn managed_encode_secp256k1_der_signature(
1658        &self,
1659        r_handle: i32,
1660        s_handle: i32,
1661        sig_handle: i32,
1662    ) -> i32 {
1663        panic!("Unavailable: managed_encode_secp256k1_der_signature")
1664    }
1665
1666    fn add_ec(
1667        &self,
1668        x_result_handle: i32,
1669        y_result_handle: i32,
1670        ec_handle: i32,
1671        fst_point_xhandle: i32,
1672        fst_point_yhandle: i32,
1673        snd_point_xhandle: i32,
1674        snd_point_yhandle: i32,
1675    ) {
1676        panic!("Unavailable: add_ec");
1677    }
1678
1679    fn double_ec(
1680        &self,
1681        x_result_handle: i32,
1682        y_result_handle: i32,
1683        ec_handle: i32,
1684        point_xhandle: i32,
1685        point_yhandle: i32,
1686    ) {
1687        panic!("Unavailable: double_ec");
1688    }
1689
1690    fn is_on_curve_ec(&self, ec_handle: i32, point_xhandle: i32, point_yhandle: i32) -> i32 {
1691        panic!("Unavailable: is_on_curve_ec")
1692    }
1693
1694    fn scalar_base_mult_ec(
1695        &self,
1696        x_result_handle: i32,
1697        y_result_handle: i32,
1698        ec_handle: i32,
1699        data_offset: MemPtr,
1700        length: MemLength,
1701    ) -> i32 {
1702        panic!("Unavailable: scalar_base_mult_ec")
1703    }
1704
1705    fn managed_scalar_base_mult_ec(
1706        &self,
1707        x_result_handle: i32,
1708        y_result_handle: i32,
1709        ec_handle: i32,
1710        data_handle: i32,
1711    ) -> i32 {
1712        panic!("Unavailable: managed_scalar_base_mult_ec")
1713    }
1714
1715    fn scalar_mult_ec(
1716        &self,
1717        x_result_handle: i32,
1718        y_result_handle: i32,
1719        ec_handle: i32,
1720        point_xhandle: i32,
1721        point_yhandle: i32,
1722        data_offset: MemPtr,
1723        length: MemLength,
1724    ) -> i32 {
1725        panic!("Unavailable: scalar_mult_ec")
1726    }
1727
1728    fn managed_scalar_mult_ec(
1729        &self,
1730        x_result_handle: i32,
1731        y_result_handle: i32,
1732        ec_handle: i32,
1733        point_xhandle: i32,
1734        point_yhandle: i32,
1735        data_handle: i32,
1736    ) -> i32 {
1737        panic!("Unavailable: managed_scalar_mult_ec")
1738    }
1739
1740    fn marshal_ec(
1741        &self,
1742        x_pair_handle: i32,
1743        y_pair_handle: i32,
1744        ec_handle: i32,
1745        result_offset: MemPtr,
1746    ) -> i32 {
1747        panic!("Unavailable: marshal_ec")
1748    }
1749
1750    fn managed_marshal_ec(
1751        &self,
1752        x_pair_handle: i32,
1753        y_pair_handle: i32,
1754        ec_handle: i32,
1755        result_handle: i32,
1756    ) -> i32 {
1757        panic!("Unavailable: managed_marshal_ec")
1758    }
1759
1760    fn marshal_compressed_ec(
1761        &self,
1762        x_pair_handle: i32,
1763        y_pair_handle: i32,
1764        ec_handle: i32,
1765        result_offset: MemPtr,
1766    ) -> i32 {
1767        panic!("Unavailable: marshal_compressed_ec")
1768    }
1769
1770    fn managed_marshal_compressed_ec(
1771        &self,
1772        x_pair_handle: i32,
1773        y_pair_handle: i32,
1774        ec_handle: i32,
1775        result_handle: i32,
1776    ) -> i32 {
1777        panic!("Unavailable: managed_marshal_compressed_ec")
1778    }
1779
1780    fn unmarshal_ec(
1781        &self,
1782        x_result_handle: i32,
1783        y_result_handle: i32,
1784        ec_handle: i32,
1785        data_offset: MemPtr,
1786        length: MemLength,
1787    ) -> i32 {
1788        panic!("Unavailable: unmarshal_ec")
1789    }
1790
1791    fn managed_unmarshal_ec(
1792        &self,
1793        x_result_handle: i32,
1794        y_result_handle: i32,
1795        ec_handle: i32,
1796        data_handle: i32,
1797    ) -> i32 {
1798        panic!("Unavailable: managed_unmarshal_ec")
1799    }
1800
1801    fn unmarshal_compressed_ec(
1802        &self,
1803        x_result_handle: i32,
1804        y_result_handle: i32,
1805        ec_handle: i32,
1806        data_offset: MemPtr,
1807        length: MemLength,
1808    ) -> i32 {
1809        panic!("Unavailable: unmarshal_compressed_ec")
1810    }
1811
1812    fn managed_unmarshal_compressed_ec(
1813        &self,
1814        x_result_handle: i32,
1815        y_result_handle: i32,
1816        ec_handle: i32,
1817        data_handle: i32,
1818    ) -> i32 {
1819        panic!("Unavailable: managed_unmarshal_compressed_ec")
1820    }
1821
1822    fn generate_key_ec(
1823        &self,
1824        x_pub_key_handle: i32,
1825        y_pub_key_handle: i32,
1826        ec_handle: i32,
1827        result_offset: MemPtr,
1828    ) -> i32 {
1829        panic!("Unavailable: generate_key_ec")
1830    }
1831
1832    fn managed_generate_key_ec(
1833        &self,
1834        x_pub_key_handle: i32,
1835        y_pub_key_handle: i32,
1836        ec_handle: i32,
1837        result_handle: i32,
1838    ) -> i32 {
1839        panic!("Unavailable: managed_generate_key_ec")
1840    }
1841
1842    fn create_ec(&self, data_offset: MemPtr, data_length: MemLength) -> i32 {
1843        panic!("Unavailable: create_ec")
1844    }
1845
1846    fn managed_create_ec(&self, data_handle: i32) -> i32 {
1847        panic!("Unavailable: managed_create_ec")
1848    }
1849
1850    fn get_curve_length_ec(&self, ec_handle: i32) -> i32 {
1851        panic!("Unavailable: get_curve_length_ec")
1852    }
1853
1854    fn get_priv_key_byte_length_ec(&self, ec_handle: i32) -> i32 {
1855        panic!("Unavailable: get_priv_key_byte_length_ec")
1856    }
1857
1858    fn elliptic_curve_get_values(
1859        &self,
1860        ec_handle: i32,
1861        field_order_handle: i32,
1862        base_point_order_handle: i32,
1863        eq_constant_handle: i32,
1864        x_base_point_handle: i32,
1865        y_base_point_handle: i32,
1866    ) -> i32 {
1867        panic!("Unavailable: elliptic_curve_get_values")
1868    }
1869
1870    fn is_reserved_function_name(&self, name_handle: i32) -> i32 {
1871        panic!("Unavailable: is_reserved_function_name")
1872    }
1873
1874    fn managed_get_original_caller_addr(&self, destination_handle: i32) {
1875        panic!("Unavailable: managed_get_original_caller_addr")
1876    }
1877
1878    fn managed_get_relayer_addr(&self, destination_handle: i32) {
1879        panic!("Unavailable: managed_get_relayer_addr")
1880    }
1881
1882    fn managed_multi_transfer_esdt_nft_execute_by_user(
1883        &self,
1884        user_handle: i32,
1885        dst_handle: i32,
1886        token_transfers_handle: i32,
1887        gas_limit: i64,
1888        function_handle: i32,
1889        arguments_handle: i32,
1890    ) -> i32 {
1891        panic!("Unavailable: managed_multi_transfer_esdt_nft_execute_by_user")
1892    }
1893
1894    fn managed_verify_secp256r1(
1895        &self,
1896        key_handle: i32,
1897        message_handle: i32,
1898        sig_handle: i32,
1899    ) -> i32 {
1900        panic!("Unavailable: managed_verify_secp256r1")
1901    }
1902    fn managed_verify_blssignature_share(
1903        &self,
1904        key_handle: i32,
1905        message_handle: i32,
1906        sig_handle: i32,
1907    ) -> i32 {
1908        panic!("Unavailable: managed_verify_blssignature_share")
1909    }
1910    fn managed_verify_blsaggregated_signature(
1911        &self,
1912        key_handle: i32,
1913        message_handle: i32,
1914        sig_handle: i32,
1915    ) -> i32 {
1916        panic!("Unavailable: managed_verify_blsaggregated_signature")
1917    }
1918}