use crate::client::relayer::{Accepted, RelayerError};
use crate::trade::Refusal;
use crate::trade::math::OpenRefusal;
use crate::utils::BadWire;
use crate::account::session::KeyState;
use crate::account::store::StoreError;
use crate::account::wallet::WalletError;
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum Error {
#[error("{0}")]
Invalid(String),
#[error(transparent)]
Open(OpenRefusal),
#[error("{0}")]
InsufficientFunds(String),
#[error("the account has not streamed yet")]
NoAccount,
#[error("{}", match .0 {
KeyState::Missing => "enable trading first: no session key",
KeyState::Unregistered => "register the session key first",
KeyState::Ready => "the session key is ready",
})]
NeedsKey(KeyState),
#[error("the wallet is {wallet}, not the account's owner {owner}")]
WrongWallet { wallet: String, owner: String },
#[error(transparent)]
Wallet(WalletError),
#[error("{0}")]
Signature(String),
#[error(transparent)]
Relayer(#[from] RelayerError),
#[error("the relayer answered {}", .0.state)]
NotKept(Accepted),
#[error("Hyperliquid refused the send: {0}")]
Exchange(String),
#[error(transparent)]
Transport(#[from] df_hyperliquid_core::client::TransportError),
#[error(transparent)]
Chain(crate::client::chain::ReadError),
#[error(transparent)]
Precompile(df_hyperliquid_core::client::evm::ReadError),
#[error(transparent)]
Store(#[from] StoreError),
#[error("no randomness: {0}")]
Random(String),
#[error("{0}")]
Decode(String),
}
impl From<BadWire> for Error {
fn from(e: BadWire) -> Self {
Error::Decode(e.to_string())
}
}
impl From<Refusal> for Error {
fn from(e: Refusal) -> Self {
Error::Invalid(e.to_string())
}
}
impl From<OpenRefusal> for Error {
fn from(e: OpenRefusal) -> Self {
Error::Open(e)
}
}
impl From<WalletError> for Error {
fn from(e: WalletError) -> Self {
Error::Wallet(e)
}
}