mod apply;
pub mod closed;
mod fields;
pub mod funds;
pub mod operation;
mod patch;
pub mod position;
mod snapshot;
pub use closed::{ClosedPosition, Outcome};
pub use funds::{Funds, Lifetime, Paper};
pub use operation::{Operation, OperationKind};
pub use position::Position;
use df_hyperliquid_core::utils::Address;
use crate::utils::wire::BadWire;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Account {
pub address: Address,
pub account_revision: u64,
pub indexed_through_block: u64,
pub wallet_revision: u64,
pub indexed_through_timestamp: u64,
pub session_keys: Vec<(Address, u64)>,
pub queue_revision: u128,
pub balance: u128,
pub queued: u128,
pub locked: u128,
pub funds: Funds,
pub queue_node_count: u64,
pub consumable_debt: u128,
pub paper: Paper,
pub lifetime: Lifetime,
pub operations: Vec<Operation>,
pub positions: Vec<Position>,
pub closed: Vec<ClosedPosition>,
pub outcomes: Vec<([u8; 32], Outcome)>,
}
#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum AccountError {
#[error(transparent)]
Wire(#[from] BadWire),
#[error("the account stream is out of sync: {0}")]
OutOfSync(&'static str),
#[error("the frame is for {found}, not {expected}")]
OtherWallet { expected: Address, found: Address },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Applied {
Snapshot,
Patch,
Stale,
}
impl Account {
#[must_use]
pub fn session_expiry(&self, key: Address) -> Option<u64> {
self.session_keys.iter().find(|(address, _)| *address == key).map(|(_, expiry)| *expiry)
}
#[must_use]
pub const fn has_deposited(&self) -> bool {
self.lifetime.deposited > 0
}
}