use thiserror::Error;
pub type Result<T> = std::result::Result<T, TokenError>;
#[derive(Debug, Error)]
pub enum TokenError {
#[error("Insufficient balance: required {required}, available {available}")]
InsufficientBalance { required: u128, available: u128 },
#[error("Insufficient stake: required {required}, available {available}")]
InsufficientStake { required: u128, available: u128 },
#[error("Stake is locked until {unlock_time}")]
StakeLocked { unlock_time: i64 },
#[error("Invalid amount: {0}")]
InvalidAmount(String),
#[error("Proposal not found: {proposal_id}")]
ProposalNotFound { proposal_id: String },
#[error("Voting has closed for proposal: {proposal_id}")]
VotingClosed { proposal_id: String },
#[error("Already voted on proposal: {proposal_id}")]
AlreadyVoted { proposal_id: String },
#[error("Quorum not met for proposal: {proposal_id}")]
QuorumNotMet { proposal_id: String },
#[error("Unauthorized: {reason}")]
Unauthorized { reason: String },
#[error("Treasury error: {message}")]
TreasuryError { message: String },
#[error("Storage error: {0}")]
StorageError(String),
#[error("Invalid configuration: {0}")]
InvalidConfig(String),
#[error("Arithmetic overflow in {operation}")]
ArithmeticOverflow { operation: String },
#[error("Invalid address")]
InvalidAddress,
#[error("Asset not found: {asset_id}")]
AssetNotFound { asset_id: String },
#[error("Stake not found for address: {address}")]
StakeNotFound { address: String },
#[error("Minimum stake not met: required {required}, provided {provided}")]
MinimumStakeNotMet { required: u128, provided: u128 },
#[error("Invalid proposal type")]
InvalidProposalType,
#[error("Proposal already executed: {proposal_id}")]
ProposalAlreadyExecuted { proposal_id: String },
#[error("Proposal execution failed for {proposal_id}: {reason}")]
ProposalExecutionFailed { proposal_id: String, reason: String },
#[error("Invalid voting power: must have staked TNZO to vote")]
InvalidVotingPower,
#[error("Invalid parameter: {0}")]
InvalidParameter(String),
#[error("Not found: {0}")]
NotFound(String),
}
impl From<tenzro_storage::StorageError> for TokenError {
fn from(err: tenzro_storage::StorageError) -> Self {
TokenError::StorageError(err.to_string())
}
}