1use crate::types::StatusError;
4use chrono::DateTime;
5use std::collections::HashMap;
6use unc_primitives::types::EpochId;
7use unc_primitives::views::{
8 CatchupStatusView, ChainProcessingInfo, EpochValidatorInfo, RequestedStatePartsView,
9 SyncStatusView,
10};
11use unc_primitives::{
12 block_header::ApprovalInner,
13 hash::CryptoHash,
14 sharding::ChunkHash,
15 types::{AccountId, BlockHeight},
16 views::ValidatorInfo,
17};
18
19#[derive(serde::Serialize, serde::Deserialize, Debug)]
20pub struct TrackedShardsView {
21 pub shards_tracked_this_epoch: Vec<bool>,
22 pub shards_tracked_next_epoch: Vec<bool>,
23}
24
25#[derive(serde::Serialize, serde::Deserialize, Debug)]
26pub struct EpochInfoView {
27 pub epoch_id: CryptoHash,
28 pub height: BlockHeight,
29 pub first_block: Option<(CryptoHash, DateTime<chrono::Utc>)>,
30 pub block_producers: Vec<ValidatorInfo>,
31 pub chunk_only_producers: Vec<String>,
32 pub validator_info: Option<EpochValidatorInfo>,
33 pub protocol_version: u32,
34 pub shards_size_and_parts: Vec<(u64, u64, bool)>,
35}
36
37#[derive(serde::Serialize, serde::Deserialize, Debug)]
38pub struct DebugChunkStatus {
39 pub shard_id: u64,
40 pub chunk_hash: ChunkHash,
41 pub chunk_producer: Option<AccountId>,
42 pub gas_used: u64,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub processing_time_ms: Option<u64>,
45}
46
47#[derive(serde::Serialize, serde::Deserialize, Debug)]
48pub struct DebugBlockStatus {
49 pub block_hash: CryptoHash,
50 pub prev_block_hash: CryptoHash,
51 pub block_height: u64,
52 pub block_timestamp: u64,
53 pub block_producer: Option<AccountId>,
54 pub full_block_missing: bool, pub is_on_canonical_chain: bool,
56 pub chunks: Vec<DebugChunkStatus>,
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub processing_time_ms: Option<u64>,
60 pub gas_price_ratio: f64,
61}
62
63#[derive(serde::Serialize, serde::Deserialize, Debug)]
64pub struct MissedHeightInfo {
65 pub block_height: u64,
66 pub block_producer: Option<AccountId>,
67}
68
69#[derive(serde::Serialize, serde::Deserialize, Debug)]
70pub struct DebugBlockStatusData {
71 pub blocks: Vec<DebugBlockStatus>,
72 pub missed_heights: Vec<MissedHeightInfo>,
73 pub head: CryptoHash,
74 pub header_head: CryptoHash,
75}
76
77#[derive(serde::Serialize, Debug, Clone)]
80pub struct ApprovalHistoryEntry {
81 pub parent_height: BlockHeight,
84 pub target_height: BlockHeight,
85 pub approval_creation_time: DateTime<chrono::Utc>,
87 pub timer_started_ago_millis: u64,
89 pub expected_delay_millis: u64,
91}
92
93#[derive(serde::Serialize, Debug, Default, Clone)]
96pub struct ChunkProduction {
97 pub chunk_production_time: Option<DateTime<chrono::Utc>>,
99 pub chunk_production_duration_millis: Option<u64>,
102}
103#[derive(serde::Serialize, Debug, Clone, Default)]
106pub struct BlockProduction {
107 pub approvals: ApprovalAtHeightStatus,
109 pub chunks_collection_time: Vec<ChunkCollection>,
112 pub block_production_time: Option<DateTime<chrono::Utc>>,
114 pub block_included: bool,
116}
117
118#[derive(serde::Serialize, Debug, Clone)]
119pub struct ChunkCollection {
120 pub chunk_producer: AccountId,
122 pub received_time: Option<DateTime<chrono::Utc>>,
125 pub chunk_included: bool,
127}
128
129#[derive(serde::Serialize, Debug, Default)]
133pub struct ProductionAtHeight {
134 pub block_production: Option<BlockProduction>,
137 pub chunk_production: HashMap<u64, ChunkProduction>,
139}
140
141#[derive(serde::Serialize, Debug, Default, Clone)]
143pub struct ApprovalAtHeightStatus {
144 pub approvals: HashMap<AccountId, (ApprovalInner, DateTime<chrono::Utc>)>,
146 pub ready_at: Option<DateTime<chrono::Utc>>,
148}
149
150#[derive(serde::Serialize, Debug)]
151pub struct ValidatorStatus {
152 pub validator_name: Option<AccountId>,
153 pub shards: u64,
155 pub head_height: u64,
157 pub validators: Option<Vec<(AccountId, u64)>>,
159 pub approval_history: Vec<ApprovalHistoryEntry>,
161 pub production: Vec<(BlockHeight, ProductionAtHeight)>,
165 pub banned_chunk_producers: Vec<(EpochId, Vec<AccountId>)>,
167}
168
169#[derive(Debug)]
171pub enum DebugStatus {
172 SyncStatus,
174 TrackedShards,
176 EpochInfo,
178 BlockStatus(Option<BlockHeight>),
180 ValidatorStatus,
182 CatchupStatus,
184 ChainProcessingStatus,
186 RequestedStateParts,
188}
189
190impl actix::Message for DebugStatus {
191 type Result = Result<DebugStatusResponse, StatusError>;
192}
193
194#[derive(serde::Serialize, Debug)]
195pub enum DebugStatusResponse {
196 SyncStatus(SyncStatusView),
197 CatchupStatus(Vec<CatchupStatusView>),
198 TrackedShards(TrackedShardsView),
199 EpochInfo(Vec<EpochInfoView>),
201 BlockStatus(DebugBlockStatusData),
203 ValidatorStatus(ValidatorStatus),
205 ChainProcessingStatus(ChainProcessingInfo),
207 RequestedStateParts(Vec<RequestedStatePartsView>),
209}