From be9498234881ee025ca7669b7ee7712f30aa153e Mon Sep 17 00:00:00 2001 From: Marat <98183742+dungeon-master-666@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:18:54 +0100 Subject: [PATCH] [emulator] Fix emulating on account_none and set account block_lt (#815) * fix acc_deleted emulation case * set account.block_lt --- emulator/emulator-extern.cpp | 17 ++++++++++++++--- emulator/transaction-emulator.cpp | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/emulator/emulator-extern.cpp b/emulator/emulator-extern.cpp index 9f06964e1..f8e2f7241 100644 --- a/emulator/emulator-extern.cpp +++ b/emulator/emulator-extern.cpp @@ -103,6 +103,7 @@ const char *transaction_emulator_emulate_transaction(void *transaction_emulator, td::Ref addr_slice; auto account_slice = vm::load_cell_slice(shard_account.account); + bool account_exists = block::gen::t_Account.get_tag(account_slice) == block::gen::Account::account; if (block::gen::t_Account.get_tag(account_slice) == block::gen::Account::account_none) { if (msg_tag == block::gen::CommonMsgInfo::ext_in_msg_info) { block::gen::CommonMsgInfo::Record_ext_in_msg_info info; @@ -120,12 +121,14 @@ const char *transaction_emulator_emulate_transaction(void *transaction_emulator, } else { ERROR_RESPONSE(PSTRING() << "Only ext in and int message are supported"); } - } else { + } else if (block::gen::t_Account.get_tag(account_slice) == block::gen::Account::account) { block::gen::Account::Record_account account_record; if (!tlb::unpack(account_slice, account_record)) { ERROR_RESPONSE(PSTRING() << "Can't unpack account cell"); } addr_slice = std::move(account_record.addr); + } else { + ERROR_RESPONSE(PSTRING() << "Can't parse account cell"); } ton::WorkchainId wc; ton::StdSmcAddress addr; @@ -139,8 +142,16 @@ const char *transaction_emulator_emulate_transaction(void *transaction_emulator, now = (unsigned)std::time(nullptr); } bool is_special = wc == ton::masterchainId && emulator->get_config().is_special_smartcontract(addr); - if (!account.unpack(vm::load_cell_slice_ref(shard_account_cell.move_as_ok()), now, is_special)) { - ERROR_RESPONSE(PSTRING() << "Can't unpack shard account"); + if (account_exists) { + if (!account.unpack(vm::load_cell_slice_ref(shard_account_cell.move_as_ok()), now, is_special)) { + ERROR_RESPONSE(PSTRING() << "Can't unpack shard account"); + } + } else { + if (!account.init_new(now)) { + ERROR_RESPONSE(PSTRING() << "Can't init new account"); + } + account.last_trans_lt_ = shard_account.last_trans_lt; + account.last_trans_hash_ = shard_account.last_trans_hash; } auto result = emulator->emulate_transaction(std::move(account), message_cell, now, 0, block::transaction::Transaction::tr_ord); diff --git a/emulator/transaction-emulator.cpp b/emulator/transaction-emulator.cpp index 81cf2e9fd..2e8ba0374 100644 --- a/emulator/transaction-emulator.cpp +++ b/emulator/transaction-emulator.cpp @@ -42,6 +42,7 @@ td::Result> TransactionEmu if (!lt) { lt = (account.last_trans_lt_ / block::ConfigInfo::get_lt_align() + 1) * block::ConfigInfo::get_lt_align(); // next block after account_.last_trans_lt_ } + account.block_lt = lt - lt % block::ConfigInfo::get_lt_align(); compute_phase_cfg.libraries = std::make_unique(libraries_); compute_phase_cfg.ignore_chksig = ignore_chksig_;