diff --git a/crypto/smc-envelope/SmartContract.cpp b/crypto/smc-envelope/SmartContract.cpp index 8e95670a..7dbb65e7 100644 --- a/crypto/smc-envelope/SmartContract.cpp +++ b/crypto/smc-envelope/SmartContract.cpp @@ -177,7 +177,9 @@ td::Ref prepare_vm_c7(SmartContract::Args args, td::Ref cod } SmartContract::Answer run_smartcont(SmartContract::State state, td::Ref stack, td::Ref c7, - vm::GasLimits gas, bool ignore_chksig, td::Ref libraries, int vm_log_verbosity, bool debug_enabled) { + vm::GasLimits gas, bool ignore_chksig, td::Ref libraries, + int vm_log_verbosity, bool debug_enabled, + std::shared_ptr config) { auto gas_credit = gas.gas_credit; vm::init_op_cp0(debug_enabled); vm::DictionaryBase::get_empty_dictionary(); @@ -216,6 +218,13 @@ SmartContract::Answer run_smartcont(SmartContract::State state, td::Refget_global_version()); + auto r_limits = config->get_size_limits_config(); + if (r_limits.is_ok()) { + vm.set_max_data_depth(r_limits.ok().max_vm_data_depth); + } + } try { res.code = ~vm.run(); } catch (...) { @@ -304,7 +313,8 @@ SmartContract::Answer SmartContract::run_method(Args args) { args.stack.value().write().push_smallint(args.method_id.unwrap()); auto res = run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig, - args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref{}, args.vm_log_verbosity_level, args.debug_enabled); + args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref{}, + args.vm_log_verbosity_level, args.debug_enabled, args.config ? args.config.value() : nullptr); state_ = res.new_state; return res; } @@ -322,7 +332,8 @@ SmartContract::Answer SmartContract::run_get_method(Args args) const { CHECK(args.method_id); args.stack.value().write().push_smallint(args.method_id.unwrap()); return run_smartcont(get_state(), args.stack.unwrap(), args.c7.unwrap(), args.limits.unwrap(), args.ignore_chksig, - args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref{}, args.vm_log_verbosity_level, args.debug_enabled); + args.libraries ? args.libraries.unwrap().get_root_cell() : td::Ref{}, + args.vm_log_verbosity_level, args.debug_enabled, args.config ? args.config.value() : nullptr); } SmartContract::Answer SmartContract::run_get_method(td::Slice method, Args args) const { diff --git a/emulator/emulator-emscripten.cpp b/emulator/emulator-emscripten.cpp index 66e97f35..dbd1c0d5 100644 --- a/emulator/emulator-emscripten.cpp +++ b/emulator/emulator-emscripten.cpp @@ -61,6 +61,7 @@ struct GetMethodParams { std::string data; int verbosity; td::optional libs; + td::optional prev_blocks_info; std::string address; uint32_t unixtime; uint64_t balance; @@ -91,6 +92,11 @@ td::Result decode_get_method_params(const char* json) { params.libs = libs; } + TRY_RESULT(prev_blocks_info, td::get_json_object_string_field(obj, "prev_blocks_info", true)); + if (prev_blocks_info.size() > 0) { + params.prev_blocks_info = prev_blocks_info; + } + TRY_RESULT(address, td::get_json_object_string_field(obj, "address", false)); params.address = address; @@ -187,12 +193,14 @@ const char *run_get_method(const char *params, const char* stack, const char* co auto tvm = tvm_emulator_create(decoded_params.code.c_str(), decoded_params.data.c_str(), decoded_params.verbosity); if ((decoded_params.libs && !tvm_emulator_set_libraries(tvm, decoded_params.libs.value().c_str())) || - !tvm_emulator_set_c7(tvm, decoded_params.address.c_str(), decoded_params.unixtime, - decoded_params.balance, decoded_params.rand_seed_hex.c_str(), config) || + !tvm_emulator_set_c7(tvm, decoded_params.address.c_str(), decoded_params.unixtime, decoded_params.balance, + decoded_params.rand_seed_hex.c_str(), config) || + (decoded_params.prev_blocks_info && + !tvm_emulator_set_prev_blocks_info(tvm, decoded_params.prev_blocks_info.value().c_str())) || (decoded_params.gas_limit > 0 && !tvm_emulator_set_gas_limit(tvm, decoded_params.gas_limit)) || !tvm_emulator_set_debug_enabled(tvm, decoded_params.debug_enabled)) { - tvm_emulator_destroy(tvm); - return strdup(R"({"fail":true,"message":"Can't set params"})"); + tvm_emulator_destroy(tvm); + return strdup(R"({"fail":true,"message":"Can't set params"})"); } auto res = tvm_emulator_run_get_method(tvm, decoded_params.method_id, stack); diff --git a/emulator/emulator-extern.cpp b/emulator/emulator-extern.cpp index 971cdcdb..885286d5 100644 --- a/emulator/emulator-extern.cpp +++ b/emulator/emulator-extern.cpp @@ -422,7 +422,9 @@ bool tvm_emulator_set_c7(void *tvm_emulator, const char *address, uint32_t unixt LOG(ERROR) << "Can't deserialize config params boc: " << config_params_cell.move_as_error(); return false; } - global_config = std::make_shared(config_params_cell.move_as_ok(), td::Bits256::zero(), block::Config::needWorkchainInfo | block::Config::needSpecialSmc); + global_config = std::make_shared( + config_params_cell.move_as_ok(), td::Bits256::zero(), + block::Config::needWorkchainInfo | block::Config::needSpecialSmc | block::Config::needCapabilities); auto unpack_res = global_config->unpack(); if (unpack_res.is_error()) { LOG(ERROR) << "Can't unpack config params";