openmina_producer_dashboard/
producer_dashboard.rs

1use openmina_node_account::AccountSecretKey;
2use openmina_producer_dashboard::{
3    archive::watchdog::ArchiveWatchdog,
4    config,
5    evaluator::{EpochInit, Evaluator},
6    node::{watchdog::spawn_watchdog, Node},
7    rpc,
8    storage::db_sled::Database,
9    NodeStatus,
10};
11
12use tokio::sync::mpsc;
13
14use clap::Parser;
15
16#[tokio::main]
17async fn main() {
18    let config = config::Config::parse();
19
20    let db = Database::open(config.database_path).expect("Failed to open Database");
21    println!("[main] DB opened");
22
23    let password = std::env::var("MINA_PRIVKEY_PASS")
24        .expect("Expected password in the variable `MINA_PRIVKEY_PASS`");
25
26    let key = AccountSecretKey::from_encrypted_file(config.private_key_path, &password)
27        .expect("failed to decrypt secret key file");
28    println!("[main] Producer key loaded");
29
30    let (sender, receiver) = mpsc::unbounded_channel::<EpochInit>();
31
32    let evaluator_handle = Evaluator::spawn_new(key.clone(), db.clone(), receiver);
33    println!("[main] Evaluator created");
34    let node_status = NodeStatus::default();
35    let node = Node::new(config.node_url);
36    let node_watchdog = spawn_watchdog(
37        node,
38        node_status.clone(),
39        db.clone(),
40        sender,
41        key.public_key().to_string(),
42    );
43    println!("[main] Node watchdog created");
44    let archive_watchdog = ArchiveWatchdog::spawn_new(
45        db.clone(),
46        key.public_key().to_string(),
47        node_status.clone(),
48    );
49    println!("[main] Archive watchdog created");
50
51    let rpc_handle = rpc::spawn_rpc_server(
52        3000,
53        db.clone(),
54        node_status.clone(),
55        key.public_key().to_string(),
56    );
57    println!("[main] RPC server created");
58
59    let mut signal_stream =
60        tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
61            .expect("Unable to handle SIGTERM");
62
63    tokio::select! {
64        s = tokio::signal::ctrl_c() => {
65            s.expect("Failed to listen for ctrl-c event");
66            println!("Ctrl-c or SIGINT received!");
67        }
68        _ = signal_stream.recv() => {
69            println!("SIGTERM received!");
70        }
71    }
72
73    drop(archive_watchdog);
74    drop(rpc_handle);
75    drop(node_watchdog);
76    drop(evaluator_handle);
77    println!("Shutdown successfull");
78}