Skip to main content

hypercall_db/types/
tiers.rs

1//! User tier and rate limit types.
2
3use chrono::NaiveDateTime;
4use hypercall_types::{MarginMode, WalletAddress};
5use serde::{Deserialize, Serialize};
6use struct_convert::Changeset;
7
8/// Per-wallet tier configuration: margin mode, rate limits, position limits.
9///
10/// Generates [`UserTierUpdate`] via `#[derive(Changeset)]` for partial DB updates.
11/// `created_at`/`updated_at` are auto-skipped (DB-managed timestamps).
12#[derive(Debug, Clone, Serialize, Deserialize, Changeset)]
13#[changeset_key = "wallet_address"]
14#[changeset_required = "tier"]
15#[changeset_name = "UserTierUpdate"]
16pub struct UserTierRecord {
17    pub wallet_address: WalletAddress,
18    pub tier: String,
19    pub created_at: Option<NaiveDateTime>,
20    pub updated_at: Option<NaiveDateTime>,
21    /// Typed margin mode. The Diesel adapter converts to/from the DB string
22    /// representation ("standard"/"portfolio") at the persistence boundary.
23    pub margin_mode: MarginMode,
24    /// Monotonic version counter for ordering concurrent tier updates.
25    /// Engine rejects updates with version <= current to prevent stale overwrites.
26    pub version: i64,
27    pub max_open_orders: Option<i32>,
28    pub max_open_positions: i32,
29    pub orders_per_minute: i32,
30    pub cancels_per_minute: i32,
31    pub api_requests_per_minute: i32,
32}
33
34/// Default rate limits for a tier name (before per-wallet overrides).
35#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct TierDefaultsRecord {
37    pub tier: String,
38    pub max_open_orders: i32,
39    pub max_open_positions: i32,
40    pub orders_per_minute: i32,
41    pub cancels_per_minute: i32,
42    pub api_requests_per_minute: i32,
43}