1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, TokenError>;
7
8#[derive(Debug, Error)]
10pub enum TokenError {
11 #[error("Insufficient balance: required {required}, available {available}")]
13 InsufficientBalance { required: u128, available: u128 },
14
15 #[error("Insufficient stake: required {required}, available {available}")]
17 InsufficientStake { required: u128, available: u128 },
18
19 #[error("Stake is locked until {unlock_time}")]
21 StakeLocked { unlock_time: i64 },
22
23 #[error("Invalid amount: {0}")]
25 InvalidAmount(String),
26
27 #[error("Proposal not found: {proposal_id}")]
29 ProposalNotFound { proposal_id: String },
30
31 #[error("Voting has closed for proposal: {proposal_id}")]
33 VotingClosed { proposal_id: String },
34
35 #[error("Already voted on proposal: {proposal_id}")]
37 AlreadyVoted { proposal_id: String },
38
39 #[error("Quorum not met for proposal: {proposal_id}")]
41 QuorumNotMet { proposal_id: String },
42
43 #[error("Unauthorized: {reason}")]
45 Unauthorized { reason: String },
46
47 #[error("Treasury error: {message}")]
49 TreasuryError { message: String },
50
51 #[error("Storage error: {0}")]
53 StorageError(String),
54
55 #[error("Invalid configuration: {0}")]
57 InvalidConfig(String),
58
59 #[error("Arithmetic overflow in {operation}")]
61 ArithmeticOverflow { operation: String },
62
63 #[error("Invalid address")]
65 InvalidAddress,
66
67 #[error("Asset not found: {asset_id}")]
69 AssetNotFound { asset_id: String },
70
71 #[error("Stake not found for address: {address}")]
73 StakeNotFound { address: String },
74
75 #[error("Minimum stake not met: required {required}, provided {provided}")]
77 MinimumStakeNotMet { required: u128, provided: u128 },
78
79 #[error("Invalid proposal type")]
81 InvalidProposalType,
82
83 #[error("Proposal already executed: {proposal_id}")]
85 ProposalAlreadyExecuted { proposal_id: String },
86
87 #[error("Proposal execution failed for {proposal_id}: {reason}")]
89 ProposalExecutionFailed { proposal_id: String, reason: String },
90
91 #[error("Invalid voting power: must have staked TNZO to vote")]
93 InvalidVotingPower,
94
95 #[error("Invalid parameter: {0}")]
97 InvalidParameter(String),
98
99 #[error("Not found: {0}")]
101 NotFound(String),
102}
103
104impl From<tenzro_storage::StorageError> for TokenError {
105 fn from(err: tenzro_storage::StorageError) -> Self {
106 TokenError::StorageError(err.to_string())
107 }
108}