| 778 | } |
| 779 | } |
| 780 | td::actor::Task<td::Unit> BaseRunner::update_root_contract_state() { |
| 781 | root_contract_state_updating_ = true; |
| 782 | SCOPE_EXIT { |
| 783 | root_contract_state_updating_ = false; |
| 784 | }; |
| 785 | |
| 786 | auto res = co_await tonlib_wrapper_.request<tonlib_api::raw_getAccountState>( |
| 787 | ton::create_tl_object<tonlib_api::accountAddress>(root_contract_address_.rserialize(true))); |
| 788 | |
| 789 | LOG(INFO) << "got root contract state with ts=" << res->sync_utime_; |
| 790 | |
| 791 | auto data = res->data_; |
| 792 | int ts = (td::int32)res->sync_utime_; |
| 793 | |
| 794 | auto cell = co_await vm::std_boc_deserialize(data); |
| 795 | |
| 796 | vm::CellSlice cs{vm::NoVm{}, std::move(cell)}; |
| 797 | |
| 798 | auto val = co_await RootContractConfig::load_from_state(cs, is_testnet()); |
| 799 | |
| 800 | LOG_CHECK(val->is_test() == is_test()) << "test mode mismatch"; |
| 801 | |
| 802 | if (runner_config_) { |
| 803 | if (runner_config_->root_contract_config->version() < val->version()) { |
| 804 | set_root_contract_config(std::move(val), ts); |
| 805 | } else if (runner_config_->root_contract_config->version() == val->version()) { |
| 806 | if (runner_config_->root_contract_ts < ts) { |
| 807 | runner_config_->root_contract_ts = ts; |
| 808 | } |
| 809 | } |
| 810 | } else { |
| 811 | set_root_contract_config(std::move(val), ts); |
| 812 | } |
| 813 | co_return td::Unit(); |
| 814 | } |
| 815 | |
| 816 | void BaseRunner::get_private_keys_from_key_manager() { |
| 817 | if (!is_initialized()) { |