@@ -543,6 +543,66 @@ const char *tvm_emulator_run_get_method(void *tvm_emulator, int method_id, const
543
543
return strdup (jb.string_builder ().as_cslice ().c_str ());
544
544
}
545
545
546
+ const char *tvm_emulator_emulate_run_method (uint32_t len, const char *params_boc, int64_t gas_limit) {
547
+ auto params_cell = vm::std_boc_deserialize (td::Slice (params_boc, len));
548
+ if (params_cell.is_error ()) {
549
+ return nullptr ;
550
+ }
551
+ auto params_cs = vm::load_cell_slice (params_cell.move_as_ok ());
552
+ auto code = params_cs.fetch_ref ();
553
+ auto data = params_cs.fetch_ref ();
554
+
555
+ auto stack_cs = vm::load_cell_slice (params_cs.fetch_ref ());
556
+ auto params = vm::load_cell_slice (params_cs.fetch_ref ());
557
+ auto c7_cs = vm::load_cell_slice (params.fetch_ref ());
558
+ auto libs = vm::Dictionary (params.fetch_ref (), 256 );
559
+
560
+ auto method_id = params_cs.fetch_long (32 );
561
+
562
+ td::Ref<vm::Stack> stack;
563
+ if (!vm::Stack::deserialize_to (stack_cs, stack)) {
564
+ return nullptr ;
565
+ }
566
+
567
+ td::Ref<vm::Stack> c7;
568
+ if (!vm::Stack::deserialize_to (c7_cs, c7)) {
569
+ return nullptr ;
570
+ }
571
+
572
+ auto emulator = new emulator::TvmEmulator (code, data);
573
+ emulator->set_vm_verbosity_level (0 );
574
+ emulator->set_gas_limit (gas_limit);
575
+ emulator->set_c7_raw (c7->fetch (0 ).as_tuple ());
576
+ if (libs.is_empty ()) {
577
+ emulator->set_libraries (std::move (libs));
578
+ }
579
+ auto result = emulator->run_get_method (int (method_id), stack);
580
+ delete emulator;
581
+
582
+ vm::CellBuilder stack_cb;
583
+ if (!result.stack ->serialize (stack_cb)) {
584
+ return nullptr ;
585
+ }
586
+
587
+ vm::CellBuilder cb;
588
+ cb.store_long (result.code , 32 );
589
+ cb.store_long (result.gas_used , 64 );
590
+ cb.store_ref (stack_cb.finalize ());
591
+
592
+ auto ser = vm::std_boc_serialize (cb.finalize ());
593
+ if (!ser.is_ok ()) {
594
+ return nullptr ;
595
+ }
596
+ auto sok = ser.move_as_ok ();
597
+
598
+ auto sz = uint32_t (sok.size ());
599
+ char * rn = (char *)malloc (sz + 4 );
600
+ memcpy (rn, &sz, 4 );
601
+ memcpy (rn+4 , sok.data (), sz);
602
+
603
+ return rn;
604
+ }
605
+
546
606
const char *tvm_emulator_send_external_message (void *tvm_emulator, const char *message_body_boc) {
547
607
auto message_body_cell = boc_b64_to_cell (message_body_boc);
548
608
if (message_body_cell.is_error ()) {
0 commit comments