Skip to main content

hypercall_runtime_api/boundary/
engine.rs

1use hypercall_db::{JournalCommandSummary, JournalFullRecord};
2use hypercall_types::EngineMessage;
3use serde::{Deserialize, Serialize};
4
5/// Deterministic digest of matching-critical engine state.
6#[derive(Clone, Debug, Serialize, Deserialize, utoipa::ToSchema)]
7pub struct EngineStateDigest {
8    pub l2_seq: i64,
9    pub next_order_id: u64,
10    pub next_trade_id: u64,
11    pub overall_digest: String,
12    pub orders_digest: String,
13    pub orders_count: usize,
14    pub positions_digest: String,
15    pub positions_count: usize,
16    pub cash_digest: String,
17    pub cash_wallet_count: usize,
18    pub markets_digest: String,
19    pub expired_instruments_count: usize,
20    pub trading_modes_count: usize,
21    pub prices_digest: String,
22    pub spot_price_count: usize,
23    pub iv_surface_count: usize,
24    pub iv_source_timestamps_digest: String,
25    pub iv_source_timestamp_count: usize,
26    pub perp_positions_digest: String,
27    pub perp_positions_count: usize,
28    pub hypercore_equity_digest: String,
29    pub hypercore_equity_count: usize,
30    pub mmp_digest: String,
31    pub mmp_state_count: usize,
32    pub mmp_enabled_digest: String,
33    pub mmp_enabled_count: usize,
34    pub liquidation_states_digest: String,
35    pub liquidation_state_count: usize,
36    pub wallet_margin_modes_digest: String,
37    pub wallet_margin_mode_count: usize,
38    pub wallet_trading_limits_digest: String,
39    pub wallet_trading_limits_count: usize,
40    pub wallet_tiers_digest: String,
41    pub wallet_tier_count: usize,
42    pub deposit_watermarks_digest: String,
43    pub deposit_watermark_count: usize,
44    pub agent_auth_digest: String,
45    pub agent_auth_count: usize,
46    pub nonce_sets_digest: String,
47    pub nonce_signer_count: usize,
48}
49
50pub trait EngineStateDigestProvider: Send + Sync {
51    fn engine_state_digest(&self) -> EngineStateDigest;
52}
53
54#[async_trait::async_trait]
55pub trait TransactionRequestJournal: Send + Sync {
56    async fn persist_transaction_request(
57        &self,
58        timestamp: u64,
59        command_data: Vec<u8>,
60        message: EngineMessage,
61        request_uuid: uuid::Uuid,
62    ) -> anyhow::Result<()>;
63}
64
65pub trait EngineJournalReader: Send + Sync {
66    fn get_recent(&self, limit: usize) -> anyhow::Result<Vec<JournalCommandSummary>>;
67    fn get_by_request_id(
68        &self,
69        request_id: &uuid::Uuid,
70    ) -> anyhow::Result<Option<JournalFullRecord>>;
71}