1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Clone, Debug, Deserialize, Error, PartialEq, Eq, Serialize)]
pub enum Error {
#[error("Provided epoch, {0}, does not match expected epoch, {1}")]
IncorrectEpoch(u64, u64),
#[error("block has next round that wraps around: {0}")]
IncorrectRound(u64),
#[error("Provided round, {0}, is incompatible with last voted round, {1}")]
IncorrectLastVotedRound(u64, u64),
#[error("Provided round, {0}, is incompatible with preferred round, {1}")]
IncorrectPreferredRound(u64, u64),
#[error("Unable to verify that the new tree extends the parent: {0}")]
InvalidAccumulatorExtension(String),
#[error("Invalid EpochChangeProof: {0}")]
InvalidEpochChangeProof(String),
#[error("Internal error: {0}")]
InternalError(String),
#[error("No next_epoch_state specified in the provided Ledger Info")]
InvalidLedgerInfo,
#[error("Invalid proposal: {0}")]
InvalidProposal(String),
#[error("Invalid QC: {0}")]
InvalidQuorumCertificate(String),
#[error("{0} is not set, SafetyRules is not initialized")]
NotInitialized(String),
#[error("Data not found in secure storage: {0}")]
SecureStorageMissingDataError(String),
#[error("Unexpected error returned by secure storage: {0}")]
SecureStorageUnexpectedError(String),
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("Validator key not found: {0}")]
ValidatorKeyNotFound(String),
#[error("The validator is not in the validator set. Address not in set: {0}")]
ValidatorNotInSet(String),
#[error("Vote proposal missing expected signature")]
VoteProposalSignatureNotFound,
#[error("Does not satisfy 2-chain voting rule. Round {0}, Quorum round {1}, TC round {2}, HQC round in TC {3}")]
NotSafeToVote(u64, u64, u64, u64),
#[error("Does not satisfy 2-chain timeout rule. Round {0}, Quorum round {1}, TC round {2}, one-chain round {3}")]
NotSafeToTimeout(u64, u64, u64, u64),
#[error("Invalid TC: {0}")]
InvalidTimeoutCertificate(String),
#[error("Inconsistent Execution Result: Ordered BlockInfo doesn't match executed BlockInfo. Ordered: {0}, Executed: {1}")]
InconsistentExecutionResult(String, String),
#[error("Invalid Ordered LedgerInfoWithSignatures: Empty or at least one of executed_state_id, version, or epoch_state are not dummy value: {0}")]
InvalidOrderedLedgerInfo(String),
}
impl From<serde_json::Error> for Error {
fn from(error: serde_json::Error) -> Self {
Self::SerializationError(format!("{}", error))
}
}
impl From<diem_secure_net::Error> for Error {
fn from(error: diem_secure_net::Error) -> Self {
Self::InternalError(error.to_string())
}
}
impl From<diem_secure_storage::Error> for Error {
fn from(error: diem_secure_storage::Error) -> Self {
match error {
diem_secure_storage::Error::PermissionDenied => {
panic!(
"A permission error was thrown: {:?}. Maybe the storage token needs to be renewed?",
error
);
}
diem_secure_storage::Error::KeyVersionNotFound(_, _)
| diem_secure_storage::Error::KeyNotSet(_) => {
Self::SecureStorageMissingDataError(error.to_string())
}
_ => Self::SecureStorageUnexpectedError(error.to_string()),
}
}
}