| 406 | } |
| 407 | |
| 408 | void ProxyRunner::custom_initialize(td::Promise<td::Unit> promise) { |
| 409 | kv_ = std::make_shared<td::RocksDb>(td::RocksDb::open(db_path_).move_as_ok()); |
| 410 | |
| 411 | std::shared_ptr<RunnerConfig> snapshot_runner_config; |
| 412 | ton::BlockIdExt sc_init_block_id; |
| 413 | |
| 414 | td::Random::secure_bytes(session_unique_hash_.as_slice()); |
| 415 | |
| 416 | { |
| 417 | td::UniqueSlice value = get_from_db("config"); |
| 418 | |
| 419 | if (value.size() > 0) { |
| 420 | auto obj = cocoon::fetch_tl_object<cocoon_api::proxyDb_Config>(value.as_slice(), true).move_as_ok(); |
| 421 | |
| 422 | cocoon_api::downcast_call( |
| 423 | *obj, td::overloaded( |
| 424 | [&](cocoon_api::proxyDb_configEmpty &c) { UNREACHABLE(); }, |
| 425 | [&](cocoon_api::proxyDb_configV4 &c) { |
| 426 | auto conf = RootContractConfig::load_from_tl(*c.root_contract_state_, is_testnet()).move_as_ok(); |
| 427 | |
| 428 | if (conf->version() > runner_config()->root_contract_config->version()) { |
| 429 | set_root_contract_config(std::move(conf), c.root_contract_state_block_ts_); |
| 430 | snapshot_runner_config = runner_config(); |
| 431 | } else { |
| 432 | snapshot_runner_config = std::make_shared<RunnerConfig>(); |
| 433 | snapshot_runner_config->root_contract_config = std::move(conf); |
| 434 | snapshot_runner_config->root_contract_ts = c.root_contract_state_block_ts_; |
| 435 | snapshot_runner_config->is_testnet = runner_config()->is_testnet; |
| 436 | snapshot_runner_config->ton_disabled = runner_config()->ton_disabled; |
| 437 | } |
| 438 | |
| 439 | sc_init_block_id = TonScWrapper::block_id_tl_to_obj(*c.sc_block_id_); |
| 440 | last_saved_state_seqno_ = c.last_seqno_committed_to_blockchain_; |
| 441 | |
| 442 | for (auto &e : c.pending_blockchain_seqno_commits_) { |
| 443 | CHECK(pending_blockchain_seqno_commits_.emplace(e->seqno_, e->session_hash_).second); |
| 444 | } |
| 445 | }, |
| 446 | [&](cocoon_api::proxyDb_configV4Disabled &c) { |
| 447 | auto conf = RootContractConfig::load_from_tl(*c.root_contract_state_, is_testnet()).move_as_ok(); |
| 448 | |
| 449 | if (conf->version() > runner_config()->root_contract_config->version()) { |
| 450 | set_root_contract_config(std::move(conf), c.root_contract_state_block_ts_); |
| 451 | snapshot_runner_config = runner_config(); |
| 452 | } else { |
| 453 | snapshot_runner_config = std::make_shared<RunnerConfig>(); |
| 454 | snapshot_runner_config->root_contract_config = std::move(conf); |
| 455 | snapshot_runner_config->root_contract_ts = c.root_contract_state_block_ts_; |
| 456 | snapshot_runner_config->is_testnet = runner_config()->is_testnet; |
| 457 | snapshot_runner_config->ton_disabled = runner_config()->ton_disabled; |
| 458 | } |
| 459 | |
| 460 | is_disabled_until_version_ = c.disabled_until_version_; |
| 461 | })); |
| 462 | |
| 463 | } else { |
| 464 | snapshot_runner_config = runner_config(); |
| 465 | config_to_db(snapshot_runner_config); |
nothing calls this directly
no test coverage detected