mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Fix skipped action list order (#1036)
* nullify incorrect actions directly in skipped_action_list
This commit is contained in:
parent
94c9fece0d
commit
c2e7278fcd
1 changed files with 5 additions and 6 deletions
|
@ -1837,7 +1837,6 @@ bool Transaction::prepare_action_phase(const ActionPhaseConfig& cfg) {
|
||||||
|
|
||||||
ap.tot_actions = n;
|
ap.tot_actions = n;
|
||||||
ap.spec_actions = ap.skipped_actions = 0;
|
ap.spec_actions = ap.skipped_actions = 0;
|
||||||
std::vector<Ref<vm::Cell>> non_skipped_action_list;
|
|
||||||
for (int i = n - 1; i >= 0; --i) {
|
for (int i = n - 1; i >= 0; --i) {
|
||||||
ap.result_arg = n - 1 - i;
|
ap.result_arg = n - 1 - i;
|
||||||
if (!block::gen::t_OutListNode.validate_ref(ap.action_list[i])) {
|
if (!block::gen::t_OutListNode.validate_ref(ap.action_list[i])) {
|
||||||
|
@ -1853,6 +1852,7 @@ bool Transaction::prepare_action_phase(const ActionPhaseConfig& cfg) {
|
||||||
int mode = (int)cs.fetch_ulong(8);
|
int mode = (int)cs.fetch_ulong(8);
|
||||||
if (mode & 2) {
|
if (mode & 2) {
|
||||||
ap.skipped_actions++;
|
ap.skipped_actions++;
|
||||||
|
ap.action_list[i] = {};
|
||||||
continue;
|
continue;
|
||||||
} else if ((mode & 16) && cfg.bounce_on_fail_enabled) {
|
} else if ((mode & 16) && cfg.bounce_on_fail_enabled) {
|
||||||
ap.bounce = true;
|
ap.bounce = true;
|
||||||
|
@ -1865,14 +1865,13 @@ bool Transaction::prepare_action_phase(const ActionPhaseConfig& cfg) {
|
||||||
LOG(DEBUG) << "invalid action " << ap.result_arg << " found while preprocessing action list: error code "
|
LOG(DEBUG) << "invalid action " << ap.result_arg << " found while preprocessing action list: error code "
|
||||||
<< ap.result_code;
|
<< ap.result_code;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
non_skipped_action_list.push_back(ap.action_list[i]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ap.action_list = std::move(non_skipped_action_list);
|
|
||||||
n -= ap.skipped_actions;
|
|
||||||
ap.valid = true;
|
ap.valid = true;
|
||||||
for (int i = n - 1; i >= 0; --i) {
|
for (int i = n - 1; i >= 0; --i) {
|
||||||
|
if(ap.action_list[i].is_null()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ap.result_arg = n - 1 - i;
|
ap.result_arg = n - 1 - i;
|
||||||
vm::CellSlice cs = load_cell_slice(ap.action_list[i]);
|
vm::CellSlice cs = load_cell_slice(ap.action_list[i]);
|
||||||
CHECK(cs.fetch_ref().not_null());
|
CHECK(cs.fetch_ref().not_null());
|
||||||
|
@ -1910,7 +1909,7 @@ bool Transaction::prepare_action_phase(const ActionPhaseConfig& cfg) {
|
||||||
ap.no_funds = true;
|
ap.no_funds = true;
|
||||||
}
|
}
|
||||||
LOG(DEBUG) << "invalid action " << ap.result_arg << " in action list: error code " << ap.result_code;
|
LOG(DEBUG) << "invalid action " << ap.result_arg << " in action list: error code " << ap.result_code;
|
||||||
// This is reuqired here because changes to libraries are applied even if actipn phase fails
|
// This is required here because changes to libraries are applied even if actipn phase fails
|
||||||
enforce_state_limits();
|
enforce_state_limits();
|
||||||
if (cfg.action_fine_enabled) {
|
if (cfg.action_fine_enabled) {
|
||||||
ap.action_fine = std::min(ap.action_fine, balance.grams);
|
ap.action_fine = std::min(ap.action_fine, balance.grams);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue